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

ehs*_*n7b 95 jsf jsf-2 managed-bean viewparams managed-property

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

<f:metadata>
  <f:viewParam name="id" value="#{someBean.id}"/>
</f:metadata>
Run Code Online (Sandbox Code Playgroud)

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

@ManagedProperty(value = "#{param.id}")
private Integer id;
Run Code Online (Sandbox Code Playgroud)

Bal*_*usC 142

<f:viewParam>:

示例:

<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" />
Run Code Online (Sandbox Code Playgroud)

private User user;
Run Code Online (Sandbox Code Playgroud)

@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);
}
Run Code Online (Sandbox Code Playgroud)

但是,你必须自己管理的验证,只要usernull通过摆弄FacesContext#addMessage()什么的.


可以同时使用它们@PostConstruct并且includeViewParams是强制性的.您将无法再应用细粒度转换/验证.


也可以看看:


use*_*352 5

2其他差异:

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