- PR -

JSF 初画面表示時にBeanに値をセットする(Actionを呼び出す)には?

投稿者投稿内容
cutback
会議室デビュー日: 2003/05/16
投稿数: 12
投稿日時: 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で、初画面表示前に割り込めるのは確認しましたが、
もっとよい方法があればと思い質問した次第です。

よろしくお願いします。
aa
ぬし
会議室デビュー日: 2004/01/08
投稿数: 299
投稿日時: 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にフォワードするようにしとけばいいと思います。
よしだひろゆき
大ベテラン
会議室デビュー日: 2004/11/22
投稿数: 141
投稿日時: 2005-04-28 11:26
SunのJava Forumにちょうどこの話題がありました.
http://forum.java.sun.com/thread.jspa?threadID=621995&tstart=0
cutback
会議室デビュー日: 2003/05/16
投稿数: 12
投稿日時: 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も使った事ないです^^;

ありがとうございました。
よしだひろゆき
大ベテラン
会議室デビュー日: 2004/11/22
投稿数: 141
投稿日時: 2005-05-02 10:37
>1.2の実装がリリースされるまで、PhaseListenerで対応しようと思います。
JSF1.2はJSP2.1が前提なので,現実に使えるのはまだまだ先になるかもしれませんね.
PhaseListenerだと,全部のリクエストの時に実行されるので,「画面Aの初期表示」かどうかの判定が面倒ですねぇ...

>できれば、データ読み込み及びBeanへの格納は既に用意してあるActionメソッドを使いまわしたいと考えています。
既存のJavaBeanをそのまま使おうとすると,JSFの想定と食い違って困ることはよくあります.下手なことをするよりは,ラッパクラスを作ってしまう(Adapterパターン)のも常套手段かと思います.
例えば,ラッパクラスのコンストラクタの中で既存のJavaBeanをインスタンシエートした上で,Actionメソッドを呼んではどうでしょう?
cutback
会議室デビュー日: 2003/05/16
投稿数: 12
投稿日時: 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() してます。
よしだひろゆき
大ベテラン
会議室デビュー日: 2004/11/22
投稿数: 141
投稿日時: 2005-05-09 19:03
引用:

>例えば,ラッパクラスのコンストラクタの中で既存のJavaBeanをインスタンシエートした上で,Actionメソッドを呼んではどうでしょう?
Beanはファクトリから取得しなければならない事情がありまして、ActionでファクトリからBeanを取得して、createValueBinding().setValue() してます。


問題は,初期画面表示前のメソッド起動だけではなくて,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の動作に介入しないで済みます.
よしだひろゆき
大ベテラン
会議室デビュー日: 2004/11/22
投稿数: 141
投稿日時: 2005-05-10 12:09
補足:
引用:

委譲メソッドを書き下すのが面倒ですが,



public MyBean getMyBean() { return myBean; }
を定義しておけば,委譲メソッドを定義する必要が無くなります.
A.jspでは#{aBean.myBean.abcde}という感じで参照できます.
JSPページを書く人(Page Author)とビーンを用意する人(Application Developer)とでどちらが面倒をかぶるかという話です.

いずれにしても,「PhaseListener内でValueBinding式を生成する」と言った,ある意味不自然な実装を避けることができ,分かり易いアプリケーションができると思います.

スキルアップ/キャリアアップ(JOB@IT)