- PR -

JSF request Scopeに値をセットする

1
投稿者投稿内容
しま太郎
常連さん
会議室デビュー日: 2006/08/22
投稿数: 39
投稿日時: 2007-03-12 19:18
いつもお世話になっています。

現在JSFで値の受け渡しをしようとしていますが、上手くいきません。

■やりたいこと====================================

1)testA.jspでリンクをクリックし、actionListenerでToTestB.javaを実行。
2)ToTestB.javaで、とある値をtestB_Bean.java(faces-configでrequestに指定されている)の該当フィールドにsetする。

=================================================
○faces-config

<managed-bean>
<managed-bean-name>testB_BEAN</managed-bean-name>
<managed-bean-class>jp.co.Hoge.test.testB_Bean</managed-bean-class>
<managed-bean-scope>request</managed-bean-scope>
</managed-bean>
=================================================
○testA.jsp

<h:commandLink action="testB" value="testBへ遷移" immediate="true" >
  <f:actionListener type="jp.co.Hoge.test.ToTestB" />
</h:commandLink>

=================================================
○ToTestB.java

public class ToTestB implements ActionListener{

public ToTestB(){
}

public void processAction(ActionEvent e) throws AbortProcessingException {

FacesContext context = FacesContext.getCurrentInstance();
testB_Bean tb = (testB_Bean)context.getApplication().
createValueBinding("#{testB_BEAN}").getValue(context);

String str = "testです";
tb.setAAA(str);

}
}

=================================================
○testB_Bean.java

public class testB_Bean {

private String AAA;

(AAAのgetter/setterがあります)

=================================================
○testB.jsp
(※ここでは該当フィールドにまた入力できるようにinputを指定しています)

<h:inputText value="#{testB_BEAN.aAA}" />
=================================================

ToTestB.java 実行時には
 System.out.println(tb.getAAA());
をすると値がきちんと入っているようなのですが、
遷移後にtestB.jspを開くと値がなくなっています。

ちょっと変えて、

FacesContext context = FacesContext.getCurrentInstance();
Application app = context.getApplication();
VariableResolver vr = app.getVariableResolver();
testB_Bean tb = (testB_Bean)vr.resolveVariable(contextX,"testB_BEAN");

でも試しましたが、やはりダメでした。。

どなたか分かる方がいらっしゃいましたら、
誠に恐縮ですがご教授よろしくお願いいたします。。


□追記□
・testB_Bean.javaをsessionにすると表示されます。
・アクションリスナーをやめて通常のcommandButtonでAction処理をした場合でも同じ現象となります。

[ メッセージ編集済み 編集者: しま太郎 編集日時 2007-03-13 10:44 ]
uk
ぬし
会議室デビュー日: 2003/05/20
投稿数: 1155
お住まい・勤務地: 東京都
投稿日時: 2007-03-14 12:10
immediate=trueにしているので、モデル値が更新されていないのではないですか?
どのような意図でつけているのかわかりませんが、これを外してみてはどうでしょうか。
しま太郎
常連さん
会議室デビュー日: 2006/08/22
投稿数: 39
投稿日時: 2007-03-14 12:42
□追記

2つの方法から値をset出来ることが確認できました。
・set先のtestB_Bean.java をsessionにする。
・現在faces-configで遷移を単純遷移にしているが、ページナビゲーションの遷移にする。

==================================================
○現在のfaces-config

<navigation-case>
<from-outcome>Go_testB</from-outcome>
<to-view-id>/jsp/testB.jsp </to-view-id>
<redirect />
</navigation-case>


○変更すれば動くfaces-config

<navigation-rule>
<from-view-id>/jsp/testA.jsp</from-view-id>
<navigation-case>
<from-outcome>success</from-outcome>
<to-view-id>/jsp/testB.jsp</to-view-id>
</navigation-case>
</navigation-rule>
==================================================

ですが、この処理は各ページのメニュー画面から行うので、<from-view-id>値の固定が出来ないので2はできず、
またrerquestに設定するので1もできません・・
どのようにすれば値を受け渡しできるのでしょうか。。

[ メッセージ編集済み 編集者: しま太郎 編集日時 2007-03-14 12:48 ]
しま太郎
常連さん
会議室デビュー日: 2006/08/22
投稿数: 39
投稿日時: 2007-03-14 12:44
引用:

ukさんの書き込み (2007-03-14 12:10) より:
immediate=trueにしているので、モデル値が更新されていないのではないですか?
どのような意図でつけているのかわかりませんが、これを外してみてはどうでしょうか。



uk様、ご返答頂き、ありがとうございます。
このactionは各ページのメニューとして置いているので、immediate=true にしてあります。
念のためそちらも試しましてみたのですが、やはり値は受け渡しできませんでした。。
uk
ぬし
会議室デビュー日: 2003/05/20
投稿数: 1155
お住まい・勤務地: 東京都
投稿日時: 2007-03-14 15:03
引用:

<navigation-case>
<from-outcome>Go_testB</from-outcome>
<to-view-id>/jsp/testB.jsp </to-view-id>
<redirect />
</navigation-case>



ああ、リダイレクトしているんですね。だとしたら受け渡しできなくて当然です。
リダイレクトした場合、画面表示のリクエストがリンククリック時のリクエストとは
別に発生しますから、リクエストスコープでは受け渡しできません。

単純にリダイレクトではなくフォワードにするのではダメなんですか?
単純にリダイレクト
しま太郎
常連さん
会議室デビュー日: 2006/08/22
投稿数: 39
投稿日時: 2007-03-16 14:13
引用:

ukさんの書き込み (2007-03-14 15:03) より:
引用:

<navigation-case>
<from-outcome>Go_testB</from-outcome>
<to-view-id>/jsp/testB.jsp </to-view-id>
<redirect />
</navigation-case>



ああ、リダイレクトしているんですね。だとしたら受け渡しできなくて当然です。
リダイレクトした場合、画面表示のリクエストがリンククリック時のリクエストとは
別に発生しますから、リクエストスコープでは受け渡しできません。

単純にリダイレクトではなくフォワードにするのではダメなんですか?
単純にリダイレクト




uk様、ご返信頂き、ありがとうございます。
気づくのが遅れてしまい、返信が遅れてしまいました。
申し訳ございません。。

リダイレクトだとダメだったのですね。。
ご説明をいただくと、なるほど!という感じです。。
ですが、SSL設定をしているページのため、そちらの都合上リダイレクトが必須となってしまい、こちらは外せない状況です。。
ということで、かなり力技なのですが
faces-configで、testB.jspへ遷移する全ページに<navigation-rule>の設定を書き足してしまいました。。

ご返答頂き、誠にありがとうございました。。
1

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