两个独立项目中的两个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?
谢谢, 约翰
答案 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
代替