【问题标题】:JSF move / redirect to other page with dataJSF 将数据移动/重定向到其他页面
【发布时间】:2017-12-19 14:02:00
【问题描述】:

我有一个显示数据表的 JSP 页面 (page1.jsp)。表格中还有这样的按钮:

<h:column>
    <f:facet name="header" >
        <h:outputText value=""/>
    </f:facet>
    <h:commandButton value="Show items" action="#{firstBean.displayItems}" immediate="true" />
</h:column>

豆子:

public void displayItems() throws IOException {
    MyClass theClass = (MyClass) dataTable.getRowData();
    String theId = theClass.getIdentityNumber();
    // ...
}

当我们单击按钮时,我想移动到另一个 JSP 页面(page2.jsp)。在第 2 页上,还有一个数据表。该表是通过调用一个名为“facade”的 bean 和一个参数(String - id)来创建的。即当按钮被按下时,我想被移动到 JSP 页面 2,这个页面将显示一个基于这样的调用的数据表:

myList = facade.getDeliveriesById(theId);

所以第 2 页依赖于第 1 页中的内容,要么是字符串 id,要么是否可以以某种方式设置列表?

我猜问题是:

  • 我是否应该在“firstBean.displayItems”中使用“get”参数在提取此 ID 后重定向到 jsp 页 2(见上文)?
  • 有没有办法在“firstBean.displayItems”中的第 2 页设置要使用的列表?

在 JSF(带有数据)中从一页转到另一页的正常方式是什么?

【问题讨论】:

    标签: java jsf redirect


    【解决方案1】:

    在 JSF 1.x 中,通常的方法是返回 String 作为导航案例结果。

    public String displayItems() throws IOException {
        MyClass theClass = (MyClass) dataTable.getRowData();
        String theId = theClass.getIdentityNumber();
        return "page2";
    }
    

    结合faces-config.xml中的以下条目:

    <navigation-rule>
        <navigation-case>
            <from-outcome>page2</from-outcome>
            <to-view-id>/page2.jsf</to-view-id>
        </navigation-case>
    </navigation-rule>
    

    然后它会转到page2.jsf

    在 JSF 2.x 上,您不需要 faces-config.xml。只需返回不带扩展名的确切文件名,例如"page2" 然后 JSF 会自动定位正确的视图。这称为implicit navigation


    更新:您似乎每个页面都有一个“控制器”bean,并且您希望在这些 bean 之间共享数据而不引用 other bean页。很合理。这可以通过将数据拆分到另一个托管 bean 中来实现,该 bean 将作为托管属性注入到两个“控制器”bean 中。

    例如

    public class ControllerBean1 {
        private DataBean dataBean;
    
        public String submit() {
            MyClass theClass = (MyClass) dataTable.getRowData();
            String theId = theClass.getIdentityNumber();
            dataBean.setTheId(theId);
            return "page2";
        }
    
        // ...
    }
    

    还有

    public class ControllerBean2 {
        private DataBean dataBean;
    
        // ...
    }
    

    您可以通过page2 访问它,如下所示:

    <h:outputText value="#{controllerBean2.dataBean.theId}" />
    

    在 JSF 1.x 中,您需要在 faces-config 中通过 &lt;managed-property&gt; 注入它。您可以在this article 中找到示例。在 JSF 2.x 中,您可以使用 @ManagedProperty 对托管属性进行注释。 在以后的问题中,请提及您正在使用的 JSF 版本。这样我们就可以给出更详细的适合答案,而不会产生噪音。 JSF 2.x 在处理事情的方式上有很多不同(改进)。

    【讨论】:

    • 第 2 页如何获取“theId”?
    • 只需像#{bean.theId}这样以通常的JSF方式访问bean属性。
    • 只是 page2 使用了不同的“ManagedBean”(或控制器),所以我认为这可能很难。
    • 你想得很辛苦,是的。不要那样做。只需访问同一个bean。如有必要,只需将共享数据拆分到另一个 bean 中,并将其作为托管属性注入两个“控制器”bean 中。
    • 考虑重定向而不是转发,DataBean 的作用域是什么?它必须是会话,对吗?因为低于这个值的任何东西都会在重定向时消失,对吧?
    猜你喜欢
    • 2012-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-09
    • 2017-05-01
    • 1970-01-01
    • 2018-07-10
    相关资源
    最近更新 更多