- - PR -
JSF 初画面表示時にBeanに値をセットする(Actionを呼び出す)には?
投稿者 | 投稿内容 | ||||
---|---|---|---|---|---|
|
投稿日時: 2005-04-28 00:02
・JDK1.5
・Tomcat5.5 ・myFaces1.0.9 画面が3つあり画面A、B、Cとします。 BeanとjspとActionはABCで使いまわしています。 画面に表示するデータはファイルに保存されていて、A.xml、B.xml、C.xmlとします。 Actionを呼び出す際にパラメータ(A or B or C)を渡してファイルを読み込み、 Beanにデータをセットして画面を表示します。 このとき初画面として画面Aを表示させたいのですが、よい方法はありますでしょうか? 初画面表示時に呼び出すActionをJSPに定義できればそれでOKなんですが解りませんでした。 FilterかPhaseListenerで、初画面表示前に割り込めるのは確認しましたが、 もっとよい方法があればと思い質問した次第です。 よろしくお願いします。 | ||||
|
投稿日時: 2005-04-28 06:40
シンプルにJSFだけ(myfacesだけ)使っているのでしたら、画面が3つありと書いてますが、単に画面が1つで表示内容が3つだと思います。
もしそうなら単純にsessionスコープのマネージドBeanで初期設定でa.xmlのデータを放り込んでやればいいですね。 Actionがどうしたこうしたと書いてますけど、JSFではなくStruts-faces使っているとかそういう話でしたら(jspを直接呼ばさないという話でしたら)、同じ1つのjspを使っているとしてもActionが3つ(画面が3つ)になりますから、パスも3つありますよね。 それなら、a.do, b.do, c.doを作っておき、index.htmでa.doにフォワードするようにしとけばいいと思います。 | ||||
|
投稿日時: 2005-04-28 11:26
SunのJava Forumにちょうどこの話題がありました.
http://forum.java.sun.com/thread.jspa?threadID=621995&tstart=0 | ||||
|
投稿日時: 2005-04-28 13:00
レスありがとうございます。
よしださんへ。 >SunのJava Forumにちょうどこの話題がありました. >http://forum.java.sun.com/thread.jspa?threadID=621995&tstart=0 了解しました。1.2の実装がリリースされるまで、PhaseListenerで対応しようと思います。 aaさんへ >もしそうなら単純にsessionスコープのマネージドBeanで初期設定でa.xmlのデータを放り込んでやればいいですね。 Beanの初期設定とはコンストラクタまたはfaces-config.xmlでの初期設定のことと思いますが、 できれば、データ読み込み及びBeanへの格納は既に用意してあるActionメソッドを使いまわしたいと考えています。 また、Struts-facesは使ってません。#strutsも使った事ないです^^; ありがとうございました。 | ||||
|
投稿日時: 2005-05-02 10:37
>1.2の実装がリリースされるまで、PhaseListenerで対応しようと思います。
JSF1.2はJSP2.1が前提なので,現実に使えるのはまだまだ先になるかもしれませんね. PhaseListenerだと,全部のリクエストの時に実行されるので,「画面Aの初期表示」かどうかの判定が面倒ですねぇ... >できれば、データ読み込み及びBeanへの格納は既に用意してあるActionメソッドを使いまわしたいと考えています。 既存のJavaBeanをそのまま使おうとすると,JSFの想定と食い違って困ることはよくあります.下手なことをするよりは,ラッパクラスを作ってしまう(Adapterパターン)のも常套手段かと思います. 例えば,ラッパクラスのコンストラクタの中で既存のJavaBeanをインスタンシエートした上で,Actionメソッドを呼んではどうでしょう? | ||||
|
投稿日時: 2005-05-09 11:28
>JSF1.2はJSP2.1が前提なので,現実に使えるのはまだまだ先になるかもしれませんね.
JSF1.2、JSP2.1はJ2EE5.0(JSR 244)に含まれて、J2EE5.0は2005年7月リリース予定になっているようですが、実装が出てくるのはもうチョッと先になるということでしょうか? >PhaseListenerだと,全部のリクエストの時に実行されるので,「画面Aの初期表示」かどうかの判定が面倒ですねぇ... そうですね。現状リクエストURIとBeanが存在するか?を見て判断していますが、自分でも最善とは思ってないです。 >例えば,ラッパクラスのコンストラクタの中で既存のJavaBeanをインスタンシエートした上で,Actionメソッドを呼んではどうでしょう? Beanはファクトリから取得しなければならない事情がありまして、ActionでファクトリからBeanを取得して、createValueBinding().setValue() してます。 | ||||
|
投稿日時: 2005-05-09 19:03
問題は,初期画面表示前のメソッド起動だけではなくて,Beanをファクトリから取得する必要があるのでマネージドビーンとしてJSFに生成を任せられない,という点もあるわけですね. 「ラッパクラス」ではどうか,と言っているのは以下のような感じです: 既存のBeanをMyBeanとします.ラッパクラスABeanを以下のように定義します. public class ABean { private MyBean myBean; public ABean() { // コンストラクタ myBean = Action.getMyBean("A.xml"); // ファクトリ取得して設定 } public String getAbcde() { return myBean.getAbcde(); } // そのほか,MyBean.get*をすべて委譲する(ここが面倒ですが...) } faces-config.xmlでaBeanを定義すれば,A.jspで#{aBean.abcde}が参照できるようになります. 委譲メソッドを書き下すのが面倒ですが,一方で,createValueBindingなどのJSF固有のAPIを使ってJSFの動作に介入しないで済みます. | ||||
|
投稿日時: 2005-05-10 12:09
補足:
public MyBean getMyBean() { return myBean; } を定義しておけば,委譲メソッドを定義する必要が無くなります. A.jspでは#{aBean.myBean.abcde}という感じで参照できます. JSPページを書く人(Page Author)とビーンを用意する人(Application Developer)とでどちらが面倒をかぶるかという話です. いずれにしても,「PhaseListener内でValueBinding式を生成する」と言った,ある意味不自然な実装を避けることができ,分かり易いアプリケーションができると思います. |