gpt4 book ai didi

jsf - JSF 应用程序的审计跟踪 - 全局 valueChangeListener 可能吗?

转载 作者:行者123 更新时间:2023-12-01 01:26:32 26 4
gpt4 key购买 nike

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

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

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

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

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

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

    最佳答案

    Can I establish a "global" valueChangeListener for all input fields in my application? Is this possible without attaching to each single input component?



    是的,有 SystemEventListener PreRenderViewEvent 期间执行.您需要遍历由 FacesContext#getViewRoot() 获得的组件树。查找所有 instanceof 的组件 EditableValueHolder (或更细粒度的)然后添加 new YourValueChangeListener() addValueChangeListener() 方法。另请参阅此答案如何注册系统事件监听器: How to apply a JSF2 phaselistener after viewroot gets built?

    Second: How can I grab the user comment. My idea is to put a p:dialog in my web page template but this dialog needs to know from which input component it is called.



    您可以在 YourValueChangeListener#processValueChange()将有问题的组件设置为您通过 evaluateExpressionGet() 抓取的某个请求或 View 范围的属性.
    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}" />

    关于jsf - JSF 应用程序的审计跟踪 - 全局 valueChangeListener 可能吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7473126/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com