2009-02-26 49 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