4

我正在尝试为我的 Web 应用程序实现审计跟踪功能,该功能记录:

  • lastModified(时间戳)
  • modifiedBy(用户信息)
  • userComment(值改变的原因)

对于我的每个输入字段(输入字段分布在具有不同支持 bean 和不同 valueHolder 类的多个表单中)。

前两个(lastModified 和 modifiedBy)在 JPA AuditListener 和 @PrePersit 和 @PreUpdate 方法的帮助下很容易完成。

第三个有点棘手,因为它需要用户交互。最好是一个询问用户评论的对话框。

所以有(至少)两个悬而未决的问题:我可以为我的应用程序中的所有输入字段建立一个“全局” valueChangeListener 吗?<f:valueChangeListener>如果不附加到每个单个输入组件,这是否可能?第二:如何获取用户评论。我的想法是p:dialog在我的网页模板中放置一个,但是这个对话框需要知道它是从哪个输入组件调用的。

4

1 回答 1

4

我可以为我的应用程序中的所有输入字段建立一个“全局”valueChangeListener 吗?如果不附加到每个单个输入组件,这是否可能?

是的,SystemEventListenerPreRenderViewEvent. 您需要遍历通过 获得的组件树FacesContext#getViewRoot()以找到所有组件instanceofEditableValueHolder(或更细粒度的),然后new YourValueChangeListener()通过该addValueChangeListener()方法添加。另请参阅此答案如何注册系统事件侦听器:How to apply a JSF2 phaselistener after viewroot gets built?


第二:如何获取用户评论。我的想法是将 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 回答