【问题标题】:What is the best way to pass data from page1 to page2 using the same backing bean?使用相同的支持 bean 将数据从 page1 传递到 page2 的最佳方法是什么?
【发布时间】: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 问题中所述。
  • 有趣的选项。我只是好奇其他人在这种情况下会做什么。带有结果的搜索页面必须是一个非常常见的用例,我很好奇大多数人是如何处理它的,或者什么是处理它的最佳方法。
  • 您也可以将这些值作为请求参数或通过会话属性传递,具体取决于您的需要,但如果我想要更轻的解决方案,我会使用请求参数。
  • 我使用相同的页面进行搜索和结果,使用 @ViewScoped bean。我认为大多数人都会做同样的事情。
  • @eljunior - 我也是这样做的。在页面上放置一个数据表,当用户单击搜索时,我通过将 update="myDataTable" 放入 p:commandbutton 来更新它。 Catfish - 如果您想保留 2 个单独的页面,您可以探索 bean 的对话范围。我从未尝试过使用它,但它听起来像是您的搜索流程所需要的。

标签: java jsf jsf-2 primefaces


【解决方案1】:

使用自定义范围对您的代码更可靠。 Here 是 JSF 2.0 自定义作用域的示例。

【讨论】:

    【解决方案2】:

    我决定使用f:viewParam's 和f:event type="preRenderView"。这样,我通过查询字符串参数获得了可收藏的页面,并且我在 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";
    }
    

    }

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-28
      • 1970-01-01
      • 2019-01-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多