2012-04-02 12 views
7

döndürür Web uygulamasının oturum açma bölümü ile son birkaç gündür mücadele ediyorum. Tomcat'ta JDBCRealm'i kullanarak bir kullanıcıyı başarılı bir şekilde doğrulayabileceğim noktaya geldim (kullanıcıları bir sql sunucu veritabanından okuyarak). Şimdi Kullanıcının hesabı engellendiğinde veya kimlik bilgileri yanlış olduğunda, şu anda sıkıştığım yer olan bir çeşit geri bildirim göndermek istiyorum. FacesContext.getCurrentInstance() nasıl kullanılır,

Bunu kullanmak istedi:

try { 
     request.login(request.getParameter("user"), request.getParameter("pass")); 
    } catch (ServletException se) { 
     FacesContext.getCurrentInstance().addMessage(null, new FacesMessage("Wrong Username/Password combination")); 
     log(se.getMessage()); 
    } 

Ama FacesContext.getCurrentInstance() her zaman döndürür boş ..

ben isteği bulunan bir sayfadan gelmesi gerektiğini öğrendim biraz araştırma yaptıktan sonra/FacesServlet çağırılır ve FacesContext başlatılır böylece yüzleri (en azından anladım).

Oturum açma sayfasını Web Sayfaları klasörünün içinde, yüzler adlı yeni bir klasöre taşıdım. Ama şimdi her şey login.xhtml sayfasını çağırmak deneyin, bu hatayı alıyorum:

/login.xhtml Not Found in ExternalContext as a Resource 

Ve bu StackTrace geçerli:

com.sun.faces.context.FacesFileNotFoundException: /login.xhtml Not Found in ExternalContext as a Resource 
at com.sun.faces.facelets.impl.DefaultFaceletFactory.resolveURL(DefaultFaceletFactory.java:232) 
at com.sun.faces.facelets.impl.DefaultFaceletFactory.resolveURL(DefaultFaceletFactory.java:273) 
at com.sun.faces.facelets.impl.DefaultFaceletFactory.getFacelet(DefaultFaceletFactory.java:201) 
at com.sun.faces.application.view.FaceletViewHandlingStrategy.buildView(FaceletViewHandlingStrategy.java:764) 
at com.sun.faces.lifecycle.RenderResponsePhase.execute(RenderResponsePhase.java:100) 
at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101) 
at com.sun.faces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:139) 
at javax.faces.webapp.FacesServlet.service(FacesServlet.java:410) 
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:304) 
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) 
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:224) 
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:169) 
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472) 
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:168) 
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:100) 
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:929) 
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118) 
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:405) 
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:964) 
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:515) 
at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:304) 
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886) 
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908) 
at java.lang.Thread.run(Thread.java:619) 

ben URL'yi doğrudan girdiğinizde Hatta bu hatayı alıyorum tarayıcı

Bunu düzeltmek konusunda herhangi bir yardım (ı -.- bellek istisnalar dışında PermGen çok olsun çünkü arada bir acıdır) Apache Tomcat 7 ile NetBeans 7.1 kullanarak

Im büyük takdir . Yönetilen bir fasulye ya da başka bir MTU eser değilken

cevap

8

O null dönecektir. Örneğin, düz bir vanilya servletinde veya FacesServlet'dan önce çalışan bir sunucu filtresinde çalışır. FacesServlet, FacesContext'u yaratan ve geçerli HTTP isteğinde ThreadLocal olarak belirleyen kişidir. Oturum açma işini, normal şekilde yerine bir JSF yönetilen fasülyede yapmanız gerekir. Orada bulunan bir kod girişi JSF yönetilen bir fasülyeye ait. Giriş sayfasına gibi

, bu şimdiye kadar geliştirdik başka JSF sayfadan farklı değil. Ya da aslında JSF ile hiç geliştirmediniz mi ve bu ilk JSF denemeniz hiç mi? Eh, senin sorununda da bunun hakkında daha açık olmalıydın. O /faces klasörün kurtulun, sadece Webcontent içinde login.xhtml düz koymak ve web.xml içinde FacesServlet URL kalıbı *.xhtml için ayarlanmış olduğundan emin olun. Sonra sadece http://localhost:8080/yourapp/login.xhtml ile açabilirsiniz.

JSF'yi daha iyi öğrenmek için, biraz terbiyeli bir kitap/öğretici önce gidin ve gerçekten bu kod satırlarının ne olduğunu anlayamadan internette bulduğunuz gevşek parçaları bir araya getirmeye çalışmayın. Bunu gerçekten anladığınızda, kendiniz yazabilmeniz/açıklayabilmeniz gerekiyor. Buradan başlayın: Our JSF wiki page.

+0

Evet, bu benim ilk MTU girişimi :) Cevabınız için teşekkürler, bu benim soruya cevap yok. Temel olarak, FacesServlet'in çalışmasından önce FacesContext'e erişemiyorum, bu yüzden Fctx'e erişmek istediğim zaman yönetilen bir fasulye kullanmam gerekiyor. Öğrenme bölümü hakkında, bir kitap okumaya başlamadan önce bir dilde temel şeyler yapmayı denemeyi seviyorum, bu şekilde okuduğumda, daha kolay olacak ve kitabın ne hakkında olduğunu bileceğim . Her iki durumda da sayfayı neden bir/faces klasörüne yerleştiremediğimi hala bilmiyorum? Tavsiyenizi takip edip Faces Servlet modelini değiştireceğim. –