2009-02-26 50 views
5

Tümleştirmeye çalıştığım iki sistem var. Biri, ham servletler üzerine inşa edilmiş, yenisi ise IceFaces ile JSF üzerine inşa edilmiştir. Sistemler arası işareti kolaylaştırmaya çalışıyorum. Buradaki fikir şudur: eski sistemde yeni bilgileri uygun siteye gönderen ve bunları günlüğe kaydeden bir düğme var.Faces Bağlamını manuel olarak oluşturma

Eh, ideal olarak, yeni sitede bunu kolaylaştırmak için düzenli bir eski sunucu kullanmak istiyorum. Yeni sitenin Servlet'ine gidin, yapması gerekenleri ve kontrol paneline yönlendirin.

Güvenliğimiz yönetilen bir fasulye ile ele alınır. Ancak, Servlet'e ulaştığınızda, yüzler bağlamı yoktur. Peki, yeni bir yüzler bağlamı nasıl oluşturabilirim?

Her zaman FacesContext'i benim için oluşturacak olan bir manken .iface sayfasına bağlantı kurabildiğim için bir yedekleme planım var ve daha sonra ana sayfaya yönlendirildikten sonra daha sonra ana sayfaya yönlendirilecek bir arka plan fasulyesi yaratıyor . Ama bu bir hack gibi hissediyor.

Herhangi bir yardım için teşekkür ederiz!

DÜZENLEME: Geri yol ile gittim. ...

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

destek fasulye yüzden benzeyen Bu hala kesmek gibi hissediyor

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

ama etrafında nasıl emin değilim: Temelde, bu yüzden böyle bir sayfaya POST bu. İdeal olarak, bir sunucuya POST, giriş kimliğini al, kullanıcıyı kur ve yönetilen böreğe koy. Ancak, FacesContext bu noktada mevcut değil.

Başka bir fikrin var mı?

cevap

4

Bu bağlamda "site" ile ne kastettiğinizden emin değilim.

birkaç not:

  • Yönetilen fasulye tanımlandıkları içinde web uygulaması (WAR) dışında kullanılabilir asla edilecektir.
  • FacesContext nesnesi örnekleri en sonunda FacesServlet.service tarafından oluşturulur ve atılır, bu nedenle istekleri bu sunucu uygulamasından geçmelidir. Başka koşullar altında bir içerik oluşturmaya çalışmak, tanımlanmamış davranışlara yol açabilir.

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

    jsfPage: akılda tutarak


, böyle bir istek dizisini oluşturabilir.jsp içerir:

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

"gönderme" özelliği bir fasulye yöntemine "getDispatch" olarak çözümlenir:

bu servlet gönderir
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); 

    } 

} 

bir değeri yayar yönetilen fasulye "myBean":

public class MyBean { 

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

    public String getText() { 
     return text; 
    } 

} 

Hepsi çok kıvrımlı ve ben hiç bir şekilde isteyerek yapmam. kendi sonuçları ile gelebilir


bir alternatif, bu gibi kendi bağlamı oluşturmaktır: Yine

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

} 

, ben bu yaklaşımı mümkünse önleyeceğini.

+0

İkincisi aradığım cevaptı ve ilki ilk yapamayacak olursam yedek planımdı. Buradaki fikir, eski Servlet sitesinin (kendi webapp ve WAR dosyası) kullanıcıyı bir POST ve yeni web sunucusuna kimlik bilgileriyle yeniden yönlendirmesiydi. Bunu yapmanın daha iyi bir yolu var mı? – Drew

İlgili konular