2009-02-26 6 views
5

통합하려고하는 두 개의 시스템이 있습니다. 하나는 원시 서블릿을 기반으로 작성되었으며, 새로운 서블릿은 IceFaces로 JSF로 빌드됩니다. 나는 시스템 간 로그인을 용이하게하려고 노력하고있다. 새로운 사이트에 적절한 정보를 POST하고 기록하는 구형 시스템에 버튼이 있습니다.얼굴 컨텍스트를 수동으로 생성하기

글쎄, 이상적으로는 새로운 사이트에서이를 용이하게하기 위해 기존 서블릿을 사용하고 싶습니다. 새 사이트의 서블릿으로 이동하여 필요한 작업을 수행하고 대시 보드로 전달하십시오.

우리의 보안은 관리 빈을 통해 처리됩니다. 그러나 서블릿에 도착할 때에는 얼굴 컨텍스트가 없습니다. 그럼, 어떻게 새 faces 컨텍스트를 만들까요?

필자는 항상 나를 위해 FacesContext를 생성 할 더미 .iface 페이지에 링크 할 수있는 백업 계획을 가지고 있으며 인스턴스화되어 메인 페이지로 넘어갈 때 물건을 처리 할 백킹 빈을 만듭니다. . 그러나 이것은 해킹과 매우 흡사합니다.

도움이 될 것입니다.

편집 : 백업 방식으로 진행했습니다. ...

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

백킹 빈은 그렇게처럼 보이는이 여전히 해킹 같은 느낌

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 이. 이상적으로는 서블릿에 POST하고 loginID를 얻은 다음 사용자를 빌드하고 직접 관리 Bean에 저장합니다. 그러나 FacesContext는 그 시점에 존재하지 않습니다.

다른 아이디어?

답변

4

이 컨텍스트에서 "사이트"가 무엇을 의미하는지 모르겠습니다.

노트의 몇 :

  • 관리 콩이가 정의 된 웹 응용 프로그램 (WAR) 밖에 사용할 수 없다됩니다.
  • FacesContext 객체 인스턴스는 궁극적으로 FacesServlet.service으로 생성되고 폐기되므로 요청은이 서블릿을 통과해야합니다. 다른 상황에서 컨텍스트를 만들려고하면 정의되지 않은 동작이 발생할 수 있습니다.

    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> 

은 "파견"속성은 빈 방법 "getDispatch"로 해결합니다

이 서블릿에 전달
public String getDispatch() { 
    FacesContext context = FacesContext.getCurrentInstance(); 
    try { 
     context.getExternalContext().dispatch("/FacesClientServlet"); 
    } catch (IOException e) { 
     throw new FacesException(e); 
    } 
    return null; 
} 

:

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

    } 

} 

A로부터 값을 방출 관리 빈 "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 사이트 (자체 webapp 및 WAR 파일)가 POST 및 자격 증명을 사용하여 사용자를 새 webapp로 리디렉션한다는 아이디어가있었습니다. 이 작업을 수행하는 더 좋은 방법이 있습니까? – Drew