[英]@ManagedProperty(value = “#{param.id}”) in a non-request Scope Bean
[英]ViewParam vs @ManagedProperty(value = “#{param.id}”)
定义View Params之间有什么区别:
<f:metadata>
<f:viewParam name="id" value="#{someBean.id}"/>
</f:metadata>
并在ManagedBean中定义属性,如下所示:
@ManagedProperty(value = "#{param.id}")
private Integer id;
<f:viewParam>
: 仅在更新模型值阶段设置值(因为它扩展了UIInput
)。
在@PostConstruct
期间,设置值不可用,因此您需要在<f:metadata>
添加额外的<f:event type="preRenderView" listener="#{bean.init}" />
<f:metadata>
来进行初始化/预加载设定值。 从JSF 2.2开始,您可以使用<f:viewAction>
代替。
允许嵌套的<f:converter>
和<f:validator>
进行更细粒度的转换/验证。 甚至可以附加<h:message>
。
可以在任何URL中使用<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
。
如果您依赖#{param}
的托管属性存在于后续POST请求中,则需要在UICommand
组件中将其包含为<f:param>
。
示例 :
@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
都是必需的时,您可以同时使用它们。 您将无法再应用细粒度转换/验证。
2其他差异:
@ManagedProperty
仅适用于由JSF管理的bean,而不适用于由CDI管理的bean( @Named
);
<f:viewParam>
仅适用于GET请求的参数。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.