Wicket勉強会に参加しました

目次

[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でも呼ばれる
  • 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サイトでの事例

  • 更新すべきパネルをもち回している。
  • OAuth
    • Twitter
      • Twitter4j
    • はてな
      • oauth-signpostを利用
      • OAuthConsumer,OAuthProviderをもち回す
  • 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にする
  • 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を使わなければいいじゃない!

どうする

  • 何か意外と簡単にできるらしい…これはやってみたいかも

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]さん、会場を提供して下さった日本オラクルさんありがとうございました

関連記事(この記事の初版より古い記事はリンクがグレーで表示されます)

  1. 2010/08/11 [Java] [イベント] JVM勉強会に行ってきました
  2. 2009/03/16 [Java] [Wicket] Wicketでn行m列で折り返すリストを作る
  3. 2009/03/12 [Java] [Wicket] CheckBoxMultipleChoiceとChoiceRendererを使用したチェックボックスの比較
  4. 2009/03/11 [Java] [Wicket] チェックボックスの初期値の続き
  5. 2009/03/11 [Java] [Wicket] 自作のWicketサンプルを上げてみる
  6. 2009/03/09 [Java] [Wicket] チェックボックスに初期値(デフォルトでチェック)を入れる方法
  7. 2011/12/11 [イベント] [java-ja] java-ja忘年会に参加しました2011
  8. 2011/09/30 [Java] [Windows] [Ruby] .msgファイルをパースして中から添付ファイルを抜き出す
  9. 2011/08/01 [Agile] [イベント] BPStudy#47に参加しました
  10. 2011/01/30 [JavaScript] [Git] [イベント] BPStudy#41に参加しました
  11. 2011/01/23 [イベント] MacBook Air 11インチ欲しい!
  12. 2016/11/30 [Sphinx] [Python] [イベント] PyConJP 2016 in TokyoでSphinxハンズオンのTAをしてきた #pyconjp
  13. 2016/01/19 [Sphinx] [イベント] PyLadiesTokyo #8でSphinxハンズオンのTAをしてきた #sphinxjp
  14. 2015/12/01 [Sphinx] [イベント] SphinxCon JP 2015 で雑用してきた #sphinxjp
  15. 2015/11/01 [Sphinx] [イベント] Sphinxワークショップ@関西で事例紹介とハンズオンTAをしてきた #sphinxjp