2009-02-26 47 views
5

我有兩個系統正在嘗試集成。一個基於原始的servlet,新的基於JSF和IceFaces。我正試圖促成跨系統登錄。這個想法是,我在舊系統中有一個按鈕,將適當的信息發佈到新站點並記錄下來。手動生成Faces上下文

那麼,理想情況下,我想只使用一個普通的舊servlet來方便在新網站上。轉到新網站的Servlet,完成它需要做的事情並轉發到儀表板。

我們的安全性是通過託管bean處理的。但是,到達Servlet的時候,沒有任何面部上下文。那麼,我將如何創建一個新的面孔環境?

我有一個備份計劃,我可以隨時鏈接到一個虛擬的.iface頁面,它將爲我創建FacesContext,然後創建一個支持bean,當它獲得實例化時會做些什麼,然後轉發到主頁面。但是這感覺非常像黑客。

任何幫助,將不勝感激!

編輯:我走了回去的路。基本上,我張貼到網頁,像這樣:

<f:view> 
    <ice:outputText value="#{EntryPoint}"/> 
</f:view 

的支持bean看起來像這樣...

public EntryPoint() { 
     try { 
     HttpServletRequest request = (HttpServletRequest) FacesContext.getCurrentInstance().getExternalContext().getRequest(); 
     HttpServletResponse response = (HttpServletResponse) FacesContext.getCurrentInstance().getExternalContext().getResponse(); 
     String loginID = request.getParameter("loginID"); 
     //Do some code to load the user/permissions 
     response.sendRedirect(
      //The appropriate page 
     ); 
     } catch (IOException ex) { 
     logger.error(null, ex); 
     } catch (SQLException ex) { 
     logger.error(null, ex); 
     } 
    } 

這仍然感覺就像一個黑客,但我不知道怎麼去解決這個。理想情況下,我將POST發送到servlet,獲取loginID,構建用戶並將其直接放入托管bean中。但是,這個時候FacesContext並不存在。

還有其他想法嗎?

回答

4

我不確定在這種情況下「site」的含義。

有兩點要注意:

  • 託管bean將永遠是提供它們所定義的Web應用程序(WAR)之外。
  • FacesContext對象實例最終創建並由FacesServlet.service處置,因此請求應該通過此servlet。嘗試在其他情況下創建上下文可能會導致未定義的行爲。

考慮到這一點,你可以創建這樣一個請求序列:

FacesServlet (mapping: /faces/*) 
-> /faces/jsfPage.jsp (a JSP with JSF controls) 
    -> DispatchBean (calls ExternalContext.dispatch("/AnotherServlet") 
     -> AnotherServlet 

jsfPage。JSP包含:

<f:view> 
    <h:outputText value="#{dispatchBean.dispatch}" /> 
</f:view> 

的 「調度」 屬性解析爲bean方法 「getDispatch」:

public String getDispatch() { 
    FacesContext context = FacesContext.getCurrentInstance(); 
    try { 
     context.getExternalContext().dispatch("/FacesClientServlet"); 
    } catch (IOException e) { 
     throw new FacesException(e); 
    } 
    return null; 
} 

哪個分派到這個servlet:

public class FacesClientServlet extends javax.servlet.http.HttpServlet 
     implements javax.servlet.Servlet { 

    static final long serialVersionUID = 1L; 

    @Override 
    protected void doGet(HttpServletRequest request, 
      HttpServletResponse response) throws ServletException, IOException { 

     FacesContext context = FacesContext.getCurrentInstance(); 
     ELContext elContext = context.getELContext(); 
     ExpressionFactory expressionFactory = context.getApplication() 
       .getExpressionFactory(); 
     ValueExpression expression = expressionFactory.createValueExpression(
       elContext, "#{myBean.text}", Object.class); 
     Object value = expression.getValue(elContext); 

     ResponseWriter writer = context.getResponseWriter(); 
     writer.write("" + value); 

    } 

} 

從一個發出值管理bean「myBean」:

public class MyBean { 

    private final String text = "Hello, World!"; 

    public String getText() { 
     return text; 
    } 

} 

這一切都非常複雜,我不會甘心做任何事情。


的替代,這可能會與自己的後果,就是創建自己的背景是這樣的:

public class ContextServlet extends javax.servlet.http.HttpServlet implements 
     javax.servlet.Servlet { 
    static final long serialVersionUID = 1L; 

    private FacesContextFactory facesContextFactory; 
    private Lifecycle lifecycle; 

    @Override 
    public void init(ServletConfig config) throws ServletException { 
     super.init(config); 

     LifecycleFactory lifecycleFactory = (LifecycleFactory) FactoryFinder 
       .getFactory(FactoryFinder.LIFECYCLE_FACTORY); 
     facesContextFactory = (FacesContextFactory) FactoryFinder 
       .getFactory(FactoryFinder.FACES_CONTEXT_FACTORY); 
     lifecycle = lifecycleFactory 
       .getLifecycle(LifecycleFactory.DEFAULT_LIFECYCLE); 
    } 

    @Override 
    protected void doGet(HttpServletRequest request, 
      HttpServletResponse response) throws ServletException, IOException { 

     FacesContext context = facesContextFactory.getFacesContext(
       getServletContext(), request, response, lifecycle); 
     try { 
      ELContext elContext = context.getELContext(); 
      ExpressionFactory expressionFactory = context.getApplication() 
        .getExpressionFactory(); 
      ValueExpression expression = expressionFactory 
        .createValueExpression(elContext, "#{myBean.text}", 
          Object.class); 
      Object value = expression.getValue(elContext); 

      PrintWriter pw = response.getWriter(); 
      try { 
       pw.write("" + value); 
      } finally { 
       pw.close(); 
      } 
     } finally { 
      context.release(); 
     } 
    } 

} 

同樣,我會避免使用此方法如果可能的話。

+0

第二個是我正在尋找的答案,第一個是我的備份計劃,如果我不知道第一個。 這個想法是遺留的Servlet站點(它自己的Web應用程序和WAR文件)將使用POST和憑證將用戶重定向到新的webapp。有一個更好的方法嗎? – Drew 2009-02-27 03:43:18