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


97

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

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

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

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

Answers:


144

<f:viewParam>

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

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

  • 允许嵌套<f:converter>以及<f:validator>更细粒度的转换/验证。甚至<h:message>可以连接。

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

  • 可以在@RequestScopedBean 上使用,但是@ViewScoped如果您希望视图参数能够承受由视图中包含的表单引起的任何验证失败,那么它就必须为Bean ,否则您需要<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此期间可以轻松地基于设置值初始化/预加载其他属性。

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

  • #{param}范围大于请求范围的bean不允许使用的托管属性,因此要求bean是@RequestScoped

  • 如果您依赖#{param}于后续POST请求中存在的托管属性,则需要将其包括<f:param>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()什么的。


可以同时使用@PostConstruct和同时使用它们includeViewParams。您将只能再进行细粒度的转换/验证。


也可以看看:


1
在特殊情况下,还有其他方法可以检索请求参数:FacesContext.getCurrentInstance()。getExternalContext()。getRequestParameterMap()。get(“ parametername”);
angelcervera 2011年

1
@angel:仅当bean的作用域比请求作用域更广时,这使得@ManagedProperty不可能对请求参数进行操作。
BalusC

嗨,@ BalusC,我确实依赖于第二篇文章中使用managedproperty从param.id检索到的id的值。如何使用f:param包含它?非常感谢
sys_debug 2011年

1
@thufir:在更新模型值阶段设置。在bean的构造和依赖注入之后,postconstruct远远早于此。它可以在由<f:event type="preRenderView">JSF 2.2或即将推出的JSF 2.2 调用的侦听器方法中使用<f:viewAction>
BalusC


6

其他2个差异:

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

1
因此,您可以使用注释:org.omnifaces.cdi.Param
dforce
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.