2012-04-02 3 views
7

Ich habe für die letzten paar Tage mit dem Login-Teil meines Web-App zu kämpfen. Ich bin an den Punkt gelangt, wo ich einen Benutzer erfolgreich mit dem JDBCRealm auf Tomcat authentifizieren kann (durch Lesen von Benutzern aus einer SQL-Server-Datenbank). Jetzt Ich möchte eine Art von Feedback senden, wenn das Konto des Benutzers blockiert wurde, oder wenn die Anmeldeinformationen inkorrekt sind, ist dies, wo ich jetzt feststecke.So verwendet FacesContext.getCurrentInstance(), gibt es null

Ich wollte diese verwenden:

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

Aber FacesContext.getCurrentInstance() gibt immer null ..

Nach einigen Recherchen fand ich heraus, dass die Anfrage von einer Seite in sich kommen muss/Gesichter, damit das FacesServlet aufgerufen wird und der FacesContext initialisiert wird (zumindest habe ich das verstanden).

Also zog ich die Login-Seite zu einem neuen Ordner mit dem Namen Gesichtern, in den Web-Seiten-Ordner. Aber jetzt immer wenn ich versuchen, die login.xhtml Seite aufzurufen, erhalte ich diese Fehlermeldung:

/login.xhtml Not Found in ExternalContext as a Resource 

Und dies ist der 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) 

ich diesen Fehler, auch wenn ich die URL eingeben, um direkt in der Browser.

Im Netbeans mit 7.1 mit Apache Tomcat 7 (die durch die Art und Weise ist ein Schmerz, weil ich eine Menge PermGen aus Speichern Ausnahmen erhalten -.-)

Jede Hilfe, wie dies zu beheben wäre sehr dankbar .

Antwort

8

Es wird null zurück, wenn Sie nicht in einer verwalteten Bohne oder einer anderen JSF Artefakt sind. Zum Beispiel läuft in einem Plain-Vanilla-Servlet oder einem Servlet-Filter, der vor FacesServlet läuft. Die FacesServlet ist nämlich derjenige, der die FacesContext und legt es als ThreadLocal in der aktuellen HTTP-Anforderung erstellt. Sie müssen stattdessen den Login-Job in einer JSF-verwalteten Bean ausführen. Der Teil des Code-Logins, den Sie dort haben, gehört zu einer von JSF verwalteten Bean.

In Bezug auf die Login-Seite ist es nicht anders als alle anderen JSF-Seite, die Sie jemals entwickelt haben. Oder hast du eigentlich nie mit JSF entwickelt und ist dies dein erster JSF-Versuch überhaupt? Nun, das hättest du auch in deiner Frage deutlicher machen sollen. Lassen Sie sich von diesen /faces Ordnern entfernen, einfach die login.xhtml gerade im webcontent und stellen Sie sicher, dass das URL-Muster der FacesServlet in web.xml-*.xhtml gesetzt. Dann können Sie es einfach durch http://localhost:8080/yourapp/login.xhtml öffnen.

Um JSF besser zu lernen, gehen Sie zuerst ein wenig anständiges Buch/Tutorial durch und versuchen Sie nicht, lose Stücke, die Sie im Internet gefunden haben, zusammen zu stopfen, ohne wirklich zu verstehen, was diese Codezeilen machen. Sie sollen in der Lage sein, es zu schreiben/zu erklären selbst, sobald Sie es wirklich verstehen. Beginnen Sie hier: Our JSF wiki page.

+0

Ja, dies ist mein erster JSF Versuch :) Danke für Ihre Antwort, es beantwortet meine Frage. Grundsätzlich kann ich nicht auf den FacesContext zugreifen, bevor das FacesServlet ausgeführt wird. Daher muss ich eine verwaltete Bean verwenden, wenn ich auf die Fctx zugreifen möchte. Über den Lernabschnitt, ich mag es, grundlegende Sachen auf einer Sprache zu versuchen, bevor ich anfange, ein Buch zu lesen, auf diese Weise, wenn ich es lese, wird es leichter kommen und ich werde wirklich wissen, worüber das Buch spricht . Wie auch immer, ich bin mir immer noch nicht sicher, warum ich die Seite nicht in einen/faces Ordner legen kann? Ich werde Ihrem Rat folgen und das Faces-Servlet-Muster ändern. –

Verwandte Themen