JSF2.2将参数从一个视图传递到另一个视图

时间:2014-06-10 20:47:45

标签: jsf

我正在开发一个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?有什么想法吗?

1 个答案:

答案 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" />

请注意,这是一种黑客攻击,所以让我建议替代方案:

  1. 保持同一页面。由于您可以有条件地渲染元素,因此只需使用rendered="#{not empty searchController.results}"隐藏结果显示。这么容易。

  2. 不要使用POST,但要GET。这正是this question的意义所在(以及更多)。