使用相同的backingbean将数据从page1传递到page2的最佳方式是什么



我正在第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>

第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";
    }
}

使用自定义作用域对代码来说更可靠。以下是JSF 2.0自定义作用域的示例。

我决定使用f:viewParamf: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后台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&amp;includeViewParams=true";
}

}

最新更新