したがって、データベーステーブルにログインして、サイトのさまざまなページへのすべてのユーザーのすべてのアクセスを記録したいのですが、ポストバックのログ記録を避けますか?(ポストバックは、ユーザーがページの1つでアクションを実行し、アクションを受け取るURLがアクションが開始されたURLと同じである場合に発生します。これは、JSF、特に2より前のバージョンで非常に一般的です。バツ)
したがって、基本的に、必要なのは、ポストバックがいつ発生するかを認識し、その条件下でのロギングを回避することです。ResponseStateManagerは、ポストバック要求を処理するときにisPostback(...)
戻るメソッドを提供します。true
FacesContext context = FacesContext.getCurrentInstance();
ResponseStateManager rsm = context.getRenderKit().getResponseStateManager();
if (!rsm.isPostback(context)) {
// do whatever you need here
}
ちなみに、そのコードをBeanコンストラクターに入れることはお勧めしません。これは、さまざまなJSF実装が、Beanのコンストラクターを呼び出した直後にいくつかのBeanライフサイクル管理タスクを実行する可能性があるためです。ロジックを「Bean初期化プロセス」の一部にする必要があると思われる場合は、そのコードを@PostConstructアノテーションが付けられた別のパブリックメソッドに配置することをお勧めします。
ただし、特定のページへのすべてのアクセスでそのロジックを実行する場合は、マネージドBeanを使用すると、そのロジックをすべてのBeanにコピーして貼り付けるか、そのロジックを使用して抽象/基本クラスを定義し、すべてを作成する必要があります。 Beansはそれを拡張します。すべてのマネージドBeanをPOJOの概念にできるだけ近づけたいので、別の方法として、同じロジックを実装することを検討しますが、フェーズに関連付けられたPhaseListenerRENDER_RESPONSE
を使用します。それはあなたに内部(はるかにクリーン)で用途の広いアプローチを提供します:いつかレンダリングの代わりにアクションをログに記録したい場合は、リスナーをフェーズなどに結び付けます。INVOKE_APPLICATION
PD:ある種のキャッシュまたは「バッチ処理」手法を使用して、これらのレコードをデータベースに記録していることを願っています。そうしないと、サイトを閲覧しているユーザーが多すぎる場合に、パフォーマンスに顕著な影響があります。また、私自身の意見では、JSFバージョンを少なくとも1.2に更新する必要があります。そうすれば、厄介なバグや予期しない動作を回避できます...