...

Teeda再考 - 使い方から拡張方法まで -

by user

on
Category: Documents
123

views

Report

Comments

Transcript

Teeda再考 - 使い方から拡張方法まで -
Seasar Conference
2008 Autumn
Teeda再考
Teeda
再考~使い方から拡張方法まで~
株式会社Abb 代表取締役
株式会社Abby
米林 正明
Seasar Conference
2008 Autumn
© The Seasar Foundation and the others 2008. all rights reserved.
1
自己紹介
• 名前
米林 正明(id:yone098)
• 所属
株式会社Abby
社員募集中(ちょっとでも興味あれば是非)
・Blog
よねのはてな
http://d.hatena.ne.jp/yone098/
p // a a
jp/y
/
Seasar Conference
2008 Autumn
© The Seasar Foundation and the others 2008. all rights reserved.
2
自己紹介
• コミッタ活動
Teedaコミッタ
S2JSFプロジェクトリーダー
• Teedaの執筆活動
執筆活動
JavaExpert#01 特集2
JavaExpert#02 特集1
現在Teeda本執筆中
Seasar Conference
2008 Autumn
© The Seasar Foundation and the others 2008. all rights reserved.
3
アジェンダ
• Teedaとは
–JSFとは
JS とは
• Teedaの特徴
• TeedaAjax
• 再考と嵌りどころ
• Teedaの拡張
• Teedaの今後
Seasar Conference
2008 Autumn
© The Seasar Foundation and the others 2008. all rights reserved.
4
アジェンダ
~初めに~
本日のセッションは真面目です。
悪しき習慣である内輪ウケ狙いは一切しません。
Teeda再考とTeeda最高の駄洒落も無いです。
Teeda再考とTeeda最高の駄洒落も無いです
皆さまにお伝えしたいことが多いため(173ページ)
全般的に少し駆け足になることをご了承ください。
Seasar Conference
2008 Autumn
© The Seasar Foundation and the others 2008. all rights reserved.
5
Teedaとは
Teeda
とは
Teedaとは
Seasar Conference
2008 Autumn
© The Seasar Foundation and the others 2008. all rights reserved.
6
てぃーだ
てぃ
だ
沖縄の言葉で
「太陽」
Seasar Conference
2008 Autumn
© The Seasar Foundation and the others 2008. all rights reserved.
7
Java
Webアプリケーション
Webアプリケ
シ ン
フレームワーク
Seasar Conference
2008 Autumn
© The Seasar Foundation and the others 2008. all rights reserved.
8
HTML
テンプレート
Seasar Conference
2008 Autumn
© The Seasar Foundation and the others 2008. all rights reserved.
9
コンセプト
JSF meets
DI x AOP
Seasar Conference
2008 Autumn
© The Seasar Foundation and the others 2008. all rights reserved.
10
JSFとは
S とは
Seasar Conference
2008 Autumn
© The Seasar Foundation and the others 2008. all rights reserved.
11
JJava
ava
Server
Faces
Seasar Conference
2008 Autumn
© The Seasar Foundation and the others 2008. all rights reserved.
12
JSFとは
S と
あくまで仕様
く
様
Seasar Conference
2008 Autumn
© The Seasar Foundation and the others 2008. all rights reserved.
13
Sun Microsystemsが提案し
JSR 127で仕様を策定したもの
JSR-127で仕様を策定したもの
仕様だけあ て実装はない
仕様だけあって実装はない
Seasar Conference
2008 Autumn
© The Seasar Foundation and the others 2008. all rights reserved.
14
JSF実装
M Faces
MyFaces
※2008/08/30 Core1
Core1.2.4
2 4 Release
(the JSF RI)
Mojarra
M
j
※2008/07/02にRelease
Seasar Conference
2008 Autumn
© The Seasar Foundation and the others 2008. all rights reserved.
15
日本に
本に
JSF実装は無い
実装 無
Seasar Conference
2008 Autumn
© The Seasar Foundation and the others 2008. all rights reserved.
16
ま 私が
まだ私が
若かった頃
Seasar Conference
2008 Autumn
© The Seasar Foundation and the others 2008. all rights reserved.
17
一句
ないのなら
作ってみよう
日本初
米林一茶
米林
茶
Seasar Conference
2008 Autumn
© The Seasar Foundation and the others 2008. all rights reserved.
18
Teedaは
日本初JSF実装
初
実装
Seasar Conference
2008 Autumn
© The Seasar Foundation and the others 2008. all rights reserved.
19
Teedaの構成
T
d の構成
・Teeda
Teeda Core
・Teeda
Teeda Extention
・Teeda Ajax
j
Seasar Conference
2008 Autumn
© The Seasar Foundation and the others 2008. all rights reserved.
20
T d Core
Teeda
C
・JSF1.1実装
JSF1.1実装
・JSFコンポーネント管理に
S
Seasar2を利用
2を利用
Seasar Conference
2008 Autumn
© The Seasar Foundation and the others 2008. all rights reserved.
21
T d Extention
Teeda
E t ti
・Teeda
Teeda Coreをベースに
Coreを
スに
HTMLと規約に基づいた
拡張を提供
Seasar Conference
2008 Autumn
© The Seasar Foundation and the others 2008. all rights reserved.
22
T d Ajax
Teeda
Aj
・Ajaxに特化したライブラリ
Ajaxに特化したライブラリ
で独立して利用すること
も可能
Seasar Conference
2008 Autumn
© The Seasar Foundation and the others 2008. all rights reserved.
23
まとめ
まとめ
TeedaはJSF実装であり
T
d はJSF実装であり
DIとAOP機能にSeasar
を使ったフレ ムワ ク
を使ったフレームワーク
Seasar Conference
2008 Autumn
© The Seasar Foundation and the others 2008. all rights reserved.
24
Teedaの特徴
Teeda
の特徴
Teedaの特徴
Seasar Conference
2008 Autumn
© The Seasar Foundation and the others 2008. all rights reserved.
25
1.
1
2
2.
3
3.
4
4.
5.
6.
HTMLテンプレート
HTMLテンプレ
ト
PRGパタ ン
PRGパターン
レスコンフィグレーション
SMART Deploy
ライフサイクル
多機能
Seasar Conference
2008 Autumn
© The Seasar Foundation and the others 2008. all rights reserved.
26
Teedaの特徴
HTMLテンプレ
HTMLテンプレート
プ
ト
Seasar Conference
2008 Autumn
© The Seasar Foundation and the others 2008. all rights reserved.
27
Page駆動開発
g 駆動開発
HTMLを中心に
開発するスタイル
Seasar Conference
2008 Autumn
© The Seasar Foundation and the others 2008. all rights reserved.
28
やり方
HTMLに対応する
Pageクラス作成
Seasar Conference
2008 Autumn
© The Seasar Foundation and the others 2008. all rights reserved.
29
Eclipseプラグインである
D l
Doltengを使えば
を使えば
HTML右クリック一発で
右クリック 発で
Pageクラス作成可能
Seasar Conference
2008 Autumn
© The Seasar Foundation and the others 2008. all rights reserved.
30
急 ば回
急がば回れ
Teedaを理解するために
あえてDoltengは使わない
Seasar Conference
2008 Autumn
© The Seasar Foundation and the others 2008. all rights reserved.
31
重要
HTMLのid
Pageクラスの
プロパティ
Seasar Conference
2008 Autumn
© The Seasar Foundation and the others 2008. all rights reserved.
32
【Pageクラス作成】
POJOを作るだけ
作
け
Seasar Conference
2008 Autumn
© The Seasar Foundation and the others 2008. all rights reserved.
33
【Pageクラス命名規則】
HTML名の先頭を大文字にして
Pageというサフィックスをつける
test html→TestPage java
test.html→TestPage.java
Seasar Conference
2008 Autumn
© The Seasar Foundation and the others 2008. all rights reserved.
34
【Pageクラス作成】
単純明快
Seasar Conference
2008 Autumn
© The Seasar Foundation and the others 2008. all rights reserved.
35
【test.html】
<body>
<form id=“testForm”>
<input type=“text” id=“arg1” />
<input type=“text” id=“arg2” />
<input type=“submit”
<input type=
submit id=
id=“doExec”
doExec />
</form>
</body>
Seasar Conference
2008 Autumn
© The Seasar Foundation and the others 2008. all rights reserved.
36
【TestPage.java】
public class TestPage {
public String arg1;
public String arg2;
public String arg2;
p
public Class doExec() {
() {
}
}
Seasar Conference
2008 Autumn
© The Seasar Foundation and the others 2008. all rights reserved.
37
HTMLテンプレートのまとめ
HTML
テンプレートのまとめ
入力項目や
ボタンのアクションは
HTMLのidにより
P
Pageクラスと関連付け
クラスと関連付け
Seasar Conference
2008 Autumn
© The Seasar Foundation and the others 2008. all rights reserved.
38
Teedaの特徴
Teeda
の特徴
Teedaの特徴
PRGパターン
Seasar Conference
2008 Autumn
© The Seasar Foundation and the others 2008. all rights reserved.
39
JSF
forwardベ ス
forwardベース
アーキテクチャ
Seasar Conference
2008 Autumn
© The Seasar Foundation and the others 2008. all rights reserved.
40
Seasar Conference
2008 Autumn
© The Seasar Foundation and the others 2008. all rights reserved.
41
PRGパタ ンとは?
PRGパターンとは?
POST
REDIRECT
GET
Seasar Conference
2008 Autumn
© The Seasar Foundation and the others 2008. all rights reserved.
42
Seasar Conference
2008 Autumn
© The Seasar Foundation and the others 2008. all rights reserved.
43
【PRGパタ ンのメリット】
【PRGパターンのメリット】
・ブラウザのリロードによる
ブラウザのリロ ドによる
予期せぬ更新を防げる
・ブラウザの戻るボタン対応
ブラウザの戻るボタン対応
・表示されるURLがずれない
表示されるURLがずれない
Seasar Conference
2008 Autumn
© The Seasar Foundation and the others 2008. all rights reserved.
44
Teedaの特徴
Teeda
の特徴
Teedaの特徴
レス ンフ グレ シ ン
レスコンフィグレーション
Seasar Conference
2008 Autumn
© The Seasar Foundation and the others 2008. all rights reserved.
45
【レスコンフィグレ ション】
【レスコンフィグレーション】
Struts struts‐config.xml
Struts:struts
JSF:faces‐config.xml
Teeda:
遷移先の設定を書かない
Seasar Conference
2008 Autumn
© The Seasar Foundation and the others 2008. all rights reserved.
46
リンクでのペ ジ遷移
リンクでのページ遷移
< id
<a
id=“goList”>一覧</a>
Li t”> 覧</ >
li t ht lへ
list.htmlへ
Seasar Conference
2008 Autumn
© The Seasar Foundation and the others 2008. all rights reserved.
47
メソッドによるペ ジ遷移
メソッドによるページ遷移
return
t
Li tP
ListPage.class
l
list.htmlへ
Seasar Conference
2008 Autumn
© The Seasar Foundation and the others 2008. all rights reserved.
48
コンポーネント登録
コンポ
ネント登録
ル トパッケ ジ登録のみ
ルートパッケージ登録のみ
<initMethod
name= addRootPackageName >
name="addRootPackageName">
<arg>"jp.co.abby.demo"</arg>
</initMethod>
/i itM th d
Seasar Conference
2008 Autumn
© The Seasar Foundation and the others 2008. all rights reserved.
49
Teedaの特徴
Teeda
の特徴
Teedaの特徴
SMART Deploy
S
ep oy
Seasar Conference
2008 Autumn
© The Seasar Foundation and the others 2008. all rights reserved.
50
Seasar2 4の機能
Seasar2.4の機能
Tomcat等のWebコンテナ
T
t等のW bコンテナ
を起動したまま画面の追加
起動
追加
変更を行い即座に確認可能
Seasar Conference
2008 Autumn
© The Seasar Foundation and the others 2008. all rights reserved.
51
便利だけど
はまると
難しい><
難
Seasar Conference
2008 Autumn
© The Seasar Foundation and the others 2008. all rights reserved.
52
Teedaでの
はまりパタ ン
はまりパターン
Seasar Conference
2008 Autumn
© The Seasar Foundation and the others 2008. all rights reserved.
53
嵌りパターン
COOL Deploy時
Pageクラスの
メソッドが呼ばれない
Seasar Conference
2008 Autumn
© The Seasar Foundation and the others 2008. all rights reserved.
54
嵌りパターン確認個所
Pageクラスを継承した際
親クラスが抽象クラスじゃ
ないと正しく登録されない
public abstract XxxPage
Seasar Conference
2008 Autumn
© The Seasar Foundation and the others 2008. all rights reserved.
55
嵌りパターン
独自クラスが
SMART Deploy
対象にならない
Seasar Conference
2008 Autumn
© The Seasar Foundation and the others 2008. all rights reserved.
56
嵌りパターン確認個所
自分でdiconファイルに
登録しているか?
登録した場合、SMART
Deploy対象にならない
Seasar Conference
2008 Autumn
© The Seasar Foundation and the others 2008. all rights reserved.
57
嵌りパターン(補足)
メモリリーク
メモリリ
リリ ク
><
Seasar Conference
2008 Autumn
© The Seasar Foundation and the others 2008. all rights reserved.
58
嵌りパターン確認個所
以下の記述がないか?
S2Container container;
S2Container
container;
container = S2ContainerFactory.create(DICON
y
(
_PATH);
);
container.init();
リクエストの度にコンテナ生成することは
やってはいけません
Seasar Conference
2008 Autumn
© The Seasar Foundation and the others 2008. all rights reserved.
59
嵌りパターン確認個所
どうしても特殊な場合
public String previousViewId;
String previousViewId;
public S2Container container;
public NamingConvention namingConvention;
p
g
g
;
String pageName = namingConvention
.fromPathToPageName(previousViewId);
Object previousPage =
container.getComponent(pageName);
S2ContanerをDIしてもらう
Seasar Conference
2008 Autumn
© The Seasar Foundation and the others 2008. all rights reserved.
60
嵌りパターン(補足)
別アプローチ
Seasar Conference
2008 Autumn
© The Seasar Foundation and the others 2008. all rights reserved.
61
一句
はまるなら
外してみよう
新機能
米林一茶
米林
茶
Seasar Conference
2008 Autumn
© The Seasar Foundation and the others 2008. all rights reserved.
62
Teedaの特徴
Teeda
の特徴
Teedaの特徴
ライフサイクル
Seasar Conference
2008 Autumn
© The Seasar Foundation and the others 2008. all rights reserved.
63
JSFに密接
Seasar Conference
2008 Autumn
© The Seasar Foundation and the others 2008. all rights reserved.
64
JSFは難しいから
一旦
旦 JSFは
頭からはずします
Seasar Conference
2008 Autumn
© The Seasar Foundation and the others 2008. all rights reserved.
65
【6つのフェーズ】
【6つのフ
ズ】
1 ビュー復元
1.ビュー復元
2 リクエスト適用
2.リクエスト適用
3 Validator/Converter適用
3.Validator/Converter適用
4 Pageクラス更新
4.Pageクラス更新
5 PageクラスのAction実行
5.PageクラスのAction実行
6 描画
6.描画
Seasar Conference
2008 Autumn
© The Seasar Foundation and the others 2008. all rights reserved.
66
駆け足
Seasar Conference
2008 Autumn
© The Seasar Foundation and the others 2008. all rights reserved.
67
ビュー復元(RestoreView)フェーズ
復元(
)
・Pageの状態復元
・ポストバック機能の初期化
ポストバ ク機能 初期化
・スコープ管理機能
管 機能
・中間モデルの復元
Seasar Conference
2008 Autumn
© The Seasar Foundation and the others 2008. all rights reserved.
68
リクエスト適用(ApplyRequestValues)フェ ズ
リクエスト適用(ApplyRequestValues)フェーズ
・UIコンポーネントに
リク スト内容を適用
リクエスト内容を適用
Seasar Conference
2008 Autumn
© The Seasar Foundation and the others 2008. all rights reserved.
69
Validator/Converter適用
(P
(ProcessValidations)フェーズ
V lid i
)
ズ
・Converterの起動
Converterの起動
・Validatorの起動
・UIコンポーネント内での
UI ンポ ネント内での
値の持ち替え
Seasar Conference
2008 Autumn
© The Seasar Foundation and the others 2008. all rights reserved.
70
Page更新(UpdateModelValues)フェ ズ
Page更新(UpdateModelValues)フェーズ
・Pageクラスの
Pageクラスの
プロパティ更新
Seasar Conference
2008 Autumn
© The Seasar Foundation and the others 2008. all rights reserved.
71
PageクラスAction実行(InvokeApplications)フェ ズ
PageクラスAction実行(InvokeApplications)フェーズ
・Pageクラスのdoメソッドの実行
Pageクラスのdoメソッドの実行
・戻り値による遷移先の自動判別
値に
遷移先 自動判別
・Pageクラスのプロパティを保存
Seasar Conference
2008 Autumn
© The Seasar Foundation and the others 2008. all rights reserved.
72
描画(R d R
描画(RenderResponse)フェーズ
)フ
ズ
・initializeメソッド(初回のみ)
i iti li メソ ド(初回のみ)
・prerenderメソッド(毎回)
・レスポンス描画
Seasar Conference
2008 Autumn
© The Seasar Foundation and the others 2008. all rights reserved.
73
フェーズとか難しいので
フェ
ズとか難しいので
Teedaライフサイクルのまとめ
1.HTMLにアクセス
2 Teedaの処理開始
2.Teedaの処理開始
3.リクエスト値の変換と入力チェック
4.Pageクラスにリクエスト値を反映
5 Pageクラスのメソッドを順に実行
5.Pageクラスのメソッドを順に実行
initialize->doXxx->prerender
Seasar Conference
2008 Autumn
© The Seasar Foundation and the others 2008. all rights reserved.
74
Teedaの特徴
Teeda
の特徴
Teedaの特徴
Seasar Conference
2008 Autumn
© The Seasar Foundation and the others 2008. all rights reserved.
75
多機能 ボタン
ボタン関連
関連
<input type=“button” id=“doHoge” />
doHogeメソッドが呼ばれる
<input type=“button” id=“doOnceHoge” />
doOnceHogeに変えると
ダブルサブミット防止
Seasar Conference
2008 Autumn
© The Seasar Foundation and the others 2008. all rights reserved.
76
多機能 ボタン
バリデーションのボタン指定
指定
<input type=“button” id=“doHoge” />
@Required(target == “doHoge”)
@Required(target
doHoge )
private String arg1;
targetで指定したidのボタン押下時
のみバリデーションが動作
Seasar Conference
2008 Autumn
© The Seasar Foundation and the others 2008. all rights reserved.
77
多機能 ボタン
コンバータのボタン指定
指定
<input type=“button” id=“doHoge” />
@DateTimeConverter(pattern="yyyy/MM/dd"
@DateTimeConverter(pattern=
yyyy/MM/dd ,
target="doHoge")
private Date arg2;
targetで指定したidのボタン押下時
のみコンバータが動作
のみ
ン
タが動作
Seasar Conference
2008 Autumn
© The Seasar Foundation and the others 2008. all rights reserved.
78
TeedaAjax
TeedaAjax
j
Seasar Conference
2008 Autumn
© The Seasar Foundation and the others 2008. all rights reserved.
79
【TeedaAjax】
簡単にPageクラスの
メソッドをAjaxで
ドを
呼び出せる
Seasar Conference
2008 Autumn
© The Seasar Foundation and the others 2008. all rights reserved.
80
TeedaAjax
出来た経緯
Aj が流行 た数年前
Ajaxが流行った数年前
Seasar Conference
2008 Autumn
© The Seasar Foundation and the others 2008. all rights reserved.
81
一句
Teedaでも
呼ばせてみよう
非同期
非同期で
米林一茶
Seasar Conference
2008 Autumn
© The Seasar Foundation and the others 2008. all rights reserved.
82
【AjaxPage java】
【AjaxPage.java】
package teeda.web.test;
public class AjaxPage {
// メソッド名はajaxから始めること
メ
ド名は
から始める と
public String ajaxHello() {
public String ajaxHello() {
return “Hello Ajax!”;
j
;
}
Seasar Conference
2008 Autumn
© The Seasar Foundation and the others 2008. all rights reserved.
83
// 関数名にPageクラスとメソッド名を指定
f
function ajax_ajaxPage_ajaxHello(response) {
i
j
j P
j H ll (
){
alert(response); // HelloAjax!が表示される
( p
); //
j
}
function test() {
Kumu.Ajax.executeTeedaAjax(
ajax_ajaxPage_ajaxHello, []); //callback関数設定
}
<input type=“button”
<input type=
button onclick=
onclick=“test();”
test(); />
/>
Seasar Conference
2008 Autumn
© The Seasar Foundation and the others 2008. all rights reserved.
84
JSの関数名により
呼び出すコンポ ネント解決
呼び出すコンポーネント解決
サブアプリケーション名+”_”
Pageクラス名+”_”
メソッド名
Seasar Conference
2008 Autumn
© The Seasar Foundation and the others 2008. all rights reserved.
85
再考と嵌りどころ
Seasar Conference
2008 Autumn
© The Seasar Foundation and the others 2008. all rights reserved.
86
そもそも
DIは何が
何
嬉しいのか?
嬉し
のか?
Seasar Conference
2008 Autumn
© The Seasar Foundation and the others 2008. all rights reserved.
87
出来た経緯
ロッドジ ンソンがその昔
ロッドジョンソンがその昔
Seasar Conference
2008 Autumn
© The Seasar Foundation and the others 2008. all rights reserved.
88
一句
使いたい
そんなあなたに
インジェクション
ジ クシ
ロッド一茶
Seasar Conference
2008 Autumn
© The Seasar Foundation and the others 2008. all rights reserved.
89
DIの醍醐味
の醍醐味
public class AaaPage {
public
bli HttpSession sessionScope;
Htt S i
i S
public HttpServletRequest requestScope;
public
bli LoginDao loginDao;
L i D l i D
public LoginLogic loginLogic;
}
newせず注入してもらう
Seasar Conference
2008 Autumn
© The Seasar Foundation and the others 2008. all rights reserved.
90
TeedaのDI
aの
public class AaaPage {
public
bli Cookie cookie;
C ki
ki
public Map header;
}
CookieやHTTPヘッダ情報も
Pageクラスに定義するだけ
Seasar Conference
2008 Autumn
© The Seasar Foundation and the others 2008. all rights reserved.
91
スコープ
Seasar Conference
2008 Autumn
© The Seasar Foundation and the others 2008. all rights reserved.
92
従来のWebアプリケ ションス
従来のWebアプリケーションスコープ
プ
・Requestスコープ
R
tス
プ
・Sessionスコープ
Sessionスコ プ
・Applicationスコープ
A li ti ス
プ
Seasar Conference
2008 Autumn
© The Seasar Foundation and the others 2008. all rights reserved.
93
開発者が
setAttributeしたり
removeAttributeしたり
ちょっと不便
Seasar Conference
2008 Autumn
© The Seasar Foundation and the others 2008. all rights reserved.
94
Teeda独自ス
Teeda独自スコープ
プ
・デフォルトスコープ
デフォ ト
プ
・Pageスコ プ
・Pageスコープ
・Redirectスコープ
・SubApplicationスコープ
・SubApplicationスコ
プ
Seasar Conference
2008 Autumn
© The Seasar Foundation and the others 2008. all rights reserved.
95
駆け足
Seasar Conference
2008 Autumn
© The Seasar Foundation and the others 2008. all rights reserved.
96
デ
デフォルトスコープ
Test1PageとTest2Pageで
g
g
同一プロパティを自動で受け継ぐ
動 受 継
【
【条件】
】
・同一サブアプリケーションであること
・inputタグの項目であること
p
Seasar Conference
2008 Autumn
© The Seasar Foundation and the others 2008. all rights reserved.
97
デフォルトスコープ
デフォルトス
プ
サブアプリケーション aaa
○
○
×
サブアプリケーション bbb
Seasar Conference
2008 Autumn
© The Seasar Foundation and the others 2008. all rights reserved.
98
Pageスコープ
同一Pageの間だけ保持
別ページに遷移すると消去
package teeda.web.aaa;
public class AaaPage {
@PageScope
private String message;
private String message;
Seasar Conference
2008 Autumn
© The Seasar Foundation and the others 2008. all rights reserved.
99
Pageスコープ
Pageス
プ
サブアプリケーション aaa
×
×
×
○
サブアプリケーション bbb
Seasar Conference
2008 Autumn
© The Seasar Foundation and the others 2008. all rights reserved.
100
Redirectスコープ
Redirect1回されるまで保持
Redirect後の画面リロードで消去
package teeda.web.aaa;
public class AaaPage {
@RedirectScope
private String message;
private String message;
Seasar Conference
2008 Autumn
© The Seasar Foundation and the others 2008. all rights reserved.
101
Redirectスコープ
Redirectス
プ
サブアプリケーション aaa
△
△
△
△
サブアプリケーション bbb
Seasar Conference
2008 Autumn
© The Seasar Foundation and the others 2008. all rights reserved.
102
SubApplicationスコープ
Teedaのサブアプリケーション単位
ユースケース単位で引き継がれる
単位 引 継が
HTMLにinput項目が無くても引き継ぐ
package teeda.web.aaa;
public class AaaPage {
@SubapplicationScope
private String message;
private String message;
Seasar Conference
2008 Autumn
© The Seasar Foundation and the others 2008. all rights reserved.
103
SubApplicationスコープ
SubApplicationス
プ
サブアプリケーション aaa
○
○
×
○
サブアプリケーション bbb
Seasar Conference
2008 Autumn
© The Seasar Foundation and the others 2008. all rights reserved.
104
コンポ ネントの
コンポーネントの
スコ プを
スコープを
S
Sessionにしたい
i にしたい
Seasar Conference
2008 Autumn
© The Seasar Foundation and the others 2008. all rights reserved.
105
// classにアノテーションを指定するだけ
@Component(instance = InstanceType SESSION)
@Component(instance = InstanceType.SESSION)
public class UserDto implements Serializable {
// 省略
// 省略
}
Seasar Conference
2008 Autumn
© The Seasar Foundation and the others 2008. all rights reserved.
106
開発時に
動作しない時
困ったら
Seasar Conference
2008 Autumn
© The Seasar Foundation and the others 2008. all rights reserved.
107
疑うポイント
・Pageクラスが存在するか?
P
クラスが存在するか?
・FormのidはxxxFormで終わっているか?
F
のidは
F
で終わ ているか?
・エラーが起きていないか?
ラ が起きていないか?
→バリデーション・コンバータ
バリデ シ ン ンバ タ
・PageクラスがS2に登録されている?
P
クラスがS2に登録されている?
・Formがネストしていないか?
F
がネストしていないか?
Seasar Conference
2008 Autumn
© The Seasar Foundation and the others 2008. all rights reserved.
108
調べても分からない場合
zBLOGで現象を書く
zメーリングリストで聞く
メ リングリストで聞く
z2chに書いてみる
2 hに書いてみる
Seasar Conference
2008 Autumn
© The Seasar Foundation and the others 2008. all rights reserved.
109
それでも
解決しな 場合
解決しない場合
Seasar Conference
2008 Autumn
><
© The Seasar Foundation and the others 2008. all rights reserved.
110
1 山手線に乗る
1.山手線に乗る
2.恵比寿駅で降りる
恵 寿駅 降
3 弊社に面接しに来る
3.弊社に面接しに来る
4 弊社に入社→解決
4.弊社に入社→解決
Seasar Conference
2008 Autumn
© The Seasar Foundation and the others 2008. all rights reserved.
111
Teedaの拡張
Seasar Conference
2008 Autumn
© The Seasar Foundation and the others 2008. all rights reserved.
112
鉄板で
今日の目玉
Seasar Conference
2008 Autumn
© The Seasar Foundation and the others 2008. all rights reserved.
113
•
•
•
•
•
•
独自バリデーション・コンバータ作成
独自バリデ
ション・コンバ タ作成
フ
フェーズへの処理差し込み方法
ズ の処理差し込み方法
TeedaAjax拡張(prototype.js/jquery)
SMART Deployを使わない
O lでバリデ シ ン
Ovalでバリデーション
カスタムコンポ ネント作成(Jython)
カスタムコンポーネント作成(Jython)
Seasar Conference
2008 Autumn
© The Seasar Foundation and the others 2008. all rights reserved.
114
駆け足
m(
m(_
( _)m
)
)m
Seasar Conference
2008 Autumn
© The Seasar Foundation and the others 2008. all rights reserved.
115
独自バリデ ション
独自バリデーション
JSFのバリデ タ を拡張して
JSFのバリデーターを拡張して
作成可能です。
作成可能です
ハマりどころも少ない為
りど ろも少な 為
今日は割愛します。
Seasar Conference
2008 Autumn
© The Seasar Foundation and the others 2008. all rights reserved.
116
独自コンバ タ
独自コンバータ
JSFのコンバ タを拡張して
JSFのコンバータを拡張して
作成可能です。
作成可能です
ハマりどころも少ない為
りど ろも少な 為
今日は割愛します。
Seasar Conference
2008 Autumn
© The Seasar Foundation and the others 2008. all rights reserved.
117
フェーズへの処理差し込み方法
処 差し込 方法
JSFのフェーズって難しい><
でもT d で開発すると少し
でもTeedaで開発すると少し
は理解しないと困る場面が…
解し
困 場面
その為にPhaseListenerを作成
Seasar Conference
2008 Autumn
© The Seasar Foundation and the others 2008. all rights reserved.
118
JSFの
JSF
のPhaseListener
public class MyPhaseListener implements PhaseListener {
// フェーズ後に実行されます
public void afterPhase(PhaseEvent event) {
public void
afterPhase(PhaseEvent event) {
System.out.println("# AfterPhase[" + event.getPhaseId() + "]");
}
// フェ
フェーズ前に実行されます
ズ前に実行されます
public void beforePhase(PhaseEvent event) {
System.out.println("# BeforePhase[" + event.getPhaseId() ] );
+ "]");
}
public PhaseId getPhaseId() {
//
//return PhaseId.RENDER_RESPONSE;
_
;
return PhaseId.ANY_PHASE; // 全フェーズ
}
}
Seasar Conference
2008 Autumn
© The Seasar Foundation and the others 2008. all rights reserved.
119
【faces‐config
【faces
config.xml】
xml】
<lifecycle>
<phase‐listener>
teeda.MyPhaseListener
y
</phase‐listener>
</lifecycle>
Seasar Conference
2008 Autumn
© The Seasar Foundation and the others 2008. all rights reserved.
120
Html表示時に出力
# BeforePhase[RESTORE_VIEW:1]
DEBUG 2008-09-06 03:22:24,453 [http-8080-1] クラス
(
(examples.teeda.web.sample.Sample1Page[sample_sample1Page])のコンポーネン
l
d
b
l S
l 1P [
l
l 1P ])の ンポ ネン
ト定義を登録します
# AfterPhase[RESTORE_VIEW:1]
#B
BeforePhase[APPLY_REQUEST_VALUES:2]
f Ph [APPLY REQUEST VALUES 2]
# AfterPhase[APPLY_REQUEST_VALUES:2]
# BeforePhase[PROCESS_VALIDATIONS:3]
# AfterPhase[PROCESS
AfterPhase[PROCESS_VALIDATIONS:3]
VALIDATIONS:3]
# BeforePhase[UPDATE_MODEL_VALUES:4]
# AfterPhase[UPDATE_MODEL_VALUES:4]
# BeforePhase[INVOKE
BeforePhase[INVOKE_APPLICATIONS:5]
APPLICATIONS:5]
# doExecActionが呼ばれたよ
# AfterPhase[INVOKE_APPLICATIONS:5]
# BeforePhase[RENDER
BeforePhase[RENDER_RESPONSE:6]
RESPONSE:6]
# AfterPhase[RENDER_RESPONSE:6]
Seasar Conference
2008 Autumn
© The Seasar Foundation and the others 2008. all rights reserved.
121
TeedaAjaxの拡張
以下のPageクラスのメソッドをコ ル
以下のPageクラスのメソッドをコール
package teeda.web.ajax;
public class AjaxPage {
public String ajaxStartAjax() {
String ajaxStartAjax() {
return "Start Ajax";
}
}
Seasar Conference
2008 Autumn
© The Seasar Foundation and the others 2008. all rights reserved.
122
prototype.jsでTeedaAjax
var test = function(){
function showResponse(res){
$('result') innerHTML res responseText;
$('result').innerHTML = res.responseText;
}
var url = "/teeda‐html‐example/teeda.ajax";
var send_param = "component=ajax_ajaxPage&action=ajaxStartAjax";
var param = {parameters:send_param,
param = {parameters:send param
onComplete:showResponse};
var req = new Ajax.Request(url,param);
};
Seasar Conference
2008 Autumn
© The Seasar Foundation and the others 2008. all rights reserved.
123
jqueryでTeedaAjax
var test = function(){
$.ajax({
url:"./teeda.ajax",
type:"GET",
data:"component=ajax
data:
component=ajax_ajaxPage&action=ajaxStartAjax
ajaxPage&action=ajaxStartAjax",
success:function(data){
$('#result').text(data);
}
});
};
Seasar Conference
2008 Autumn
© The Seasar Foundation and the others 2008. all rights reserved.
124
SMART Deployを使わない
こんな人に向けて
Seasar2 3のAutoRegisterが好き
Seasar2.3のAutoRegisterが好き
AutoRegisterで自分で登録したい!
Seasar Conference
2008 Autumn
© The Seasar Foundation and the others 2008. all rights reserved.
125
Pageクラスを全てAutoRegisterする
AutoNamingクラス作成
作成
public class MyRegistNaming extends AbstractAutoNaming {
protected String makeDefineName(String packageName, String shortClassName) {
N i C
NamingConvention nc = SingletonS2Container
ti
Si l t S2C t i
.getComponent(NamingConvention.class);
for (String viewRoot : nc.getRootPackageNames()) {
String web = nc.getSubApplicationRootPackageName();
String root = viewRoot + "."
i
i
" " + web + ".";
b ""
if (packageName.startsWith(root)) {
String s = packageName.substring(root.length(), packageName
.length());
s = s.replace(".", "_") + "_"
+ StringUtil.decapitalize(shortClassName);
return s;
}
}
return applyRule(shortClassName);
}
}
Seasar Conference
2008 Autumn
© The Seasar Foundation and the others 2008. all rights reserved.
126
app.
app.diconに設定
設定
<component class="org.seasar.framework.container.autoregister.ComponentAutoRegister">
<property name="externalBinding">true</property>
<property name=
externalBinding >true</property>
<property name="instanceDef">
@org.seasar.framework.container.deployer.InstanceDefFactory@REQUEST
</property>
<property name="autoNaming">
<component class="examples.teeda.naming. MyRegistNaming" />
</property>
<initMethod name="addReferenceClass">
<initMethod name=
addReferenceClass >
<arg>@examples.teeda.web.add.AddPage@class</arg>
</initMethod>
<initMethod name="addClassPattern">
<arg>"examples.teeda.web"</arg>
<arg>".*Page"</arg>
</initMethod>
</component>
Seasar Conference
2008 Autumn
© The Seasar Foundation and the others 2008. all rights reserved.
127
Ovalでバリデ ション
Ovalでバリデーション
こんな人に向けて
JSFの影響を受けて コンバートエラー時
JSFの影響を受けて、コンバ
トエラ 時
バリデ ションエラ 時にPageクラスに
バリデーションエラー時にPageクラスに
値が更新されないのが嫌だ。
エラーでもPageクラスのメソッド呼びたい。
Seasar Conference
2008 Autumn
© The Seasar Foundation and the others 2008. all rights reserved.
128
Ovalとは?
OValはJavaで開発された検証フレームワーク
htt // l
http://oval.sourceforge.net/
f
t/
【使い方】アノテーションベース
public class Test { @NotNull @NotEmpty @Length(max=32)
private
i
String name;
i
}
Seasar Conference
2008 Autumn
© The Seasar Foundation and the others 2008. all rights reserved.
129
sample1.html
<form id="sample1Form">
f
id "
l 1F
"
<span id="allMessages"></span>
<input type="text"
p yp
id="arg1"
g //>
<input type="text" id="arg2" />
<input type="submit" value=“teeda“ id="doTeeda"/>
</form>
sample2.html
<form id="sample1Form">
f
d "
l
"
<span id="allMessages"></span>
input type text id
id="arg1"
arg1 //>
<input type="text"
<input type="text" id="arg2" />
<input type="submit" value=“oval“ id="doOval"/>
</form>
Seasar Conference
2008 Autumn
© The Seasar Foundation and the others 2008. all rights reserved.
130
Sample1Page.java
public
bli class
l
S
Sample1Page {
l 1P
{
@Required
public String arg1;
String arg1;
@Length(maximum=2)
public String arg2;
String arg2;
public Class doTeeda() {
System out println("#####
System.out.println(
##### doTeeda[
doTeeda[" + this.arg1 + + this arg1 + "]] [[" + this.arg2 + + this arg2 + "]");
] );
return null;
}
}
arg1がnullだったりarg2が3文字以上でdoTeedaは呼ばれない
g が だったり g が 文字以 で
は呼ばれない
Seasar Conference
2008 Autumn
© The Seasar Foundation and the others 2008. all rights reserved.
131
Sample2Page.java
public class Sample1Page {
@NotNull
public String arg1;
g
@Length(max = 2)
public String arg2;
public Class doOval() {
y
p
(
[
g
][
g
] );
System.out.println("##### doOval[" + this.arg1 + "] [" + this.arg2 + "]");
Validator validator = new Validator();
List<ConstraintViolation> violations = validator.validate(this);
if (violations.size() > 0) {
for (ConstraintViolation c : violations) {
(ConstraintViolation c : violations) {
FacesContext.getCurrentInstance().addMessage(null,
new FacesMessage(null, c.getMessage()));
}
}
return null;
}
}
arg1がnullでもarg2が3文字以上でもdoOvalは呼ばれる
Seasar Conference
2008 Autumn
© The Seasar Foundation and the others 2008. all rights reserved.
132
カスタムコンポ ネント作成
カスタムコンポーネント作成
こんな人に向けて
JSFのカスタムコンポ ネントを作成したい
JSFのカスタムコンポーネントを作成したい
凝ったコンポ ネントが必要
凝ったコンポーネントが必要
Seasar Conference
2008 Autumn
© The Seasar Foundation and the others 2008. all rights reserved.
133
カスタムコンポ ネント作成
カスタムコンポーネント作成
ち
ちょっとだけJSFを
とだけJSFを
意識する必要があります
またJSF><
Seasar Conference
2008 Autumn
© The Seasar Foundation and the others 2008. all rights reserved.
134
一句
ここにきて
に
JSFを
意識する
米林一茶
Seasar Conference
2008 Autumn
© The Seasar Foundation and the others 2008. all rights reserved.
135
カスタムコンポ ネント作成
カスタムコンポーネント作成
現在時刻を表示するコンポーネント
<form id=“testForm”>
<original:now />
</form>
Seasar Conference
2008 Autumn
© The Seasar Foundation and the others 2008. all rights reserved.
136
カスタムコンポ ネント作成
カスタムコンポーネント作成
作るもの
・UIコンポーネント
・Tagクラス
・レンダラ
レンダラ
Seasar Conference
2008 Autumn
© The Seasar Foundation and the others 2008. all rights reserved.
137
カスタムコンポ ネント作成
カスタムコンポーネント作成
設定ファイル
・TLDファイル
・faces-config.xml
Seasar Conference
2008 Autumn
© The Seasar Foundation and the others 2008. all rights reserved.
138
UIコンポ ネント
UIコンポーネント
import javax.faces.component.UIComponentBase;
public class UINow extends UIComponentBase {
public String getFamily() {
public String getFamily() {
return "NowFamily";
}
}
Seasar Conference
2008 Autumn
© The Seasar Foundation and the others 2008. all rights reserved.
139
Tagクラス
import javax.faces.component.UIComponent;
import javax.faces.webapp.UIComponentTag;
public class NowTag extends UIComponentTag {
public String getComponentType() {
bli S i
C
T () {
return "Now";
}
public String getRendererType() {
return "NowRenderer";
return NowRenderer ;
}
}
Seasar Conference
2008 Autumn
© The Seasar Foundation and the others 2008. all rights reserved.
140
レンダラ
import java.util.Date;
import
java util Date;
import java.text.DateFormat;
import java.io.IOException;
import javax.faces.component.UIComponent;
import javax faces context FacesContext;
import javax.faces.context.FacesContext;
import javax.faces.context.ResponseWriter;
import javax.faces.render.Renderer;
public class NowRenderer extends Renderer {
public
class NowRenderer extends Renderer {
public void encodeBegin(
FacesContext context, UIComponent component)
throws IOException {
if ((context null) || (component null)) {
if ((context == null) || (component == null)) {
throw new NullPointerException();
}
DateFormat df = DateFormat.getDateTimeInstance(
D t F
DateFormat.FULL, DateFormat.FULL);
t FULL D t F
t FULL)
ResponseWriter writer = context.getResponseWriter();
writer.write(df.format(new Date()));
}
}
Seasar Conference
2008 Autumn
© The Seasar Foundation and the others 2008. all rights reserved.
141
now.tld
<?xml version=
<?xml
version="1
1.0
0" encoding=
encoding="UTF‐8"
UTF‐8 ?>
?>
<!DOCTYPE taglib
PUBLIC "‐//Sun Microsystems, Inc.//DTD JSP Tag Library 1.2//EN"
http://java.sun.com/dtd/web
sun com/dtd/web‐jsptaglibrary
jsptaglibrary_1_2.dtd
1 2 dtd">>
"http://java
<taglib>
<tlib‐version>1.0</tlib‐version>
jsp version 1.2 /jsp version
<jsp‐version>1.2</jsp‐version>
<short‐name>now</short‐name>
<uri>http://teeda/example</uri>
g
<tag>
<name>now</name>
<tag‐class>examples.teeda.taglib.NowTag</tag‐class>
<body‐content>empty</body‐content>
</tag>
</taglib>
Seasar Conference
2008 Autumn
© The Seasar Foundation and the others 2008. all rights reserved.
142
faces-config.xml
<component>
<component‐type>Now</component‐type>
<component‐class>
examples.teeda.taglib.UINow</component‐class>
</component>
<render kit>
<render‐kit>
<renderer>
<component‐family>NowFamily</component‐family>
<renderer‐type>NowRenderer</renderer‐type>
d
t
N R d
/ d
t
<renderer‐class>
examples.teeda.taglib.NowRenderer</renderer‐class>
p
g
/
</renderer>
</render‐kit>
Seasar Conference
2008 Autumn
© The Seasar Foundation and the others 2008. all rights reserved.
143
使い方
<html xmlns="http://www.w3.org/1999/xhtml" //
/
/
xmlns:original="http://teeda/example"
xml lang "ja" lang "ja">
xml:lang="ja" lang="ja">
<html>
<body>
<form id=“tldForm”>
<original:now />
g
/
</form>
</body>
</html>
このページを表示すると
このペ
ジを表示すると 2008年9月6日 04時27分16秒 JST が表示
Seasar Conference
2008 Autumn
© The Seasar Foundation and the others 2008. all rights reserved.
144
少しノッってきたので
ネタ的に
Jythonで出来るのでは?
Seasar Conference
2008 Autumn
© The Seasar Foundation and the others 2008. all rights reserved.
145
自論
出来ないことはない
Seasar Conference
2008 Autumn
© The Seasar Foundation and the others 2008. all rights reserved.
146
UIコンポ ネント UIHello.py
UIコンポーネント
UIH ll
from javax faces import component
from javax.faces import component
class UIHello(component.UIComponentBase):
d f tF il ( lf)
def getFamily(self):
return "Yone"
Seasar Conference
2008 Autumn
© The Seasar Foundation and the others 2008. all rights reserved.
147
Tagクラス HelloTag.py
from javax.faces import webapp
class HelloTag(webapp.UIComponentTag):
def getComponentType(self):
return "Hello"
def getRendererType(self):
return "HelloRenderer"
HelloRenderer
Seasar Conference
2008 Autumn
© The Seasar Foundation and the others 2008. all rights reserved.
148
レンダラ HelloRenderer.py
HelloRenderer py
from javax.faces import render
import time
class HelloRenderer(render.Renderer):
def encodeBegin(self,
encodeBegin(self context,
context component):
writer = context.responseWriter;
writer write(time ctime(time time()))
writer.write(time.ctime(time.time()))
Seasar Conference
2008 Autumn
© The Seasar Foundation and the others 2008. all rights reserved.
149
記述量
少ない!
少ない!
Seasar Conference
2008 Autumn
© The Seasar Foundation and the others 2008. all rights reserved.
150
tldに追加
<tag>
g
<name>jython</name>
<tag‐class>tags.HelloTag</tag‐class>
y
py
y
<body‐content>empty</body‐content>
</tag>
faces-configに追加
<component>
<component‐type>Hello</component‐type>
<component‐class>tags.UIHello</component‐class>
</component>
/
<renderer>
<component‐family>Yone</component‐family>
<renderer type>HelloRenderer</renderer type>
<renderer‐type>HelloRenderer</renderer‐type>
<renderer‐class>tags.HelloRenderer</renderer‐class>
</renderer>
Seasar Conference
2008 Autumn
© The Seasar Foundation and the others 2008. all rights reserved.
151
使い方
<html xmlns="http://www.w3.org/1999/xhtml" //
/
/
xmlns:original="http://teeda/example"
xml lang "ja" lang "ja">
xml:lang="ja" lang="ja">
<html>
<body>
<form id=“tldForm”>
<original:jython />
g
jy
/
</form>
</body>
</html>
このページを表示すると
このペ
ジを表示すると Fri Sep 6 04:37:16 2008 が表示
Seasar Conference
2008 Autumn
© The Seasar Foundation and the others 2008. all rights reserved.
152
意外に出来る
Jythonで
カスタムコンポ ネント
カスタムコンポーネント
Seasar Conference
2008 Autumn
© The Seasar Foundation and the others 2008. all rights reserved.
153
少し脱線
Seasar Conference
2008 Autumn
© The Seasar Foundation and the others 2008. all rights reserved.
154
少し前に
LL Struts
作りました
作
し
Seasar Conference
2008 Autumn
© The Seasar Foundation and the others 2008. all rights reserved.
155
StrutsのActionを
JythonやJRubyで
y
y
記述出来ます
Seasar Conference
2008 Autumn
© The Seasar Foundation and the others 2008. all rights reserved.
156
TestAction py
TestAction.py
import
p
sys
y
import org.apache.struts.action
def execute():
()
mapping = struts.getMapping()
struts.setForward(mapping.findForward(
t t
tF
d(
i fi dF
d("success"))
))
execute()
Seasar Conference
2008 Autumn
© The Seasar Foundation and the others 2008. all rights reserved.
157
TestAction rb
TestAction.rb
require
q
'java'
j
mapping = $struts.getMapping
$
$struts.setForward(mapping.findForward('success'))
(
(
))
Seasar Conference
2008 Autumn
© The Seasar Foundation and the others 2008. all rights reserved.
158
そもそもJythonやJRubyで
実装する意味は無 です。
実装する意味は無いです。
実用性も無さそうですね。
実用性も無さそうですね
単純に興味本位です。
単純
興味本位 す。
Seasar Conference
2008 Autumn
© The Seasar Foundation and the others 2008. all rights reserved.
159
TeedaのPageやActionも
工夫次第で出来るはず。
夫次第で出来るはず。
誰かTeedaにLLな風を
吹かせて下さい。
吹か
下さ 。
Seasar Conference
2008 Autumn
© The Seasar Foundation and the others 2008. all rights reserved.
160
脱線終わり
線終
Seasar Conference
2008 Autumn
© The Seasar Foundation and the others 2008. all rights reserved.
161
Teeda拡張のまとめ
カスタマイズし放題
Seasar Conference
2008 Autumn
© The Seasar Foundation and the others 2008. all rights reserved.
162
Teedaの特徴
Teeda
の特徴
Teedaの今後
Seasar Conference
2008 Autumn
© The Seasar Foundation and the others 2008. all rights reserved.
163
1 0系
1.0系
開発は1.0.13で終了
今後はサービスパック
1.0.13-spnで提供
Seasar Conference
2008 Autumn
© The Seasar Foundation and the others 2008. all rights reserved.
164
1.1系
Teeda Extentionの向上
以下新機能予定
・ネストしたプロパティ対応
し
テ 対応
・Forwardによる画面遷移対応
画面遷移対応
・コマンドリンク対応
対応
Seasar Conference
2008 Autumn
© The Seasar Foundation and the others 2008. all rights reserved.
165
1.2系
系
Teeda CoreがJSF1.2準拠
CoreがJSF1 2準拠
動作環境
・Java SE 5.0以降
・Servlet 2.5
・JSP 2.1
2008年中くらいには実装完了予定
Seasar Conference
2008 Autumn
© The Seasar Foundation and the others 2008. all rights reserved.
166
Teedaの特徴
Teeda
の特徴
最後に
Seasar Conference
2008 Autumn
© The Seasar Foundation and the others 2008. all rights reserved.
167
探求心
大切
Seasar Conference
2008 Autumn
© The Seasar Foundation and the others 2008. all rights reserved.
168
これなんだろう?
と思 たら
と思ったら
手を動かしてみてください
Seasar Conference
2008 Autumn
© The Seasar Foundation and the others 2008. all rights reserved.
169
何か
生み出せます
Seasar Conference
2008 Autumn
© The Seasar Foundation and the others 2008. all rights reserved.
170
Teedaの特徴
Teeda
の特徴
最後に
一句
句
Seasar Conference
2008 Autumn
© The Seasar Foundation and the others 2008. all rights reserved.
171
一句
探求心
持たなくなったら
ホトトギス
米林一茶
Seasar Conference
2008 Autumn
© The Seasar Foundation and the others 2008. all rights reserved.
172
ご清聴
ありがとう
ございました
Seasar Conference
2008 Autumn
© The Seasar Foundation and the others 2008. all rights reserved.
173
Fly UP