- - PR -
JSF FacesServletの動作について
1
投稿者 | 投稿内容 | ||||
---|---|---|---|---|---|
|
投稿日時: 2006-04-14 19:25
いつも参考にさせて頂いております。
初投稿ですが、宜しくお願いします。 現在、JSFの導入を検討しております。 FacesServlet内で各アクション実行時に前処理を行いたいと 考えておりますが、FacesServletの動作について悩んでおります。 具体的には、FacesServletのservlceメソッド内に処理を記述し、 処理時間やHTTPヘッダ情報などログへ出力する事を検討をしています。 事前調査として簡単なサンプルアプリケーションを作成し実行したところ、 1アクションに対してFacesServletが2回起動されているのでは? との懸念を持ちました。 以下は1アクションに対するFacesServletの開始・終了の状況、 およびPhaseLister機能を使用して処理フェーズのダンプを出力したものです。 DEBUG 17:43:28,840 javax.faces.webapp.FacesServlet service service begin INFO 17:43:28,840 phaselistener.MyPhaseListener beforePhase BEFORE]RESTORE_VIEW(1) INFO 17:43:28,855 phaselistener.MyPhaseListener afterPhase AFTER]RESTORE_VIEW(1) INFO 17:43:28,855 phaselistener.MyPhaseListener beforePhase BEFORE]APPLY_REQUEST_VALUES(2) INFO 17:43:28,855 phaselistener.MyPhaseListener afterPhase AFTER]APPLY_REQUEST_VALUES(2) INFO 17:43:28,871 phaselistener.MyPhaseListener beforePhase BEFORE]PROCESS_VALIDATIONS(3) INFO 17:43:28,871 phaselistener.MyPhaseListener afterPhase AFTER]PROCESS_VALIDATIONS(3) INFO 17:43:28,871 phaselistener.MyPhaseListener beforePhase BEFORE]UPDATE_MODEL_VALUES(4) INFO 17:43:28,871 phaselistener.MyPhaseListener afterPhase AFTER]UPDATE_MODEL_VALUES(4) INFO 17:43:28,871 phaselistener.MyPhaseListener beforePhase BEFORE]INVOKE_APPLICATION(5) INFO 17:43:28,871 phaselistener.MyPhaseListener afterPhase AFTER]INVOKE_APPLICATION(5) DEBUG 17:43:28,871 javax.faces.webapp.FacesServlet service service end DEBUG 17:43:28,887 javax.faces.webapp.FacesServlet service service begin INFO 17:43:28,887 phaselistener.MyPhaseListener beforePhase BEFORE]RESTORE_VIEW(1) INFO 17:43:28,887 phaselistener.MyPhaseListener afterPhase AFTER]RESTORE_VIEW(1) INFO 17:43:28,887 phaselistener.MyPhaseListener beforePhase BEFORE]RENDER_RESPONSE(6) INFO 17:43:28,918 phaselistener.MyPhaseListener afterPhase AFTER]RENDER_RESPONSE(6) DEBUG 17:43:28,933 javax.faces.webapp.FacesServlet service service end この内容を見ますと、Restore View フェーズから Invoke Application フェーズ までが行われた後に一度 FacesServletを終了。 再度、FacesServletが起動され、Restore Viewフェーズと Render Response フェーズ が行われています。 書籍などで情報を調べてもこのような順序で各フェーズの処理が行われるとは 記述されておらず、JSFの仕様なのかどうか判断ができていない状態です。 1アクションに対する前処理は1度のみ実行したいと考えておりますので、 JSFの仕様であれば諦めて他の方式を検討しようと思っておりますが、 結論が出せずに悩んでおります。 この事象の原因、または解決のヒントを教えて頂ければと思います。 ちなみに、サンプルは以下の機能で実装しました。 ・JSPを2ファイル(page1.jsp, page2.jsp)作成 ・page1.jspのボタンはアクションメソッドをバインディング ・管理Beanを作成(アクションメソッドは"success"の戻り値を返却するのみ) ・faces-config.xmlにはpage1.jsp から page2.jspへの遷移を記述 ※page1.jspのアクションで"success"がReturnされたらばpage2.jspへ遷移 ・FacesServlet をコピーしログ出力機能を実装した拡張版FacesServletを実装。 ・web.xmlには、拡張版FacesServletを登録。 宜しくお願い致します。 | ||||
|
投稿日時: 2006-04-14 19:30
基本事項を記載していませんでした。
以下補足します。 環境 JSF1.1 MyFaces1.1.1 | ||||
|
投稿日時: 2006-04-15 04:17
faces-config.xmlにredirectの指定がありませんか?
redirectの場合は「Invoke Application」フェーズのときにNavigationHandlerImplの中でExternalContext#redirect()が呼ばれます。 同時にFacesContext#responseComplete()も呼ばれますので、後のフェーズをスキップしてリダイレクトレスポンス(HTTPステータスコード3xx)をクライアントに返します。 で、クライアントからリダイレクトのためにリクエストが再発行されるので、再度「Restore View」フェーズから処理が開始されます。 | ||||
|
投稿日時: 2006-04-15 04:26
こういったケースの場合、FacesServletを拡張するのではなく、ServletのFilter機構を使ってあげた方がエレガントだと思います。 FacesServletもfinalで定義されていて、「継承しないでね」って暗に主張しているようですので。 | ||||
|
投稿日時: 2006-04-17 10:01
t_yamoさん
ご回答ありがとうございます。 ご指摘のとおり、faces-config.xmlにredirectを指定しています。 これが原因ですね。 ただ、URLをアクセス統計に使用したいという要望もありredirect指定を 外すことはできないので、前処理の実装でカバーする必要がありそうです。
FacesServletのfinal指定は私も気にはなっていまして、「拡張しちゃって 良いのかなぁ・・・」と思いつつ実装していました。 仰るとおり、ServletFilterを使用した方式を検討してみます。 どうもありがとうございました。 |
1