2010-11-18 6 views
0

두 개의 개별 프로젝트 (어쩌면 다른 서버)에 두 개의 JSF/JSF 페이지 및 연관된 관리 빈 BackingBeanA.java 및 BackingBeanB.java를 사용하여 PageA.jsp 및 PageB.jsp로 이름을 지정하십시오.별도의 프로젝트에서 JSF 페이지 간 데이터 전송

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"; 
} 
,174 : 분리 프로젝트)

욕망 PageB.jsp에 PageA.jsp로부터 리디렉션 오브젝트 (의 FilterData)

다음 시도한 통과하는

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이라고합니다 그러나 : 의 FilterData는 BackingBeanA에서 null이 아니었지만, BackingBeanB에 널 (null) - 데이터가 아니었다 양도.

이 데이터 전달을 올바르게 수행하는 방법에 대한 아이디어가 있으십니까?


나는 원래의 질문에 포함해야하는 것 :

자바 1.6.0_22-B03 JSF 1.2 1.2 이클립스 3.6.0 (헬리오스) 톰캣 6.0.28이 (실행해야 JSTL 또한 IE 7.0.5730.13 파이어 폭스) 웹 로직에 : 어떤 HTTP 원하는 없습니다 (하지만 가능 가능하면 3.6.12

시도는) 순수한 JSF로, 아니 자바 스크립트 (기간). 이 위대한 작품을

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

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

결과는 - 리디렉션 웹 페이지에서

... 

     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); 
... 

- 부모 웹 페이지에서

: 나는 (지금은 충분) 문제를 해결하는 방법

- 문자열의 경우. 지금은 괜찮습니다.

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

(주, 당신이 대신 faces-config.xml에서 <managed-property> 필요 JSF 1.x의를 위해, JSF 2.0를 가정하고) 당신은 따라서 실제로 "별도의 웹 애플리케이션 컨텍스트를"의미? – BalusC

답변

0

A는 기본적으로 새로운 요청을 만들 수있는 클라이언트를 지시 리디렉션 : 나중에 가능한 경우에 대해 원하는 것이 무엇

. 모든 매개 변수와 속성을 포함하여 원래 요청이 손실됩니다. 또한 요청 속성이 클라이언트에 전송되지 않았습니다.

웹 응용 프로그램 컨텍스트가 공유되지 않는 경우 (예 : Tomcat의 서버 수준에서 구성 가능하며 crossContext 키워드를 사용하여 둘러보기), 가장 좋은 방법은 요청 매개 변수로 전달하는 것입니다. 데이터가 너무 커서 매개 변수로 전송할 수없는 경우 공유 데이터 소스 (예 : 데이터베이스)에 저장하고 식별자를 매개 변수로 전달하십시오.

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

반대쪽에서는 관리 속성으로 설정할 수 있습니다.

public class BackingBeanB { 

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

    // ... 
} 

"별도의 프로젝트"와

+0

매우 빠른 답변을 보내 주셔서 감사합니다. –

+0

JSF 1.2이며 별도의 webapps 컨텍스트입니다. –

관련 문제