0

URI に param を含むページでメソッドを呼び出すと、uri のパラメーターを再度渡さない限り、メソッドは呼び出されません。たとえば、私が持っている場合:

http://maywebsite/myapp/mypage.xhtml?mykey=myvalue

このメソッドはエラーになります (明らかに、params なしでページを再度レンダリングしますが、メソッド foo は呼び出されないためです)。

<h:commandLink value="Do Action" actionListener="#{mybean.foo}"/>

そこで、コンポーネントのみを更新するために ajax を追加しましたが、ボタンが起動されません。

<h:commandLink value="Do Action" actionListener="#{mybean.foo}">
    <f:ajax render="somecomponent"/>
</h:commandLink>

パラメータ値を再度渡すと、ボタンはメソッドを正常に呼び出します。

 <h:commandLink value="Do Action" actionListener="#{mybean.foo}">
     <f:param name="mykey" value="myvalue"/>
     <f:ajax render="somecomponent"/>
 </h:commandLink>

ただし、このボタンはさまざまなパラメーター キーと値を持つ多くのページに含まれています (ui:include)。パラメータ値を渡さずにメソッドを呼び出すにはどうすればよいですか?

グラスフィッシュ3.1.2、jsf 2.0を使用しています

4

1 に答える 1

2

どうやら、Beanはリクエストスコープであり、パラメータはコマンドリンクのレンダリング方法で役割を果たします(たとえば、renderedその親コン​​ポーネントの1つの属性、またはコマンドリンクを含むテンプレートの動的インクルードによって)。

これらの条件はすべて、フォーム送信のリクエスト値の適用フェーズで再評価されます。開発者は、これらすべての条件が、フォームがエンドユーザーに提示されたときとまったく同じであることを確認する必要があります。したがって、Beanがリクエストスコープであり、パラメータが存在しない場合、コマンドリンクはコンポーネントツリーにレンダリングされていないものとして表示され、このようにしてそのアクションは呼び出されません。

Beanをビュースコープに配置するのがこれを修正する最も簡単な方法です(動的を使用している場合を除き<ui:include>、これはより複雑であり、特定のビューの部分的な状態保存をオフにする必要があります)。

参照:

于 2012-10-19T01:44:09.517 に答える