MyFaces のポートレット対応

Stan がいじっているので、どうなったか確認してみる。

  • 相変わらず、FacesContext をセッションに入れる
  • prcessActionからrenderへRequestのAttributeを渡すのには、SavedRequestAttributesを利用して、processActionですべてを保存(つまり、セッションへ・・・)、そして、上書きしないようにrenderで復元。そして、このSavedRequestAttributesは、セッションから削除されないような気が・・・。
  • 各 render の終わりには、renderCleanup でセッションにある CURRENT_FACES_CONTEXT のFacesContextインスタンスを削除。ついに消したか・・・。これで、1つのページに複数のポートレットがあるときに、他のポートレットが更新されたときにページを維持できなくなったでしょう。まぁ、苦情が多かったから、仕方がないというものあるけど。
  • REDEPLOY_FLAG を使って、ポートレットの再配備を確認している。

と言ったところかな。まぁ、個人的には、2番目のやつが大問題になると思うのだけど(JSFの実装にもよるが)。TeedaのFacesPortletでは、それは避けないとなっとちょうど思ったいたものだし。2番目は、新たな苦情の発生源になる気もする。最後のREDEPLOY_FLAGは、面白いな。これはTeedaのポートレットにも導入する価値はあると思う。まぁ、感想としては、1歩進んで、2歩さがる(後退じゃん)ような実装な感じな気がする。

Teeda Extension for Portlet

add(Page + Action) で動作確認中。とりあえず、動くのだけど、processActionからrenderへリクエストスコープのビーンを入れているところで、ちょっと問題あり。ExternalContext#getReqeustMapを全部、一度、セッションに入れて、それをrenderで元に戻すので、いらんものまでセッションに入ってしまう。Lifecycle#executeで使ったビーンたちだけを取り出す良い方法はないかな。

追記:考えてみると、RequestのAttributeにある値は、ビーン以外にも必要なのは、ありそうな気が。排他リストを作って、必要なものだけを渡すようにするしかないかな。