JSF页面之间在单独项目中的数据传输

时间:2010-11-18 18:22:13

标签: jsp jsf

两个独立项目中的两个JSF / JSF页面和关联的托管bean(可能是不同的服务器) 使用BackingBeanA.java和BackingBeanB.java将它们命名为PageA.jsp和PageB.jsp(同样,单独的项目)

欲望是从PageA.jsp重定向到PageB.jsp并传递一个对象(FilterData)

尝试了以下内容:

BackingBeanA.java

public String startPageB() {

    try {

    FilterData filterData = ...

        FacesContext facesContext = FacesContext.getCurrentInstance();

        HttpServletRequest request = (HttpServletRequest) 
            facesContext.getExternalContext().getRequest();
        request.setAttribute("FILTERDATA",filterData);

        ExternalContext externalContext = facesContext.getExternalContext();
        externalContext.setRequest(request);

        externalContext.redirect("http://localhost:8080/PageB/");

    } 
    catch (IOException e) {
        e.printStackTrace();
        System.out.println(e);
    }

    return "redirectedData";
}

BackingBeanB.java(在一个单独的项目中,可以是单独的服务器)

public String getBeanAData() {

    FacesContext facesContext = FacesContext.getCurrentInstance();

    HttpServletRequest request = (HttpServletRequest) 
        facesContext.getExternalContext().getRequest();

    FilterData newFilterData = (FilterData) 
        request.getAttribute("FILTERDATA");

... do stuff
return null;
}

结果:     但是,调用getBeanAData:     在BackingBeanA中,filterData不为null,但在BackingBeanB中为null - 未传输数据。

有关如何正确执行此数据传递的任何想法?


我应该包含在原始问题中:

Java 1.6.0_22-b03 JSF 1.2 JSTL 1.2 Eclipse 3.6.0(Helios) Tomcat 6.0.28(也需要在Weblogic上运行) IE 7.0.5730.13 Firefox:3.6.12

如果可能,尝试是纯JSF,不需要HTTP(但可能),没有JavaScript(句点)。

我是如何解决问题的(现在已经足够好了):

来自父网页 -

...

        FacesContext facesContext = FacesContext.getCurrentInstance();
        ExternalContext externalContext = facesContext.getExternalContext();

        String initialUrl = externalContext.getInitParameter("RedirectUrl");

        String requestDataA = "?ValueA=" + activity.getID();
        String requestDataB = "&ValueB=" + activity.getName();

        redirectUrl = initialUrl + requestDataA + requestDataB;

        externalContext.redirect(redirectUrl);
...

来自重定向的网页 -

...
        String ownerName = (String) FacesContext.getCurrentInstance().
           getExternalContext().getRequestParameterMap().get("ValueB");

        String itemId = (String) FacesContext.getCurrentInstance().
           getExternalContext().getRequestParameterMap().get("ValueA");
...

结果是这对于字符串很有效。现在可以了。

如果可能的话,我希望以后能够:

The same thing, but passing an object.  
I know I cannot do that on the request line, but I thought there was a way
similar to a standard HTTP setup where a request attribute is set and the
destination page gets it with a doPost method (do I have this wrong?).

The BalusC answer indicates this is not possible.  
So is it really not possible to have a JSF page redirect (starup or whatever) 
to an external page, and pass it an object without going to shared storage?

谢谢, 约翰

1 个答案:

答案 0 :(得分:0)

重定向基本上指示客户创建全新的请求。原始请求(包括其所有参数和属性)将丢失。此外,请求属性未发送给客户。

如果这些webapp上下文不是共享的(可以在服务器级配置,例如Tomcat,请使用crossContext关键字查看),那么最好的办法是将其作为请求参数传递。如果数据太大而无法作为参数发送,则将其存储在共享数据源(例如数据库)中的某处,并将其标识符作为参数传递。

externalContext.redirect("http://localhost:8080/PageB?filterData=" + filterData);

在另一方面,您可以将其设置为托管属性。

public class BackingBeanB {

    @ManagedProperty(value="#{param.filterData}")
    private String filterData;

    // ...
}

(注意,我假设JSF 2.0,对于JSF 1.x,您需要在<managed-property>faces-config.xml代替