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>
:仅在更新模型值阶段设置值(因为它会扩展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
请求参数作为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" />
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)
但是,你必须自己管理的验证,只要user
是null
通过摆弄FacesContext#addMessage()
什么的.
您可以同时使用它们@PostConstruct
并且includeViewParams
是强制性的.您将无法再应用细粒度转换/验证.
2其他差异:
@ManagedProperty
仅适用于由JSF管理的bean,而不适用于由CDI(@Named
)管理的bean ;
<f:viewParam>
仅适用于GET请求的参数. 归档时间: |
|
查看次数: |
53178 次 |
最近记录: |