我正在尝试为我的Web应用程序实现记录的审计跟踪功能:
对于我的每个输入字段(输入字段分布在具有不同支持bean和不同valueHolder类的多个表单上)。
前两个(lastModified和modifiedBy)可以在JPA AuditListener和@PrePersit和@PreUpdate方法的帮助下轻松完成。
第三个有点棘手,因为它需要用户交互。最好是一个要求用户评论的对话框。
所以(至少)有两个未解决的问题:我可以为我的应用程序中的所有输入字段建立一个“全局”valueChangeListener吗?如果没有将<f:valueChangeListener>
附加到每个输入组件,这是否可行?第二:我如何获取用户评论。我的想法是在我的网页模板中放置一个p:dialog
,但是这个对话框需要知道它被调用的输入组件。
答案 0 :(得分:4)
我可以为我的应用程序中的所有输入字段建立一个“全局”valueChangeListener吗?如果没有附加到每个输入组件,这是否可行?
是的,SystemEventListener
期间会执行PreRenderViewEvent
。您需要遍历FacesContext#getViewRoot()
获取的组件树,以查找instanceof
EditableValueHolder
(或更精细的内容)的所有组件,然后添加new YourValueChangeListener()
通过addValueChangeListener()
方法。另请参阅此答案如何注册系统事件侦听器:How to apply a JSF2 phaselistener after viewroot gets built?
第二:我如何获取用户评论。我的想法是在我的网页模板中放置一个p:对话框,但是这个对话框需要知道它被调用的输入组件。
您可以在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}" />