Apache Shale ViewController その3

ViewControllerは,Apache Shale 1.0.3からRequest Scopeにおく必要があります.
Request Scopeに置かないと,init()やら,prerender()のような,コールバックメソッドを呼んでくれなくなりました.

このあたりが,大きな変更と言えます.

その代わりと言ってはなんですが,新たに各スコープに対応したバッキングビーンラッパーが用意されました.

アプリケーションスコープ

org.apache.shale.view.AbstractApplicationBeanを継承します.

AbstractApplicationBeanには,以下のコールバックメソッドが用意されています.

  • init()

インスタンス生成後,バッキングビーンの呼び出し時に呼ばれます.バッキングビーンは,アプリケーションスコープに置かれるので,当然init()は1度呼び出されたら,2度呼び出されることはありません.

  • destroy()

アプリケーションの削除時,又はアプリケーションを終了したときに呼ばれます.

セッションスコープ

org.apache.shale.view.AbstractSessionBeanを継承します.

AbstractSessionBeanには,以下のコールバックメソッドが用意されています.

  • init()

インスタンス生成後,バッキングビーンの呼び出し時に呼ばれます.バッキングビーンは,セッションスコープに置かれるため,セッション毎に1回呼び出されます.

  • passivate()

Sessionが非活性化されたときに呼ばれます.

  • activate()

Sessionが活性化されたときに呼ばれます.

  • destroy()

セッションの破棄時に呼ばれます.

リクエストスコープ

org.apache.shale.view.AbstractRequestBeanを継承します.

AbstractRequestBeanには,以下のコールバックメソッドが用意されています.

  • init()

インスタンス生成後,バッキングビーンの呼び出し時に呼ばれます.バッキングビーンはリクエストスコープに保持されるため,リクエスト毎にinit()は呼ばれます.

  • destroy()

バッキングビーンの破棄時に呼ばれます.画面にレスポンスを返した後ってところですかね.

しかし,ViewControllerクラスがあるのに,さらにAbstractRequestBeanなんて作る意味があるんでしょうか?使い道もないし.

各スコープ毎のバッキングビーンには,AbstractFacesBeanが継承されているため,便利なヘルパーメソッドが使えるようになっています.

感想

なんだか,苦し紛れの対応のような気がしました.
まず,各バッキングビーンをどのスコープに置くかは,faces-config.xmlで定義します.それだけでなく,バッキングビーン側にまでスコープに対応したビーンを継承させるのは複雑さが増すし,手間がかかります.

AbstractRequestBeanなんて,ほとんどおまけみたいなもので,作成する必要すら感じません.

これらの対応は結局のところ,init()とdestroy()のタイミングを思うようにできず,仕方がなくこのような形になってしまったと思われます.

これらのコールバックメソッドを呼んでいる場所は,
org.apache.shale.view.faces.LifecycleListenerクラスです.このクラスは

  • ServletContextAttributeListener
  • ServletContextListener
  • HttpSessionActivationListener
  • HttpSessionAttributeListener
  • HttpSessionListener
  • ServletRequestAttributeListener
  • ServletRequestListener

をimplementsしており,それぞれのコールバックはリスナーによって呼ばれます.


それぞれのスコープに対応したコールバックにきっと見覚えがあることでしょう.
しかし,一時しのぎの対応かと思っていたらこのまま1.0.3としてリリースされてしまいました.

確かに,すべてを対応させる為にはこれしかないように思いますが・・・他に手はないのだろうか・・・

AbstractSessionBeanのpassivate()やactivate()の必要性もないし,init()とdestroy()を呼びたいだけなのだから,すべてViewControllerクラスでできるようにするべきだと思います.

一番使いたいコールバックであるprerender()メソッドもViewControllerクラスを継承してさらにリクエストスコープでしか扱えないのも問題があります.postbackにしてもviewControllerクラスでしか対応していません.

さてさて・・・このままではまずいですよ・・・

今月の本

Eclipse: Building Commercial-Quality Plug-ins (Eclipse Series)

Eclipse: Building Commercial-Quality Plug-ins (Eclipse Series)

Eclipse 3.1 3.2 に対応したPlugin作成本.
今日は忙しいので読めませんが,明日から楽しみ.

良書だといいなぁ.

今月の本

LinuxデスクトップHacks ―プロが教えるテクニック&ツール100選

LinuxデスクトップHacks ―プロが教えるテクニック&ツール100選

この本は,はっきり言って最狂です.
デスクトップHackといっても,KDEGNOMEのカスタムだけではありません.

コンソールベースのカスタマイズや,ブートローダーの改造まで.
とにかく,見た目にこだわった改造ができます.

カーネル2.4時代じゃできなかったことが,こんなにできるようになっているんですね.
X.orgの登場とか,自分が全盛で触っていたときとはかなり変わっていて,勉強になりました.

しばらくは,Slackwareを改造しますよ.ちなみに,本とSlackwareは一切関係ありません.
(むしろ,Debianとか使っている人のほうが助かるのかもね)

Linux使いなら,買うしかありません.

Ajax and Flash Development With Openlaszlo: A Tutorial

Ajax and Flash Development With Openlaszlo: A Tutorial

ようやく,到着.
OpenLaszloに関する,唯一の本.これからは,リッチクライアントでしょ.

GNU Development Tools が届いた.

先日予約していた,「GNU Development Tools」が届きました.

http://www.oversea-pub.com/publications.htm

自主出版なんて,すごいですね.
すごい綺麗で,豪華な本が届きました.

よかったよかった.

今月の本

標準EJB 3.0プログラミング

標準EJB 3.0プログラミング

そろそろ本格的にJPAでもやろうかと思っていたので,買いました.

Puzzles for Hackers:スクリプトキディから大人のハッカーへ (IT Architects' Archive 知の連環)

Puzzles for Hackers:スクリプトキディから大人のハッカーへ (IT Architects' Archive 知の連環)

出題編と回答編に分かれた構成.
なかなか面白いです.正直,むづかしい...

まるごとPerl! Vol.1

まるごとPerl! Vol.1

Perlフレームワークがいっぱい.

WEB+DB PRESS Vol.34

WEB+DB PRESS Vol.34

Java World (ジャバ・ワールド) 2006年 10月号 [雑誌]

Java World (ジャバ・ワールド) 2006年 10月号 [雑誌]

いつもどおり,購入.

Apache Shale 1.0.3リリース

Apache Shale 1.0.3がリリースされました.

http://people.apache.org/dist/shale/v1.0.3/

正式リリースには,まだ少しかかるかな.
Dialog Managerあたりの不具合も残っているもよう.

Apache Con(2006/10)にリリースを目標にしているのでしょうか.
View Controller周りは,結構変わったのでまた紹介します.

Tomcat5.x スクリプトレットを使用禁止に!

Tomcat5.xから、JSPでのスクリプトレットの使用を禁止に出来るみたい。

web.xml

<jsp-config>
    <jsp-property-group>
        <url-pattern>*.jsp</url-pattern>
        <el-ignored>false</el-ignored>
        <page-encoding>Windows-31J</page-encoding>
        <scripting-invalid>true</scripting-invalid>
    </jsp-property-group>
</jsp-config>

scripting-invalidをtrueに設定してやると、スクリプトレットを使用禁止にできます。
ディフォルトは、false。

Tomcatでは、確認済み。(ほかのAPサーバも有効になるんだろうか。。。)

el-ignoredをtrueにすると、EL式が書けなくなります。${hoge}とかそのまま表示されます。

注意点。

JSPファイルの方に、pageディレクティブが存在すると、上書きされるので注意しましょう。

<%@ page language="java" contentType="text/html; charset=windows-31j"
    pageEncoding="windows-31j"%>

と書くのが当たり前になりすぎていて、気づきませんでした。
上記例だと、scripting-invalidがfalseで宣言されているのと同等なので、web.xmlに記述しただけではスクリプトレットが動きます。

scripting-invalidを直接pageディレクティブに記述しても、スクリプトレットを禁止できます。

尚、scripting-invalidをtrueに設定して、スクリプトレットを記述すると、Exceptionが発生しますので。

前回のGETパラメータの文字化け確認しました。
ついでに、server.xmlの設定が有効になるのも確認しました。

サーブレットJSPを勉強したい方へお勧めの本。

基礎からのサーブレット/JSP SE必修!

基礎からのサーブレット/JSP SE必修!

よい本です。