我正在开发一个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 ?有什么想法吗?
如果我理解正确,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" />
请注意,这是一种hack,所以让我建议替代:
保持在同一页面。由于您可以有条件地呈现元素,因此只需使用
rendered="#{not empty searchController.results}"
隐藏结果显示。那么容易。不要使用POST,而是使用GET。这正是这个问题的问题所在(以及更多)。