Wicket ではページはコンポーネントの集合体で表わされます。コンポーネントとは抽象クラス Component を継承するクラスで Label や TextField などの UI 部品や Form、Panel そしてページそのもの (WebPage) もコンポーネントです。
Wicket がリクエストを受け付けると、ページを構成するコンポーネントのオブジェクトがツリー状に生成されます。例えば Wicket/HelloWorld で使った HelloWorld アプリケーションの場合には下図のようなコンポーネントツリーが形成されます。

これらはセッションに保存されますので、コンポーネントのメンバ変数やコンポーネントが保持するモデルにリクエストをまたがってアクセスが可能です。ただしこれらが大きなサイズとなる場合はセッションの肥大化により
という弊害があります。たとえば大きなリストデータをモデルとしてコンポーネントにバインドする場合は注意が必要です。(ディタッチの機能を使ってモデルとデータを切り離すようにコーディングすれば大丈夫です)
クラス wicket.markup.html.debug.PageView を使うとコンポーネントツリーを表示することができます。デバッグ目的に便利です。(エラーページ wicket.markup.html.pages.ExceptionErrorPage で使用されています)
使い方は簡単。マークアップファイルに下記のようにプレースホルダを用意しておき
DEBUG レベルのログを有効にすると HttpSession.setAttribute() のタイミングで次の例のようにアトリビュートのシリアライズ後のサイズが表示されます。
Wicket がリクエストを受け付けると、ページを構成するコンポーネントのオブジェクトがツリー状に生成されます。例えば Wicket/HelloWorld で使った HelloWorld アプリケーションの場合には下図のようなコンポーネントツリーが形成されます。
これらはセッションに保存されますので、コンポーネントのメンバ変数やコンポーネントが保持するモデルにリクエストをまたがってアクセスが可能です。ただしこれらが大きなサイズとなる場合はセッションの肥大化により
- メモリ使用量の増加
- セッションレプリケーションコストの増大
という弊害があります。たとえば大きなリストデータをモデルとしてコンポーネントにバインドする場合は注意が必要です。(ディタッチの機能を使ってモデルとデータを切り離すようにコーディングすれば大丈夫です)
コンポーネントツリーを表示する
クラス wicket.markup.html.debug.PageView を使うとコンポーネントツリーを表示することができます。デバッグ目的に便利です。(エラーページ wicket.markup.html.pages.ExceptionErrorPage で使用されています)
使い方は簡単。マークアップファイルに下記のようにプレースホルダを用意しておき
<span wicket:id="componentTree"/>Java 側で PageView を追加します。
add(new PageView("componentTree", this));
セッションアトリビュートのサイズ
DEBUG レベルのログを有効にすると HttpSession.setAttribute() のタイミングで次の例のようにアトリビュートのシリアライズ後のサイズが表示されます。
attribute 0 serialized in 47 miliseconds, size: 3.2Kセッションのサイズが気になるときはこのメッセージに注目してみてください。
最新コメント