ViewParam vs @ManagedProperty(value =“#{param.id}”)

时间:2011-02-03 16:45:18

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

定义View Params之间有什么区别:

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

在ManagedBean中定义属性,如下所示:

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

2 个答案:

答案 0 :(得分:142)

<f:viewParam>

  • 仅在更新模型值阶段设置值(因为它扩展了UIInput)。

  • @PostConstruct期间设置值不可用,因此您需要在<f:event type="preRenderView" listener="#{bean.init}" />内额外<f:metadata>根据设置值进行初始化/预加载。从JSF 2.2开始,您可以使用<f:viewAction>代替。

  • 允许嵌套<f:converter><f:validator>进行更细粒度的转换/验证。即使是<h:message>也可以附加。

  • 可以在任何网址中使用<h:link>includeViewParams请求参数的includeViewParams=true属性作为GET查询字符串包含在内。

  • 可以在@RequestScoped bean上使用,但如果您希望视图参数在视图中包含的表单导致的任何验证失败后仍然存在,则它需要bean为@ViewScoped,否则您需要在命令组件中<f:param>手动保留后续请求的所有请求参数。

示例

<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期间设置值可用,可根据设定值轻松初始化/预加载其他属性。

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

  • 对于范围大于请求范围的bean,不允许#{param}的托管属性,因此bean必须为@RequestScoped

  • 如果您在后续POST请求中依赖#{param}的托管属性,则需要将其<f:param>包含在UICommand组件中。

示例

@ManagedProperty("#{param.id}")
private Long id;

private User user;

@EJB
private UserService userService;

@PostConstruct
public void init() {
    user = userService.find(id);
}

但是,您必须通过摆弄FacesContext#addMessage()或其他内容,在usernull时自行管理验证。


当<{3}}和includeViewParams都是强制性的时,您可以使用它们。您将无法再应用细粒度转换/验证。


另见:

答案 1 :(得分:5)

其他2个差异:

  • @ManagedProperty仅适用于由JSF管理的bean,而不适用于由CDI管理的bean(@Named);
    • <f:viewParam>仅适用于GET请求的参数。