私の JSF アプリケーションでは、requestScope として設定されている値と、sessionScope で設定されている値があります。たとえば、予約を行う場合、DTO は sessionScope に保存されるため、予約が正常に送信された後に次のページ以降で使用できるようになります。したがって、ユーザーは次のページで予約をテンプレートとして保存し、後でそのテンプレートを使用できます。テンプレートを保存すると、ユーザーはホームページにリダイレクトされます。これらの予約値は sessionscope に保存されますが、requestScope で設定された成功した送信ページでのみ必要なその他の値もあります。そのため、requestScope は、このページをロードするときに必要な作業を行いました。次に、ユーザーが既にテンプレートとして保存できる名前を使用すると、バッキング Bean でデータベースをチェックインした後、ページが同じページに戻ってエラー メッセージが表示されるという問題に直面しました。ホームページに転送する代わりに。予約値はsessionScopeに保存されるので問題ありません。しかし、requestScope に保存されている他の値は失われ、jsp ページで nullPointerException が発生します。他の値に sessionScope を使用せずにタスクを達成する方法はありますか? 私が考えた方法の 1 つは、jsp で postrender 関数を使用して、バッキング Bean でこれらの requestscope 値を再度設定することでした。しかし、リクエスト値が postrender で利用できるかどうかはわかりません。誰かがこれについて私を助けてくれますか? 私が考えた方法の 1 つは、jsp で postrender 関数を使用して、バッキング Bean でこれらの requestscope 値を再度設定することでした。しかし、リクエスト値が postrender で利用できるかどうかはわかりません。誰かがこれについて私を助けてくれますか? 私が考えた方法の 1 つは、jsp で postrender 関数を使用して、バッキング Bean でこれらの requestscope 値を再度設定することでした。しかし、リクエスト値が postrender で利用できるかどうかはわかりません。誰かがこれについて私を助けてくれますか?
2 に答える
質問にはこの情報がありませんが、まだレガシー JSF 1.x を使用しており、新しいビュー スコープを提供する JSF 2.x に移行できないと仮定します。そうでなければ、これを尋ねなかったでしょう。質問。また、IBM タグの存在は、レガシー モンスターに関する何かを暗示しています。
JSF 1.2 用のTomahawkを取得し、ビュー内の任意の場所でリクエスト スコープ Bean を参照します<t:saveState>
。
<t:saveState value="#{managedBeanName}" />
それで全部です。これは、新しい JSF 2.0 ビュー スコープが行っているのとまったく同じように内部で行われます。このようにして、#{managedBeanName}
インスタンスは効果的にビュースコープの Bean になります。
JSF 2 を使用している場合は、 @ViewScoped アノテーションを使用して、ユーザーが同じビューにいる間、Bean を有効にすることができます。
JSF 1.2 を使用している場合は、これを処理するサード パーティのライブラリを使用する必要があります。私が知っているのは次の 2 つの選択肢だけです。
Tomahawk ライブラリから、
<t:stavestate>
コンポーネントを使用できます。<a4j:keepAlive>
RichFaces 3.3.x から、コンポーネントまたはクラス内の注釈として使用できます。私はこれで作業しましたが、非常に役立ちます。例を挙げましょう。
faces-config.xml ファイルで RequestScope 構成が指定されたマネージド Bean。
@KeepAlive
public class Bean {
private String name;
//constructor...
//getters and setters...
}
JSP/Facelets ページ:
<h:form>
<h:outputText value="Write your name" />
<h:inputText value="#{bean.name}" />
<br />
<a4j:commandButton value="Say hello!" reRender="hello" />
</h:form>
<!-- Since this is outside the form, the #{bean.name} value won't be send to the server -->
<h:outputText value="#{'Hello ' + bean.name}" id="hello" />