2007 Autumn S2Wicketの の 紹 介 よういちろう 1
自 己 紹 介 田 中 洋 一 郎 株 式 会 社 エーティーエルシステムズ http://www.atl-systems.co.jp/ Blog: 天 使 やカイザーと 呼 ばれて http://www.eisbahn.jp/yoichiro/ S2Wicketコミッタ 2
[ 宣 伝 ] こみゅすけ http://commusuke.eisbahn.jp/ eisbahn 3
アジェンダ Apache Wicket S2Wicket デモンストレーション 今 後 の 展 望 4
Apache Wicket JavaにおけるWebアプリ 開 発 の 進 化 クラスの 役 割 分 割 設 定 ファイル(XML)による 制 御 Viewのテンプレート 化 ViewのXHTML 化 設 定 ファイルの 省 略 簡 略 化 Ease of Development JSP (Scriptlet) JSP (CustomTag) Struts JSF Java Servlet Wicket Spring MVC Teeda 5
Apache Wicket 特 徴 何 でもかんでもJava POHP コンポーネント&イベント 指 向 JavaScriptを 書 かないAjax シンプル 6
Apache Wicket 何 でもかんでもJava 従 来 肥 大 複 雑 化 した 設 定 ファイル 点 在 化 したロジック Java Java Java Java XML Java Java XML XML XML Property Property JSP JSP JSP JSP JSP Wicket 設 定 とロジックは 全 てJavaに JavaとHTMLは1 対 1 Java Java Java Java Java Java Java Java Java Property Property HTML HTML HTML HTML HTML HTML HTML HTML HTML HTML 7
Apache Wicket Plain Old Html Page <html:form action= /register.do method= post > 所 属 : <c:out value= ${division.name} name} /><br /> 名 前 : <html:text property= name /><br /> 年 齢 : <html:text property= age /><br /> 従 来 <html:submit value= OK /> Webブラウザで 表 示 できない </html:form> <form wicket:id= registerform method= post > 所 属 : <span wicket:id= divisionname ></span> 名 前 : <input type= text wicket:id= name /><br /> 年 齢 : <input:type= text wicket:id= age /><br /> Wicket <input type= submit value= OK" /> wicket:id 属 性 で </form> 要 素 を 特 定 POHP Webブラウザで 表 示 可 能 8
Apache Wicket コンポーネント&イベント 指 向 <a wicket:id= link >ここをクリックしてください </a><br /> <span wicket:id= label ></span> final Label label = new Label( label, new Model()); add(label); Link link = new Link( link ) { イベント 処 理 public void onclick() { label.setmodelobject( イベントが 発 生 しました ); } }; add(link); コンポーネント 指 向 画 面 の 要 素 が 部 品 化 されている コンポーネント 指 向 画 面 の 要 素 が 部 品 化 されている 9
Apache Wicket JavaScriptを 書 かないAjax final Label label = new Label( label, new Model()); label.setoutputmarkupid(true); add(label); イベント 処 理 (Ajax) AjaxLink link = new AjaxLink( link ) { public void onclick(ajaxrequesttarget t) { label.setmodelobject( setmodelobject( イベントが 発 生 しました ); t.addcomponent(label); } }; add(link); <a href="#" "" wicket:id="link2" " onclick="var wcall=wicketajaxget('/s2wicket/hello?wicket:interf ace=:3:link2::ibehaviorlistener&wicket:behaviorid=0 ', function() { }, function() { });return!wcall;" id="link2">ここをクリックしてください </a><br /> Ajax 対 応 コンポーネント JavaScriptを 自 動 生 成 <span wicket:id="label" id="label"></span> 10
Apache Wicket シンプル + 依 存 ライブラリ たった1つのみ HelloApplication FooPage.java FooPage.html BarPage.java BarPage.html HelloSession HogeForm.java HogeForm.html プログラムの 構 造 JavaとHTMLの 対 で 構 成 PageやFormなど コンテナ 単 位 で 再 利 用 可 能 11
Apache Wicket サンプルデモンストレーション 12
Apache Wicket 守 備 範 囲 Viewを 担 当 リクエストの 処 理 と 結 果 のレンダリング 何 らかのDIコンテナと 連 携 が 必 要 View Business Database Logic Access 13
S2Wicket 特 徴 WicketにS2Containerを 統 合 統 合 方 式 を 選 択 可 能 14
S2Wicket S2Containerとの 連 携 FooPage extends WebPage I/F Proxy S2Wicket PageオブジェクトにProxyをセット イベント 処 理 時 にI/Fを 使 うことで S2Container 内 のオブジェクトをコール Impl public void onclick() { S2Wicket } S2Container 15
S2Wicket 前 準 備 public class OrderApplication extends WebApplication { public OrderApplication() { } SeasarComponentInstantiationListener S2Wicketを 有 効 にするためのクラス WebApplication#init() 内 で 登 録 する 各 コンポーネントのインスタンス 生 成 が 行 われる 度 に 呼 び 出 される protected void init() { super.init(); addcomponentinstantiationlistener( t ti ti t new SeasarComponentInjectionListener(this)); } } 16
S2Wicket フィールドインジェクション public class OrderPage extends WebPage { } @SeasarComponent private OrderService orderservice; public OrderPage() { add(new Link(...) { orderservice.order(...); }); } <component name= orderservice class=...orderserviceimpl > l > </component> app.dicon フィールドインジェクション S2Wicketは 対 象 フィールドにオブ ジェクトをセットする セットタイミングは 該 当 クラスのイ ンスタンス 生 成 時 17
S2Wicket @SeasarComponentによるインジェクション 型 によるルックアップ s2container.getcomponent( OrderService.class ) @SeasarComponent private OrderService orderservice; S2Container 名 前 によるルックアップ s2container.getcomponent( order ) @SeasarComponent(name= order ) private OrderService orderservice; S2Container @SeasarComponent AnnotationFieldFilterが 使 用 される 暗 黙 的 に 適 用 されている 18
S2Wicket 命 名 規 約 に 従 ったインジェクション FieldNamePatternFieldFilterの 使 用 FieldNamePatternFieldFilter filter = new FieldNamePatternFieldFilter(); filter.setpackagenamepatternregex("パッケージ 名 の 正 規 表 現 "); filter.setclassnamepatternregex("クラス 名 の 正 規 表 現 "); filter.setfieldnamepatternregex( フィールド 名 の 正 規 表 現 ); 命 名 規 約 FieldFilter 正 規 表 現 により 対 象 フィールドを 特 定 インジェクション 対 象 のフィール ルックアップはフィールド 名 を 使 用 ドを 決 定 するためのAPI WebApplicationクラス 内 で 登 録 自 作 することが 可 能 19
S2Wicket 命 名 規 約 に 従 ったインジェクション FieldNamePatternFieldFilter filter = new FieldNamePatternFieldFilter(); filter.setpackagenamepatternregex( setpackagenamepatternregex(.*.example example ); filter.setclassnamepatternregex(.*page ); filter.setfieldnamepatternregex(.*service ); example で 終 わるパッケージの Page で 終 わる クラスに 定 義 された Service で 終 わるフィールド 名 package order.example; s2container.getcomponent( orderservice ) public class OrderPage extends WebPage { } private OrderService orderservice; S2Container private OderLogic orderlogic; 20
デモンストレーション 基 本 的 な 使 用 例 大 きなデータを 取 り 扱 う 例 Ajaxと 組 み 合 わせた 例 21
今 後 の 展 望 パフォーマンスの 向 上 FooPage extends WebPage I/F Proxy Proxyのキャッシュ 現 在 は 都 度 生 成 している すでに 生 成 したProxyをキャッシュ して 再 利 用 する Impl public void onclick() { S2Wicket } S2Container 22
今 後 の 展 望 コンポーネントファクトリ private TextField input; input = new TextField( input, new PropertyModel(model, name )); add(input); } @WicketComponent コンポーネントの 生 成 &コンテナ への 登 録 を 自 動 化 OGNLで 簡 単 なロジックも 記 述 可 能 @WicketComponent( modelproperty= name ) private TextField input; @WiktC @WicketComponent( t( actions={ @WicketAction(method= onclick, exp= logic() ) } ) private TextField input; 23
最 後 に S2Wicket http://s2wicket.sandbox.seasar.org/ 天 使 やカイザーと 呼 ばれて http://www.eisbahn.jp/yoichiro/ 24