4

以下を記録する Web アプリケーションの監査証跡機能を実装しようとしています。

  • lastModified (タイムスタンプ)
  • modifiedBy (ユーザー情報)
  • userComment (値変更の理由)

入力フィールドごとに (入力フィールドは、異なるバッキング Bean と異なる valueHolder クラスを持つ複数のフォームに分散しています)。

最初の 2 つ (lastModified と modifiedBy) は、JPA AuditListener と @PrePersit および @PreUpdate メソッドを使用して簡単に実行できます。

3 つ目は、ユーザーの操作が必要なため、少し注意が必要です。ユーザーのコメントを求めるダイアログが最適です。

したがって、(少なくとも) 未解決の問題が 2 つあります。アプリケーションのすべての入力フィールドに対して「グローバルな」valueChangeListener を確立できますか? <f:valueChangeListener>これは、各単一の入力コンポーネントにアタッチせずに可能ですか? 2 番目: ユーザーのコメントを取得するにはどうすればよいですか。私の考えはp:dialog、Web ページ テンプレートに を配置することですが、このダイアログは、どの入力コンポーネントから呼び出されたかを知る必要があります。

4

1 に答える 1

4

アプリケーションのすべての入力フィールドに対して「グローバル」な valueChangeListener を設定できますか? これは、各単一の入力コンポーネントにアタッチせずに可能ですか?

はい、SystemEventListener実行中に実行されPreRenderViewEventます。によって取得されたコンポーネント ツリーをたどって(またはより細かいもの)FacesContext#getViewRoot()であるすべてのコンポーネントを見つけ、メソッドによってを追加する必要があります。この回答も参照してください。システム イベント リスナーを登録する方法: How to apply a JSF2 phaselistener after viewroot gets built?instanceofEditableValueHoldernew YourValueChangeListener()addValueChangeListener()


2 番目: ユーザーのコメントを取得するにはどうすればよいですか。私の考えは、Web ページ テンプレートに ap:dialog を配置することですが、このダイアログは、どの入力コンポーネントから呼び出されたかを知る必要があります。

YourValueChangeListener#processValueChange()問題のコンポーネントを、 によって取得するスコープ付きのリクエストまたはビューのプロパティとして設定できますevaluateExpressionGet()

Recorder recorder = (Recorder) context.getApplication().evaluateExpressionGet(context, "#{recorder}", Recorder.class);
recorder.setComponent(event.getComponent());
// ...

EL を実行し、必要に応じてスコープ内に Bean を自動作成します。Bean は、ユーザー コメントを表すプロパティも保持する必要があります。最後に、あなたの<p:dialog>.

<p>You have edited #{recorder.component.label}, please mention the reason:</p>
...
<h:inputText value="#{recorder.comment}" />
于 2011-09-19T15:30:41.500 に答える