gpt4 book ai didi

jsf - 如何使用FacesContext.getCurrentInstance(),它返回null

转载 作者:行者123 更新时间:2023-12-02 03:26:18 24 4
gpt4 key购买 nike

过去几天我一直在努力处理我的网络应用程序的登录部分。我已经可以使用 tomcat 上的 JDBCRealm 成功验证用户身份(通过从 sql 服务器数据库读取用户)。现在,当用户的帐户被阻止或凭据不正确时,我想发送某种反馈,这就是我现在陷入困境的地方。

我想用这个:

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

但是 FacesContext.getCurrentInstance() 总是返回 null..

经过一些研究,我发现请求必须来自位于/faces 中的页面,以便调用 FacesServlet 并初始化 FacesContext(至少我是这么理解的)。

因此,我将登录页面移至 Web Pages 文件夹内名为 faces 的新文件夹中。但现在每次我尝试调用 login.xhtml 页面时,都会收到此错误:

/login.xhtml Not Found in ExternalContext as a Resource  

这是堆栈跟踪:

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)

即使我直接在浏览器中输入 URL,也会收到此错误。

我正在将 Netbeans 7.1 与 Apache Tomcat 7 一起使用(顺便说一句,这很痛苦,因为我遇到了很多 PermGen 内存不足异常 -.-)

任何有关如何解决此问题的帮助将不胜感激。

最佳答案

当您不在托管 bean 或任何其他 JSF 工件中时,它将返回 null。例如,在普通 servlet 或在 FacesServlet 运行之前运行的 servlet 过滤器中。 FacesServlet 即创建FacesContext 并将其作为ThreadLocal 放入当前HTTP 请求中的那个。您需要在 JSF 托管 bean 中执行登录作业,而不是采用通常的方式。您所拥有的那段登录代码属于 JSF 托管 bean。

至于登录页面,它与您开发过的任何其他 JSF 页面没有什么不同。或者您实际上从未使用 JSF 进行过开发,这是您第一次尝试 JSF?好吧,你也应该在你的问题中更明确地表达这一点。删除该 /faces 文件夹,只需将 login.xhtml 直接放入网页内容中,并确保 FacesServlet 的 URL 模式位于web.xml 设置为 *.xhtml。然后你就可以通过 http://localhost:8080/yourapp/login.xhtml 打开它.

为了更好地学习 JSF,请先阅读一本像样的书/教程,不要在没有真正理解这些代码行的作用的情况下尝试将在 Internet 上找到的松散片段拼凑在一起。一旦您真正理解它,您应该能够自己编写/解释它。从这里开始:Our JSF wiki page .

关于jsf - 如何使用FacesContext.getCurrentInstance(),它返回null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9985350/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com