[Java][Wicket][イベント]Wicket勉強会に参加しました
TwitterのTL取得ページを自分用に作った程度ですが、二年連続二回目の出席をキメました。バージョン1.3メインで使っていた(いる?)人なので、もう1.5が出るのかーっといったところです。
1.5になると矢野さんのWicket本の1/3が意味なくなるらしい…。
Wicket1.5の新機能 @[http://twitter.com/t_yano:title=t_yano]さん
- WebRequestCycleが消えた
- steps(), step()も消えた
- RequestTargetという概念が消えた→IRequestHandlerで代替
- UrlCodingStrategy→IRequestMappterで代替
- リクエストのサイクル
IRequestHandler
↑ ↓
--------------------
IRequestMapper
--------------------
↑ ↓
Request Url
- RequestHandlerを使えればWicketの世界に入っていける
- RequestHandlerStack: リクエスト処理の中心でRequestHandlerをスタックとして扱う
Urlマウント
- mountBookmarkablePageが消え、代わりにmountPageになった。
- ${}で変数をUrlに埋め込めるようになった
/mountpath/${year}/
StringValue year = parameter.get("year")
- - 現状はページのみ。リソースの場合はインデックスで取れる
/user/t_yano/image/
parameter.get(0) //user
parameter.get(1) //t_yano
コンポーネントの初期化と設定
- コンストラクタ?onBeforeRender?
- onInitialize()が追加された
- 自身がページにadd済みである事を保証。ただし一度しか呼ばれない
- isVisibleがfalseだったりすると呼ばれない
- onConfigure()
- レンダリング前にかならず呼ばれる事を保証
- 全コンポーネントが揃っている事が保証できるタイミング
- isVisibleがfalseでも呼ばれる
- onInitialize()が追加された
- ButtonとかLinkとかPanelに書くもので、Pageに書くものではない
コンポーネントの独立性
- 密結合
- ボタンを押すとあるコンポーネントが消えるという場合…
- ボタンと消すコンポーネントを連携させないといけなかった
- ボタンを押すとあるコンポーネントが消えるという場合…
- IEventSink: イベントを受け取るオブジェクト
- IEventSource: イベントを送信できるオブジェクト
- あらゆるコンポーネントはIEventSinkかつIEventSource
- Page#sendで送れる範囲
- BREADTH: 子に広げる
- WIDTH: 子から自分まで上がる
- BUBBLE: 自分から親に上がる
- BREADTHしか使わないんじゃないか?
◯ ◯ ◯ ◯
↓イベント ↑ ↑ ↑
フ レ ー ム ワ ー ク
- 他のコンポーネントを意識しなくてもよくなった!
- 今後はページからではなくコンポーネントから考えよう
- ajaxコンポーネントを更新するaddComponent()メソッドはadd()になった
最終的な表示処理は誰のもの? @[http://twitter.com/t_hyssh:title=hayassh]さん
- Wicket歴4年
- 40人以上のプロジェクトでWicketを使っている
こんなときどうするか
- 住所を一行で表示
- 郵便番号はXXX-XXXX
- 郵便番号と住所は半角スペースひとつあける
- 郵便番号にハイフンを入れる、半角スペースあけで表示するというのは表示側の都合
上記の処理をWicketのどの部分でやるか??
- Component部分でやるか
- 再利用性が高くなる
- 拡張性も保たれる
- テスタビリティが低い
- WicketTesterを使用しなければいけない
- Comverterでやるか
- Componentよりテスタビリティが高い
- 変換処理だけ考えるので責務がはっきりする
- Stringへの変換しかしない
- Nullの場合にConverterが適用されない
- ViewHelperでやるか
- テスタビリティが高い
- 概念が理解されやすい
- CompoundPropertyModelと相性がいい
- 再利用性・拡張性が悪い
入力があればConverter。表示するだけならModelでなんとかする?再利用単位はコンポーネントがいい?
まとめ
- Componentで行えば再利用性が高まる?
- ただし、ViewHelperはJUnitでテストができる
タイトル未定 @[http://twitter.com/tetsuyas:title=tetsuyas]さん
- 大学の教員をやっている
- Shuugi.in - http://shuugi.in/:title というサービスを作成している
Shuugi.inサイトでの事例
- 更新すべきパネルをもち回している。
- OAuth
- Twitter
- Twitter4j
- はてな
- oauth-signpostを利用
- OAuthConsumer,OAuthProviderをもち回す
- Twitter
- ModalWindow内でのページ遷移
Wicket1.3から1.4へのマイグレーション時にハマった事 @[http://twitter.com/gishi_yama:title=gishi_yama]さん
- 大学の教員をやっている
- 学内のシステムをWicketで開発
構成
- Wicket + Guice + JDBC
- コンポーネントをシンプルに使用
- 確認は目視
マイグレーション後
- エラー350近く、ワーニングは5000近く
- エラーの原因はメソッドの廃止によるものがほとんど
- ワーニングはジェネリクス、Validator
工数
- 300クラス/3.2万ステップ
- 社内SE2人でコード修正、確認など…80H
マイグレーションで注意
- CompundPropertyModelを使用したFileUploadFieldコンポーネント
- FileUploadFieldにModelを指定しないとエラーになる
- ModelをセットしないLinkやFormに対するジェネリクス
- Link
にする
- Link
- htmlの書き換え
- xmlnsを1.3から1.4にかえる
- 1.4からのコンポーネントに置き換え
- EnumLabel,onConfigure(),onInitialize()など
- 1.3から1.4で仕様変更したコンポーネント
changelogとかWicketTesterを使いこなせば…
PropertyModelクラスがオブジェクトのフィールド変数を取得する仕組みについて ravicotさん
アクセサがないのにどう取得しているのか?
- リフレクションを使っていた
- 動的にアクセサを使用していた
- PropertyResolver.getValueを使用している
- フィールドを取得してアクセサがなければアクセサ作成を試みる!
Wicket:idを利用しないテンプレートとの対応付け @[http://twitter.com/madogiwa:title=madogiwa]さん
html5だとwicket:idタグは警告される
警告を消すには…
- xmllnを追加する
- wicket:idを使わなければいいじゃない!
どうする
- フィルターを拡張する
- フィルターを有効にする
- 具体的には……http://d.hatena.ne.jp/mdgw/20101106/p1:title
- 何か意外と簡単にできるらしい…これはやってみたいかも
WicketとFlexの連携 @[http://twitter.com/chimerast:title=chimerast]さん
Wicketのajax系のコンポーネントとFlexの連携
W→F
- FlexのcreateComplete内でaddCallbackを呼び出し、jsリストに関数を追加
- そしてWicketから呼び出す
F→W
- AbstractDefaultBehavior#renderHead()をオーバライドしjs関数を追加
- Flexから追加した関数を呼び出す
テキストエンコーディング
- F→js
- 特に問題なし
- js→W
- endodeURIComponent()
感想とか二次会とか
大学時代に作ったWicketの遺産が発掘されたので、これ、1.5にあげてみたいと思うなど。何かLTのネタでもできるようにWicketを使っていきたい。
その後の二次会では主にPHPとかWindowsとかOfficeがディスられてました。また、今回はATNDでのアテンドなのに出席率がめちゃめちゃ良かったとの事でした。
最後に
長い時間受付をして下さった[http://twitter.com/yoshioterada:title=yoshioterada]さん、会場を提供して下さった日本オラクルさんありがとうございました!