代码之家  ›  专栏  ›  技术社区  ›  Manrico Corazzi

JSF:导航

  •  1
  • Manrico Corazzi  · 技术社区  · 15 年前

    我得警告你:这个问题可能很愚蠢,但我现在似乎不能完全理解。

    我有两个菜豆,比如A和B:

    class A
    {
        private Date d8; // ...getters & setters
        public String search()
        {
            // search by d8
        }
    }
    
    class B
    {
        private Date d9; //...getters & setters
        public String insert()
        {
             // insert a  new item for date d9
        }    
    }
    

    然后我有两个JSP页面, PJAG.JSP (搜索页)和 JSP (输入页面)。 我想做的是 命令按钮 在里面 帕吉布 打开搜索页面 帕吉亚 传递参数 D9 不知怎的,或者导航到 帕吉亚 直接后 插入() . 我要做的是在插入后显示搜索结果。

    也许只是我看不到清晰、简单的解决方案,但我想知道这里的最佳实践可能是什么,还有……

    我认为这些可能的解决方案:

    1. 包括**b**中的**a**,并将命令按钮链接到**b.a.search**
    2. 将**d9**作为**hiddeninput**传递,并在**a**(丑!)
    3. 把两颗豆子挤成一颗
    4 回复  |  直到 15 年前
        1
  •  1
  •   Priyank    15 年前

    您应该在faces-config.xml中配置导航流。在理想情况下,您将返回一条“状态”消息,该消息将决定流程。阅读以下链接了解更多信息: http://www.horstmann.com/corejsf/faces-config.html http://publib.boulder.ibm.com/infocenter/rtnlhelp/v6r0m0/index.jsp?topic=/com.businessobjects.integration.eclipse.doc.devtools/developer/JSF_Walkthrough8.html

    就将值从一个页面传递到另一个页面而言,您可以使用支持bean。关于支持bean的更多信息: http://www.netbeans.org/kb/articles/jAstrologer-intro.html http://www.coderanch.com/t/214065/JSF/java/backing-beans-vs-managed-beans

    希望我理解并正确回答了你的问题

    在豆子之间分享价值的方法

    FacesContext facesContext = FacesContext.getCurrentInstance();
    Application app = facesContext.getApplication();
    ExpressionFactory elFactory = app.getExpressionFactory();
    ELContext elContext = facesContext.getELContext();
    ValueExpression valueExp = elFactory.createValueExpression(elContext, expression, Object.class);
    return valueExp.getValue(elContext);
    

    在上面的代码中,“表达式”类似于 #{xyzBean.beanProperty} 因为JSF使用单例实例,所以您应该能够从其他bean访问值。如果你能找到更多关于这项技术的细节,我相信你会得到你想要的。

        2
  •  2
  •   Drew    15 年前

    JSF1.1/1.2 raw并不能提供一种简单的方法来实现这一点。Seam/Spring都有办法解决这个问题,您可以做一些事情。JSF 2一旦发布就应该有解决方案。

    可能最简单和最好的方法是将两个bean折叠成一个,并使其成为会话作用域。当然,令人担心的是,在会话超时之前,这个bean不会被删除并一直处于会话中。你的记忆泄露了!

    另一种解决方案是将日期作为get参数传递。例如,您的操作方法可以调用

    FacesContext.getCurrentInstance().getExternalContext().redirect("pageB?d9=" + convertDateToLong(d9));
    

    然后在另一侧获取参数。

        3
  •  1
  •   erdemoo    15 年前
    1. 添加引用到b'insert方法的commandbutton操作属性

    <h:commandLink action="#{b.insert}" value="insert"/>

    1. 在b'insert方法中,添加d9参数作为请求参数。然后从insert方法返回任意字符串。

    facescontext fc=facescontext.getcurrentInstance();
    fc.getExternalContext().getRequestMap().put(“D9”,D9);

    1. 然后转到faces上下文,添加从b到a的导航,其中“from outcome”作为从insert方法返回的任意字符串。但是不要向导航标签添加重定向标签,因为它会破坏来自b的请求,并且您添加的参数(d9)将被清除。

    <from-outcome>return string of insert method</from-outcome>
    <to-view-id>address of A</to-view-id>

    1. 然后,您可以通过在一个类的构造函数或更合适的地方(getter)从请求映射中获取“d9”。如果希望以后跟踪它,可以将其添加到会话范围中,或者将其放置到隐藏变量中。

    在类A中,当导航页时,应初始化A,因为它将被引用。

    facescontext fc=facescontext.getcurrentInstance();
    fc.getExternalContext().getRequestMap().get(“d9”,d9);

    抱歉,我不能提供完整的代码,因为我这里没有IDE,它的互联网机器正在工作。因此我不能透露细节。

        4
  •  0
  •   Vanger    15 年前

    在我看来,最简单的方法是3-rd选项——在同一类中同时使用查询和插入方法。你可以这样做:

    public String query () {
    //... 
    }
    
    public String Insert() {  
     //insert
    return Query(); }
    

    如果类是托管bean,则可以加载类 从班上 并打电话 Quess() 在末尾插入方法中。还班 可以拥有

    <managed-bean-scope>session</managed-bean-scope>

    参数在faces-config.xml中,加载时不会再次实例化。