【问题标题】:How to set or inject request parameters in a managed bean?如何在托管 bean 中设置或注入请求参数?
【发布时间】:2012-02-18 00:45:15
【问题描述】:

我正在使用多个 PrimeFaces <p:remoteCommand/>s 来调用页面上的各种动作侦听器。在 javascript 调用中,我正在传递参数。这些参数到达请求参数映射中。

现在,我可以从动作侦听器本身的映射中提取参数。然而,我想要的是动作侦听器不必这样做。相反,他们应该只检查 bean 中的适当值是否不为空并采取相应措施。

我想将其集中在一个事件中,或者更好的是,以某种方式将请求参数值自动注入到 bean 中。

所以我的问题是:

  1. 在调用任何操作侦听器之前,我是否可以处理一种事件类型来处理请求参数?
  2. 更好的是,有没有办法自动将请求参数注入到 bean 属性中?

【问题讨论】:

    标签: java jsf-2 primefaces


    【解决方案1】:

    如果托管 bean 是请求范围的,那么您可以为此使用 @ManagedProperty。请求参数映射已经在 #{param} 可用的 EL 上下文中。

    @ManagedProperty("#{param.foo}")
    private String foo;
    

    如果托管 bean 的范围更广,那么您不能为此使用@ManagedProperty。但是,如果您正在使用 CDI 或可以使用它,那么您可以为此使用 homegrow 注释。

    @Inject @HttpParam
    private String foo;
    

    在更广泛的范围内 JSF 托管 bean 的替代方法是 <f:viewParam> 标记。我无法从经验中判断这是否可以与<p:remoteCommand> 结合使用,但理论上它应该同样有效。另见ViewParam vs @ManagedProperty(value = "#{param.id}")

    【讨论】:

    • bean 是视图范围的。抱歉,我认为这是由我使用 <p:remoteCommand/> 的事实所暗示的,它提供了一种从 javascript 调用动作侦听器然后更新部分页面的方法。这种事情通常不适用于请求范围的 bean。我已经开始使用每页阶段监听器,但现在有点尴尬。
    • 你最好的选择是<f:viewParam>
    • 我开始阅读 ViewParam 与 @ManagedProperty。首先,我不知道<f:viewParam/> 可以用于除了编码到 URL 中的参数之外的任何东西。其次,根据那篇文章,视图参数是在更新模型值阶段设置的,这是应用请求值之后的两个阶段,我假设是调用动作侦听器的地方。我可能已经走了……我会开始彻底阅读它。谢谢。
    • Action 监听器在 Invoke Action 阶段被调用 :) Apply Request Values 阶段只在视图状态下设置请求参数。 <f:viewParam> 允许您将请求参数绑定到模型。
    • 谢谢。我刚刚添加了<f:viewParam name="comment" value="#{myBean.comment}"/>,它起作用了。我无法相信它是多么简单,毕竟有相位监听器之类的东西。视图参数的双重用途有点误导。我一直认为它是针对 GET 参数的。再次感谢@BalusC。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-01
    相关资源
    最近更新 更多