我是JSF的初学者,我想在未来的网站上编写一些搜索栏。
我制作了两个页面:index.xhtml
和search.xhtml
,我尝试将参数从index.xhtml
传递到search.xhtml
,所以我做了一个小公式:
<!-- index.xhtml -->
<h:form id="Form_search">
<h:inputText class="search_bar_text" binding="#{se}"></h:inputText>
<h:button class="search_bar_button" outcome="search">
<f:param name="search" value="#{se.value}" />
</h:button>
</h:form>
总结一下,我想将inputText的内容发送到search.xhtml
但是有一个问题:当我点击提交按钮时,没有传递任何参数,因此我没有/search.xhtml?search=foobar
而只有/search.xhtml
。
我也试过这个,但这也不起作用:
<!-- index.xhtml -->
<h:form id="Form_search">
<h:inputText class="search_bar_text" binding="#{se}"></h:inputText>
<h:button class="search_bar_button" outcome="search.xhtml?search=#{se.value}">
</h:button>
</h:form>
有人可以向我解释这个问题的原因以及如何解决这个问题吗?
答案 0 :(得分:3)
在呈现HTML输出期间评估<f:param value>
和<h:button outcome>
,而不是在&#34;提交&#34;您似乎期望的形式。请注意,这里实际上没有提交表单的方法。如果您能够阅读HTML code,您应该在JSF生成的HTML输出中看到它,您可以通过右键单击,在Web浏览器中查看源看到它。
将其修复为真正的GET表单。您根本不需要<h:form>
,<h:inputText>
或<h:button>
。你不想要一个POST表格。您似乎不想将输入绑定到bean属性。你不想要一个普通的导航按钮。
<form id="form_search" action="search.xhtml">
<input name="search" class="search_bar_text" />
<input type="submit" class="search_bar_button" />
</form>
是的,你可以在JSF中使用纯HTML。
如果你真的,真的出于某种原因需要为此目的使用JSF组件,那么你也可以使用这种POST-redirect-GET-with-view-params技巧。
首先将其添加到index.xhtml
和search.xhtml
:
<f:metadata>
<f:viewParam name="search" value="#{bean.search}" />
</f:metadata>
然后使用此表格:
<h:form id="form_search">
<h:inputText value="#{bean.search}" styleClass="search_bar_text" />
<h:commandButton styleClass="search_bar_button" action="search?faces-redirect=true&includeViewParams=true" />
</h:form>
如果您打算在其上使用JSF验证,这可能会有意义。但即便如此,这并不能防止最终用户手动打开带有无效参数的URL。您最好在<f:viewParam>
上向search.xhtml
本身添加验证。