我有简单形式的xhtml页面。此页面用于多个数据表。要指定数据表(等等),我使用GET请求参数。 xhtml页面通过
接收 <f:metadata>
<f:viewParam id="page" name="page" value="#{itemsBean.page}"/>
</f:metadata>
再次按照
等导航规则传递 <navigation-case>
<description>
Global rule for going to the items page from any page
</description>
<from-outcome>items</from-outcome>
<to-view-id>/items.xhtml</to-view-id>
<redirect>
<view-param>
<name>page</name>
<value>#{itemsBean.page}</value>
</view-param>
</redirect>
</navigation-case>
但是如果我在xhtml文件中使用像这样的输入
<h:inputText id="itemName" value="#{itemsBean.name}"
required="true" requiredMessage="Value for this field required!"/>
尝试接受输入中没有文本的表单后,我无法恢复视图参数。 我试图使用隐藏的输入来传递参数
<h:inputHidden id="page" value="#{itemsBean.page}" />
,但似乎验证运行之前,itemsBean.page仍为空。 itemsBean是RequestScoped。我做错了什么?我怎样才能通过这个参数?
感谢您浪费时间。
答案 0 :(得分:3)
您需要将请求参数传递给后续请求。在“普通的vanilla”HTML中你确实使用了<input type="hidden">
,但遗憾的是JSF <h:inputHidden>
不能这样做。如果由另一个输入字段导致一般验证失败,则与<h:inputHidden>
关联的模型值将根本不会更新。
您应该使用<f:param>
组件中的UICommand
来保留后续请求的请求参数。 E.g。
<h:commandButton ...>
<f:param name="page" value="#{param.page}" />
</h:commandButton>
或者,您可以使用<o:form>
的OmniFaces JSF utility library,它基本上使用附加属性<h:form>
扩展includeViewParams
,这样您就可以保留视图参数表单操作URL中的后续请求。
<o:form includeViewParams="true">
...
</o:form>
如果你有多个命令按钮/链接和ajax动作,这可能会更容易,如果你想在非ajax回发期间保留相同的URL,这将是唯一的方法。