什么可以使用<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>一样使用requiredvalidatorconverter属性并嵌套一个<f:converter><f:validator> <h:inputText>
  • 如果转换和validation成功,则将其设置为由#{bean.id}值表示的bean属性,或者如果value属性不存在,则将其设置为name id上的请求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请求参数