Comments
Description
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