像这样定义视图参数有什么区别:
<f:metadata>
<f:viewParam name="id" value="#{someBean.id}"/>
</f:metadata>
在ManagedBean中定义属性,如下所示:
@ManagedProperty(value = "#{param.id}")
private Integer id;
发布于 2011-02-04 01:06:29
UIInput
).@PostConstruct
期间不可用,因此您需要在内部添加一个,以便根据设置的值执行初始化/预加载。从JSF2.2开始,您可以使用<f:viewAction>
来代替。使用的includeViewParams
属性或任何URL中的includeViewParams=true
请求参数,可以将
@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属性。
紧跟在bean的construction.之后的
@PostConstruct
期间可用,这允许基于设置值轻松初始化/预加载其他属性。对于范围大于请求范围的bean,不允许使用#{param}
的
@RequestScoped
.#{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);
}
但是,每当user
为null
时,您必须通过摆弄FacesContext#addMessage()
或其他东西来管理验证。
当@PostConstruct
和includeViewParams
都是强制的时,您可以同时使用它们。你将不能再应用细粒度的转换/验证。
另请参阅:
https://stackoverflow.com/questions/4888942
复制相似问题