有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

javajsf:导航

我必须警告你:这个问题可能相当愚蠢,但我现在似乎不能对此置之不理

我有两个托管bean,比如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页面,pageA。jsp(搜索页面)和页面b。jsp(输入页面)。 我想做的是在pageB中放置一个commandbutton,以便打开搜索页面pageA,以某种方式传递参数d9,或者直接在b.insert()之后导航到pageA。我想做的是在插入后显示搜索结果

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

我想到了以下几种可能的解决办法:

  1. 在**B**中包含**A**,并将命令按钮链接到**B.A.search**
  2. 将**d9**作为**hiddenInput**传递,并在**a**中添加一个新方法**searchFromB**(丑陋!)
  3. 把两个豆子合为一个

共 (4) 个答案

  1. # 1 楼答案

    1. 将commandButton操作属性引用添加到B'insert方法

    <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 output”作为从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,它的互联网机器在工作。因此,我不能提供详情

  2. # 2 楼答案

    您应该在faces配置中配置导航流。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

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

    在bean之间共享价值的方法

    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访问这些值。如果你能找到更多关于这项技术的细节,我相信你会得到你想要的

  3. # 3 楼答案

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

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

    如果您的类是托管bean,那么您可以从类B加载类A,并在最后的insert方法中调用A.query()。类A也可以有

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

    faces配置中的参数。xml,加载时不会再次实例化

  4. # 4 楼答案

    JSF1.1/1.2RAW并没有提供一种简单的方法来实现这一点。Seam/Spring都有解决这个问题的方法,您可以做一些事情。JSF2发布后也应该有解决方案

    可能最简单和最方便的方法是将两个bean折叠成一个,并使其成为会话范围。当然,令人担心的是,这个bean不会被删除,并在会话超时之前保持会话状态。耶,内存泄漏

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

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

    然后在另一侧获取参数