質問
ある程度詳しく説明します。Jsf はデザイナーの観点から見ると非常に面倒で、手を後ろで縛られながら絵を描こうとするようなものですが、フォームを噛み砕いて大量のデータをリストするのには適しています。したがって、私の会社で作成しているサイトは、jsf 管理ページと jsp ユーザーページです。ユーザーページに複雑なフォームなどがあり、jsf が動き始めると問題が発生します。
質問は次のとおりです。私は純粋な JSP ページにいます。セッション Bean を使用する JSF ページにアクセスする必要があります。そのBeanを初期化するにはどうすればよいですか?jsf ページにいる場合は、データを準備する commandLink を使用できます。私が思いつく唯一のことは、作業を実行して必要なjsfページにリダイレクトするダミーのjsfページを用意することですが、それは一種の醜いものであり、最終的に50のダミーページになりたくありません。むしろ、必要なパラメータを使用してすでにセッション中のBeanを再初期化するメカニズムを見つけたいと思っています。
編集:もう少し詳しく。この特定の状況では、完全なテストまたはフィルターされたテストがあります。これは同じロジックとすべてを備えた同じテストですが、テストがフィルターされている場合は、回答に応じていくつかの質問が除外されます。リンクをクリックすると、2 つのモードのいずれかで要求されたテストが開始されます。リンクはメイン メニュー ツリーの一部であり、多くの兄弟 JSP ページに表示されます。私のタスクは 4 つのリンクを持つことです。testA フル、testA フィルタリング、testB フル、testB フィルタリング。これらはすべて同じ JSF ページ上にあり、それに応じて TestFormBean を再初期化する必要があります。
編集:facelet について少し調べてみました。今は役に立ちませんが、次のプロジェクトでは必ず覚えておきます。
解決
これを解決するには、フォームのみを含む JSF フラグメントを作成してから、 <c:import>
タグを使用して JSF ページに含めます。
ただし、このソリューションは環境によっては少し脆弱になる可能性があります。
編集:Chris Hall の回答を参照してください。 FacesContext
以外では利用できません FacesServlet
.
他のヒント
Faceletsの使用を検討しましたか?これにより、JSF / JSP の違い全体を取り除くことができます (これは代替の優れたビュー コントローラーです)。
また、jsfc タグを使用した優れた設計時のセマンティクスもサポートしています。
<input type="text" jsfc="#{SomeBean.property}" class="foo" />
内部で正しい JSF に変換されるため、既存のツールを使用して作業できます。
次のようなものを使用して、タグ ライブラリ内のマネージド Bean を取得できます。
FacesContext context = FacesContext.getCurrentInstance();
Object myBean = context.getELContext().getELResolver().getValue(context.getELContext(), null, "myBeanName");
ただし、JSF ページのいずれかのタグ ライブラリを使用する必要があります。FacesContext.getCurrentInstance() は、FacesServlet の外部で呼び出された場合には null を返します。
実際、セッションから Bean を削除することでこれを解決したため、jsf ページが呼び出されたときに再度生成する必要があります。次に、コンストラクターのリクエストから get パラメーターを取得します。
カスタム JSP タグ ハンドラーを作成します。その後、セッション スコープから Bean を取得し、その場で初期化できます。これを参照してください チュートリアル 詳細については。