【发布时间】:2012-07-26 18:58:58
【问题描述】:
我正在第 1 页创建一个简单的搜索表单,在第 2 页我将显示结果。
我想知道使用 @ViewScoped 支持 bean 的最佳方法是什么。以前我不得不使用@SessionScope 来实现这一点。
Page1 - 搜索页面:
<h:form id="documents">
<h4 class="dkblue u-case">Documents Search</h4>
<h:outputLabel for="mainNum" value="mainNumber" />
<p:inputText id="mainNum" value="#{documentBacking.document.mainNumber}"/>
<h:outputLabel for="secNum" value="secNumber" />
<p:inputText id="secNum" value="#{documentBacking.document.secNumber}"/>
<h:outputLabel for="formType" value="Form Type" />
<p:inputText id="formType" value="#{documentBacking.document.formType}"/>
<p:commandButton value="Search" action="#{documentBacking.search}" />
<p:commandButton id="clear" value="Clear" type="reset"/>
</h:form>
Page2 - 结果页面:
<p:dataTable value="#{documentBacking.results}" var="results">
<p:column headerText="Main Number">
<h:outputText value="#{results.mainNumber}" />
</p:column>
<p:column headerText="Secondary Number">
<h:outputText value="#{results.secNumber}" />
</p:column>
<p:column headerText="Form Type">
<h:outputText value="#{results.formType}" />
</p:column>
</p:dataTable>
@ViewScoped 支持 Bean:
@ManagedBean
@ViewScoped
public class DocumentBacking {
private Document document = new Document();
private List<Document> results = new ArrayList<Document>();
public Document getDocument() {
return document;
}
public void setDocument(Document document) {
this.document = document;
}
public List<Document> getResults() {
return results;
}
public void setResults(List<Document> results) {
this.results = results;
}
public String search() {
results = new ArrayList<Document>();
// dummy data
Document doc = new Document();
doc.setMainNumber("1111");
doc.setSecNumber("2222");
doc.setFormType("OTHER");
doc.setSubFormType("TEST");
results.add(doc);
doc = new Document();
doc.setMainNumber("1234");
doc.setSecNumber("4321");
doc.setFormType("SOMETHING");
doc.setSubFormType("TESTER");
results.add(doc);
return "results.xhtml?faces-redirect=true";
}
}
【问题讨论】:
-
您可以通过Flash Scope 使用您自己定义的更广泛的范围。此外,请确保您为此使用正确的 Mojarra 版本,如Object in Flash scope is not available after redirect 问题中所述。
-
有趣的选项。我只是好奇其他人在这种情况下会做什么。带有结果的搜索页面必须是一个非常常见的用例,我很好奇大多数人是如何处理它的,或者什么是处理它的最佳方法。
-
您也可以将这些值作为请求参数或通过会话属性传递,具体取决于您的需要,但如果我想要更轻的解决方案,我会使用请求参数。
-
我使用相同的页面进行搜索和结果,使用
@ViewScopedbean。我认为大多数人都会做同样的事情。 -
@eljunior - 我也是这样做的。在页面上放置一个数据表,当用户单击搜索时,我通过将 update="myDataTable" 放入 p:commandbutton 来更新它。 Catfish - 如果您想保留 2 个单独的页面,您可以探索 bean 的对话范围。我从未尝试过使用它,但它听起来像是您的搜索流程所需要的。
标签: java jsf jsf-2 primefaces