我正在开发一个JSF应用程序,其主页有一个搜索输入字段,带有一个命令按钮来提交搜索。用户单击搜索按钮后,应搜索并显示结果页面。我将参数从主视图传递到结果视图时遇到问题。我的代码如下:
<h:form id="searchForm">
<p:inputText styleClass="enterSearch" size="50" value="#{searchController.searchText}" onkeypress="if (event.keyCode === 13) {document.getElementById('searchForm:submitSearch').click();
return false;
}"/>
<p:commandButton id="submitSearch" styleClass="enterSearch" value="Search" label="Search" action="#{searchController.search(searchController.searchText)}" />
</h:form>
Bean是
@ManagedBean(name = "searchController")
@ViewScoped
public class SearchController implements Serializable {
.....
public String search(String query) {
//What goes here? Use FacesContext Attributes?
return "searchResults";
}
...
搜索方法返回searchResults.xhtml页面 此页面显示搜索结果。如何将搜索查询传递给searchResults视图并初始化searchResults的支持bean?有什么想法吗?
答案 0 :(得分:2)
如果我理解正确,SearchController
实际上应该将结果(而不是查询)传递给searchResults
视图。我这样做的方法是将search
方法移到结果页面:
<强> searchResults.xhtml:强>
<f:metadata>
<f:viewParam name="searchQuery" value="#{searchController.searchText}" />
<f:viewAction listener="#{searchController.update()}" />
</f:metadata>
<h:dataTable value="#{searchController.results}">
<!-- your data -->
</h:dataTable>
<强> SearchController.java:强>
@ManagedBean
@ViewScoped
public class SearchController implements Serializable {
private String searchText; // +getter/setter
private List<String> results; // +getter
public void update() {
results = Arrays.asList(new String[] {"My", "Results"});
}
}
现在,您应该只需将搜索表单指向searchResults
网站:
<h:inputText value="#{searchController.searchText}" />
<h:commandLink action="searchResults" value="Search" />
请注意,这是一种黑客攻击,所以让我建议替代方案:
保持同一页面。由于您可以有条件地渲染元素,因此只需使用rendered="#{not empty searchController.results}"
隐藏结果显示。这么容易。
不要使用POST,但要GET。这正是this question的意义所在(以及更多)。