什么可以使用<f:元数据>,<f:viewParam>和<f:viewAction>?
任何人都可以澄清如何我们可以使用一般,或在现实世界的例子,这个片段?
<f:metadata> <f:viewParam id="id" value="#{bean.id}" /> <f:viewAction action="#{bean.init}" /> </f:metadata>
处理GET参数
<f:viewParam>
pipe理GET参数的设置,转换和validation。 这就像<h:inputText>
,但是对于GET参数。
下面的例子
<f:metadata> <f:viewParam name="id" value="#{bean.id}" /> </f:metadata>
基本上做到以下几点:
- 通过名称
id
获取请求参数值。 - 如果需要的话,转换并validation它(你可以像使用
<h:inputText>
一样使用required
,validator
和converter
属性并嵌套一个<f:converter>
和<f:validator>
<h:inputText>
) - 如果转换和validation成功,则将其设置为由
#{bean.id}
值表示的bean属性,或者如果value
属性不存在,则将其设置为nameid
上的请求attribtue,以使其可以通过#{id}
风景。
所以,当你打开页面为foo.xhtml?id=10
那么参数值10
就会在视图被渲染之前以这种方式在bean中设置。
至于validation,以下示例将param设置为required="true"
并仅允许10到20之间的值。任何validation失败都将导致显示一条消息。
<f:metadata> <f:viewParam id="id" name="id" value="#{bean.id}" required="true"> <f:validateLongRange minimum="10" maximum="20" /> </f:viewParam> </f:metadata> <h:message for="id" />
对GET参数执行业务操作
你可以使用<f:viewAction>
来<f:viewAction>
这一点。
<f:metadata> <f:viewParam id="id" name="id" value="#{bean.id}" required="true"> <f:validateLongRange minimum="10" maximum="20" /> </f:viewParam> <f:viewAction action="#{bean.onload}" /> </f:metadata> <h:message for="id" />
同
public void onload() { // ... }
不过,自从JSF 2.2(自JSF 2.0以来已经存在<f:viewParam>
)以来, <f:viewAction>
是新的。 如果你不能升级,那么你最好的select是使用<f:event>
。
<f:event type="preRenderView" listener="#{bean.onload}" />
但是, 每个请求都会调用它。 您需要明确检查请求是否不是回发:
public void onload() { if (!FacesContext.getCurrentInstance().isPostback()) { // ... } }
如果您还想跳过“转换/validation失败”的情况,请执行以下操作:
public void onload() { FacesContext facesContext = FacesContext.getCurrentInstance(); if (!facesContext.isPostback() && !facesContext.isValidationFailed()) { // ... } }
这样使用<f:event>
本质上是一种解决方法/破解,这就是为什么<f:viewAction>
在JSF 2.2中引入的原因。
将视图parameter passing给下一个视图
您可以通过将includeViewParams
属性设置为true
或通过添加includeViewParams=true
请求参数来“传递”导航链接中的视图参数。
<h:link outcome="next" includeViewParams="true"> <!-- Or --> <h:link outcome="next?includeViewParams=true">
用上面的<f:metadata>
例子生成基本上如下的链接
<a href="next.xhtml?id=10">
与原始参数值。
这种方法只要求 next.xhtml
在同一个参数上也有一个<f:viewParam>
,否则它不会被传递。
在JSF中使用GET表单
<f:viewParam>
也可以和“纯HTML”GET表单结合使用。
<f:metadata> <f:viewParam id="query" name="query" value="#{bean.query}" /> <f:viewAction action="#{bean.search}" /> </f:metadata> ... <form> <label for="query">Query</label> <input type="text" name="query" value="#{empty bean.query ? param.query : bean.query}" /> <input type="submit" value="Search" /> <h:message for="query" /> </form> ... <h:dataTable value="#{bean.results}" var="result" rendered="#{not empty bean.results}"> ... </h:dataTable>
基本上这个@RequestScoped
bean:
private String query; private List<Result> results; public void search() { results = service.search(query); }
请注意, <h:message>
用于<f:viewParam>
,而不是纯HTML <input type="text">
! 另请注意,当#{bean.query}
为空时,input值将显示#{param.query}
,因为如果出现validation或转换错误,提交的值将不会显示出来。 请注意,这个构造对于JSFinput组件是无效的(它已经在“隐藏”了)。
也可以看看:
- ViewParam vs @ManagedProperty(value =“#{param.id}”)
- JSF 2.0中的通信 – 处理GET请求参数