Comment utiliser FacesContext.getCurrentInstance(), elle renvoie la valeur null
J'ai eu du mal pour le couple des derniers jours avec le login partie de mon application web. J'ai obtenu au point où je peux avec succès l'authentification d'un utilisateur à l'aide de la JDBCRealm sur tomcat(par la lecture des utilisateurs à partir d'une base de données sql server). Maintenant je veux envoyer une sorte de rétroaction lorsque le compte d'utilisateur a été bloqué, ou lorsque les informations d'identification sont incorrectes, c'est là où je suis coincé maintenant.
Je voulais l'utiliser:
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());
}
Mais FacesContext.getCurrentInstance() renvoie toujours null..
Après avoir fait quelques recherches, j'ai trouvé que la demande doit émaner d'une page qui se trouve dans /visages de sorte que la FacesServlet est appelée et le FacesContext est initialisé(du moins c'est ce que j'ai compris).
Donc je l'ai déplacé la page de connexion à un nouveau dossier nommé visages, à l'intérieur des Pages Web dossier. Mais maintenant chaque fois que j'essaie d'appeler la connexion.page xhtml, j'obtiens cette erreur:
/login.xhtml Not Found in ExternalContext as a Resource
Et c'est la 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)
J'obtiens cette erreur, même quand je tape directement l'URL dans le navigateur.
Im à l'aide de Netbeans 7.1 avec Apache Tomcat 7(qui est une douleur parce que je reçois beaucoup de PermGen de mémoire exceptions -.-)
Toute aide sur la façon de résoudre ce serait grandement apprécié.
OriginalL'auteur Andrei Dvoynos | 2012-04-02
Vous devez vous connecter pour publier un commentaire.
Il sera de retour
null
lorsque vous n'êtes pas dans un managed bean ou tout autre JSF artefact. Par exemple, dans une plaine à la vanille servlet ou un filtre de servlet qui s'exécute avantFacesServlet
s'exécute. LeFacesServlet
est celle qui crée leFacesContext
et l'enfile comme uneThreadLocal
dans le courant de la requête HTTP. Vous avez besoin de faire le login de l'emploi dans un managed bean JSF au lieu de la manière habituelle. Ce morceau de code de connexion que vous avez, il appartient à un managed bean JSF.À la page de connexion, il n'est pas différent de toute autre JSF page qui vous ai jamais développé. Ou avez-vous fait jamais développé avec JSF et est-ce votre première JSF tentative? Eh bien, vous devriez être plus explicite à ce sujet dans votre question. Se débarrasser de la
/faces
dossier, il suffit de mettre lelogin.xhtml
droit dans les webcontent et assurez-vous que le modèle d'URL de laFacesServlet
dansweb.xml
est fixé à*.xhtml
. Ensuite, vous pouvez simplement ouvrir en http://localhost:8080/yourapp/login.xhtml.Pour en savoir JSF mieux, passer un peu décent livre/tutoriel première et n'essayez pas de galets de pièces que vous avez trouvés sur Internet sans vraiment comprendre ce que ces lignes de code sont en train de faire. Vous êtes censé être en mesure d'écrire/de l'expliquer vous une fois que vous comprenez vraiment. Commencez ici: Notre JSF page wiki.
OriginalL'auteur BalusC