2012-04-02 41 views
7

Przez ostatnie kilka dni zmagałem się z częścią logowania do mojej aplikacji internetowej. Doszedłem do punktu, w którym mogę z powodzeniem uwierzytelnić użytkownika przy użyciu JDBCRealm na tomcat (czytając użytkowników z bazy danych serwera sql). Teraz Chcę przesłać informację zwrotną, gdy konto użytkownika zostało zablokowane, lub gdy dane uwierzytelniające są nieprawidłowe, to tutaj utknąłem.Jak korzystać z FacesContext.getCurrentInstance(), zwraca wartość null

chciałem użyć to:

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

Ale FacesContext.getCurrentInstance() zawsze zwraca null ..

Po wykonaniu kilku badań okazało się, że wniosek musi pochodzić ze strony znajduje się w/twarze, aby wywołać FacesServlet i zainicjowano FaceContext (przynajmniej to zrozumiałem).

Przesunąłem stronę logowania do nowego folderu o nazwie twarze w folderze Strony WWW. Ale teraz za każdym razem staram się wywołać stronę login.xhtml, otrzymuję ten błąd:

/login.xhtml Not Found in ExternalContext as a Resource 

I to jest StackTrace:

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) 

otrzymuję ten błąd nawet kiedy wprowadzić adres URL bezpośrednio w przeglądarka.

Im przy użyciu Netbeans 7.1 z Apache Tomcat 7 (który nawiasem mówiąc jest ból, bo mam dużo PermGen z wyjątkami pamięci -.-)

żadnej pomocy, w jaki sposób rozwiązać ten problem byłoby bardzo mile widziane .

Odpowiedz

8

Zwróci ona null, gdy nie jesteś w zarządzanym komponencie bean lub innym artefakcie JSF. Na przykład w zwykłym serwletie wanilii lub filtr serwletu, który działa przed FacesServlet działa. Numer FacesServlet to taki, który tworzy FacesContext i umieszcza go w bieżącym żądaniu HTTP jako ThreadLocal. Musisz wykonać zadanie logowania w zarządzanym komponencie JSF zamiast zwykłego sposobu. Ten fragment kodu, który tam masz, należy do komponentu bean zarządzanego przez JSF.

Strona logowania nie różni się od innych stron JSF, które kiedykolwiek stworzyłeś. A może nigdy nie opracowałeś z JSF i czy jest to twoja pierwsza próba JSF? Cóż, powinieneś o tym powiedzieć bardziej otwarcie w swoim pytaniu. Pozbądź się tego folderu /faces, po prostu umieść tekst login.xhtml prosto w treści strony i upewnij się, że wzorzec adresu URL FacesServlet w web.xml jest ustawiony na *.xhtml. Następnie możesz po prostu otworzyć go przez http://localhost:8080/yourapp/login.xhtml.

Aby nauczyć się JSF lepiej, najpierw przejdź przez trochę przyzwoitą książkę/samouczek i nie próbuj splatać luźnych kawałków, które znalazłeś w Internecie razem, bez zrozumienia, co robią te linie kodu. Powinieneś być w stanie napisać/wyjaśnić to sobie, gdy naprawdę go zrozumiesz. Zacznij tutaj: Our JSF wiki page.

+0

Tak, to moja pierwsza próba JSF :) Dzięki za odpowiedź, odpowiada ona na moje pytanie. Zasadniczo nie mogę uzyskać dostępu do FacesContext w dowolnym miejscu przed uruchomieniem usługi FacesServlet, więc muszę używać zarządzanego komponentu bean, gdy chcę uzyskać dostęp do Fctx. O części do nauki, lubię wypróbowywać podstawowe rzeczy w języku, zanim zacznę czytać książkę, w ten sposób, gdy ją przeczytam, będzie łatwiej i naprawdę będę wiedział, o czym mówi ta książka . Tak czy inaczej nadal nie jestem pewien, dlaczego nie mogę umieścić strony w folderze/faces? Postępuję zgodnie z twoją radą i zmieniam wzór serwletów twarzy. –

Powiązane problemy