私はJSF(2)が初めてです。
Struts では、 のような URL からアクションを呼び出すことができますapp.action
。これはアクションを呼び出し、JSP などの結果ページを返します (最初は JSP/HTML はありません)。
JSF で同じことを行うにはどうすればよいでしょうか。(.xhtml からアクションを呼び出す方法を知っています) つまり、マネージド Bean を URL から直接呼び出して、結果ページを取得します。
最初のGETリクエストのデータを準備している場合は、リクエストの(ポスト)コンストラクターでジョブを実行するか、ページに関連付けられているスコープ付きマネージドBeanを表示します。
@ManagedBean
@RequestScoped
public class Bean {
public Bean() {
// Here.
}
@PostConstruct
public void init(){
// Or here, certainly if you rely on injected dependencies like @EJB.
}
}
要求/応答を制御していて、別のページにリダイレクト/ナビゲートする可能性がある場合は、でジョブを実行しpreRenderView
ます。
<f:event type="preRenderView" listener="#{bean.listener}" />
と
public void listener() {
// ...
// You want to redirect?
externalContext.redirect(newURL);
// Or you want to navigate?
navigationHandler.handleNavigation(context, null, "newOutcome");
}
または、すべてのリクエストをフックする場合は、フィルターを使用します。
@WebFilter("/*")
public class MyFilter implements Filter {
// ...
}
あなたが質問しているパターンは、JSF の動作に固有のものではありません。
Struts やSpring MVCなどのリクエストベースのフレームワーク、および古い Model-2 サーブレット/JSP ベースのアプローチは、このように機能しました。
JSF では、何よりもまず、リクエスト URL に自動的にマップされるのはページ (ビュー) です。URL に直接マップされる Bean の概念はありません。また、ビューとの 1:1 の関係を強制するフレームワークを持つ Bean の概念もありません。ただし、バッキング Bean の概念はありますが、これは慣例によるものです。JSF の場合、すべての Bean はビューによって参照されるだけの「ヘルパー Bean」です。
BalusC は、彼の回答で、JSF の要求ベースのフレームワークからいくつかの動作を取得するために現在使用できる一般的な方法を概説しました。JSF 2.2 では、ビュー アクションの導入により、このサポートがわずかに拡張されます。これにより、preRenderViewEvent
.
とはいえ、JSF は非常に柔軟なフレームワークであり、固定されているものはほとんどありません。JSF の動作の多くは、精巧なプラグインとデコレータ システムを介して置換または追加できます。
この使用例では、JSF が URL を (Facelets) ビューにバインドするという事実をオーバーライドすることができ、実際に Bean をリクエストに直接反応させることができます。目的は少し異なりますが、いわゆるビュー ハンドラーをオーバーライドすることで、JavaVDLに対して本質的に行ったことです。
これが本当にあなたがやりたいことなのか、そしてこの方法で作業したいのであれば、JSF があなたにとって最良の選択であるかどうかを自問する必要があります。しかし、JavaVDL (ソースコードはこちら) で概説されている方法を使用すると、これを実行できるはずです。この最後の方法は初心者には適していないことに注意してください。これを自分で実行するには、かなりの JSF 経験が必要です。(あなた、または他の誰かがこの機能を使用したい場合は、OmniFaces の問題リストで問題を作成することを検討してください)。