Answers:
<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=true
request参数作为GET查询字符串包含在内。
可以在@RequestScoped
Bean 上使用,但是@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);
}
但是,你必须自己管理的验证,只要user
是null
通过摆弄FacesContext#addMessage()
什么的。
您可以同时使用@PostConstruct
和同时使用它们includeViewParams
。您将只能再进行细粒度的转换/验证。
@ManagedProperty
不可能对请求参数进行操作。
<f:event type="preRenderView">
JSF 2.2或即将推出的JSF 2.2 调用的侦听器方法中使用<f:viewAction>
。