2009-02-26 12 views
5

J'ai deux systèmes que j'essaie d'intégrer. L'un est construit sur des servlets bruts, le nouveau est construit sur JSF avec IceFaces. J'essaie de faciliter la connexion entre systèmes. L'idée est que j'ai un bouton dans l'ancien système POST les informations appropriées sur le nouveau site et les connecte.Génération manuelle d'un contexte de visages

Eh bien, idéalement, je voudrais utiliser simplement une ancienne servlet régulière pour faciliter cela sur le nouveau site. Accédez au servlet du nouveau site, faites ce qu'il doit faire et l'avant sur le tableau de bord.

Notre sécurité est gérée via un bean géré. Cependant, au moment où vous arrivez à la servlet, il n'y a pas de contexte de visages. Alors, comment pourrais-je créer un nouveau contexte de visages? J'ai un plan de sauvegarde en ce sens que je peux toujours créer un lien vers une page .iface factices qui créera le FacesContext pour moi et ensuite créer un bean backing qui fera des choses quand il sera instancié et ensuite avancer sur la page principale . Mais cela ressemble beaucoup à un hack.

Toute aide serait appréciée!

EDIT: Je suis allé avec la façon de sauvegarder. En fait, je POST à ​​une page comme ceci:

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

La fève de soutien à la recherche comme si ...

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

Cela se sent encore comme un hack, mais je ne suis pas sûr de savoir comment se déplacer ce. Idéalement, je posterais un servlet, j'obtiendrais le loginID, je construirais l'utilisateur et le placerais directement dans le bean géré. Mais, le FacesContext n'existe pas à ce stade.

D'autres idées?

Répondre

4

Je ne suis pas sûr de ce que vous entendez par "site" dans ce contexte.

Quelques notes:

  • haricots gérés seront jamais être disponibles en dehors de l'application Web (WAR) dans lequel elles sont définies.
  • Les instances d'objets FacesContext sont finalement créées et éliminées par FacesServlet.service. Les demandes doivent donc passer par cette servlet. Tenter de créer un contexte dans d'autres circonstances peut entraîner un comportement indéfini.

Ayant cela à l'esprit, vous pouvez créer une séquence de demande comme ceci:

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

jsfPage.jsp contient:

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

La propriété "expédition" décide d'une méthode de haricot "getDispatch":

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

qui envoie à cette 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); 

    } 

} 

qui émet la valeur d'une gérée "myBean":

public class MyBean { 

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

    public String getText() { 
     return text; 
    } 

} 

Tout cela est très compliqué et je ne le ferais pas volontiers.


Une alternative qui peut venir avec ses propres conséquences, est de créer votre propre contexte comme celui-ci:

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

} 

Encore une fois, je voudrais éviter cette approche si possible.

+0

La seconde est la réponse que je cherchais et le premier était mon plan de secours si je ne pouvais pas comprendre le premier. L'idée était que le site Servlet hérité (sa propre application Web et son fichier WAR) redirigeait l'utilisateur avec un POST et des informations d'identification vers la nouvelle application Web. Y a-t-il une meilleure manière de faire cela? – Drew