【问题标题】:ViewParam vs @ManagedProperty(value = "#{param.id}")ViewParam 与 @ManagedProperty(value = "#{param.id}")
【发布时间】:2011-06-20 19:26:52
【问题描述】:

这样定义视图参数有什么区别:

<f:metadata>
  <f:viewParam name="id" value="#{someBean.id}"/>
</f:metadata>

并像这样在 ManagedBean 中定义属性:

@ManagedProperty(value = "#{param.id}")
private Integer id;

【问题讨论】:

    标签: jsf jsf-2 managed-bean viewparams managed-property


    【解决方案1】:

    2 其他差异:

    • @ManagedProperty 只能用于 JSF 管理的 bean,不能用于 CDI 管理的 bean (@Named);
      • &lt;f:viewParam&gt; 仅适用于 GET 请求的参数。

    【讨论】:

    • 因此可以使用注解:org.omnifaces.cdi.Param
    【解决方案2】:

    &lt;f:viewParam&gt;:

    示例

    <f:metadata>
        <f:viewParam id="user_id" name="id" value="#{bean.user}"
            required="true" requiredMessage="Invalid page access. Please use a link from within the system."
            converter="userConverter" converterMessage="Unknown user ID."
        />
    </f:metadata>
    <h:message for="user_id" />
    

    private User user;
    

    @FacesConverter("userConverter")。通过http://example.com/context/user.xhtml?id=123 调用页面将通过转换器传递id 参数并将User 对象设置为bean 属性。


    @ManagedProperty:

    • 在 bean 构建后立即设置值。

    • 设置值在@PostConstruct 期间可用,它允许根据设置值轻松初始化/预加载其他属性。

    • 不允许在视图中进行声明式转换/验证。

    • #{param} 的托管属性不允许在比请求范围更广的 bean 上使用,因此 bean 必须是 @RequestScoped

    • 如果您依赖 #{param} 的托管属性出现在后续 POST 请求中,则需要将其作为 &lt;f:param&gt; 包含在 UICommand 组件中。

    示例

    @ManagedProperty("#{param.id}")
    private Long id;
    
    private User user;
    
    @EJB
    private UserService userService;
    
    @PostConstruct
    public void init() {
        user = userService.find(id);
    }
    

    但是当usernull 时,您必须自己管理验证,通过摆弄FacesContext#addMessage() 或其他东西。


    @PostConstructincludeViewParams 都是必需的时,您可以同时使用它们。您将无法再应用细粒度的转换/验证。


    另见:

    【讨论】:

    • 在特殊情况下还有其他方法可以检索请求参数:FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap().get("parametername");
    • @angel:仅当 bean 的范围比请求范围更广时,才会使请求参数上的@ManagedProperty 成为不可能。
    • 嗨@BalusC 我确实依赖于在第二篇文章中使用 managedproperty 从 param.id 检索到的 id 值。如何使用 f:param 包含它?非常感谢
    • @thufir:在更新模型值阶段设置。 postconstruct 远早于此,直接在 bean 的构造和依赖注入之后运行。它在由 &lt;f:event type="preRenderView"&gt; 或即将推出的 JSF 2.2 &lt;f:viewAction&gt; 调用的侦听器方法中可用。
    猜你喜欢
    • 2011-06-02
    • 2013-10-04
    • 2017-09-14
    • 1970-01-01
    • 2012-09-25
    • 2012-09-29
    • 1970-01-01
    • 2015-06-14
    • 2013-10-01
    相关资源
    最近更新 更多