我正在第1页和第2页创建一个简单的搜索表单,我将显示结果。
我想知道使用@ViewScoped支持bean的最佳方法是什么。以前我必须使用@SessionScope来实现这一目标。
第1页 - 搜索页面:
<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>
第2页 - 结果页面:
<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 Backing 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";
}
}
答案 0 :(得分:0)
使用自定义范围对您的代码更可靠。 Here是JSF 2.0自定义范围的示例。
答案 1 :(得分:0)
我决定使用f:viewParam
和f:event type="preRenderView"
。这样我就可以通过查询字符串params获得可收藏的页面,并且我在preRenderView监听器的结果页面上生成结果。
我使用与我的问题相同的搜索页。
结果页面:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:p="http://primefaces.org/ui"
xmlns:ui="http://java.sun.com/jsf/facelets">
<f:metadata>
<f:viewParam name="mainNumber" value="#{documentBacking.document.mainNumber}" />
<f:viewParam name="secNumber" value="#{documentBacking.document.secNumber}" />
<f:viewParam name="formType" value="#{documentBacking.document.formType}" />
<f:viewParam name="subFormType" value="#{documentBacking.document.subFormType}" />
<f:event type="preRenderView" listener="#{documentBacking.generateResults}" />
</f:metadata>
...
<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 Backing Bean: @ViewScoped 公共类DocumentBacking {
private Document document = new Document();
private List<Document> results = null;
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 void generateResults() {
results = new ArrayList<Document>();
// dummy data
Document doc = new Document();
doc.setMainNumber("9343");
doc.setSecNumber("71254");
doc.setFormType("OTHER FORMS");
doc.setSubFormType("CALGB");
results.add(doc);
doc = new Document();
doc.setMainNumber("1234");
doc.setSecNumber("4321");
doc.setFormType("SOMETHING");
doc.setSubFormType("MAYO");
results.add(doc);
}
public String search() {
return "results.xhtml?faces-redirect=true&includeViewParams=true";
}
}