0

私は小さなJSFアプリケーションを持っていて、ページの範囲はrequestです。JSFのマネージドBeanに、ロギングuser_idpage nameデータベースへのメソッドが必要です。このメソッドをBeanのコンストラクターに追加すると、ページのスコープがであるため、呼び出されているすべてのメソッドの詳細がログに記録されますrequest

ユーザーがアプリケーションにログインした後に最初にページにアクセスしたときに、上記の詳細を1回だけログに記録するための最良の方法は何ですか?アイデアは、ユーザーがログごとにアクセスしたすべてのページです。これを達成するための最良の方法は何ですか?

私のJSFバージョンは1.1です。

ありがとう

4

2 に答える 2

1

Beanにメソッドを追加し、ページが読み込まれたときにページからメソッドを呼び出すことができます。例えば

これをページに追加します。

<h:outputText value="#{fooBean.logUser}"/>

Beanメソッド:

public void logUser(){
    //log user and page
}

このように、メソッドはページがロードされたときにのみ呼び出されます。メソッドが見つからないというエラーが発生した場合、別のオプションは非表示のフォームハックを使用することです。例えば:

<body onload="document.getElementById('formId:buttonId').click()">
    <h:form id="formId" style="display: none;">
        <h:commandButton id="buttonId" value="submit" action="#{fooBean.logUser()}" />
    </h:form>
    ...
</body>
于 2012-07-23T06:27:58.283 に答える
1

したがって、データベーステーブルにログインして、サイトのさまざまなページへのすべてのユーザーのすべてのアクセスを記録したいのですが、ポストバックのログ記録を避けますか?(ポストバックは、ユーザーがページの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に更新する必要があります。そうすれば、厄介なバグや予期しない動作を回避できます...

于 2012-07-23T08:39:28.457 に答える