- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
过去几天我一直在努力处理我的网络应用程序的登录部分。我已经可以使用 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/
我试图通过在FacesContext类的FacesContext.getCurrentInstance()方法中调用run()来获取Runnable,但它返回null。 public class Ta
无法在自生成的线程中获得“FacesContext.getCurrentInstance()”。 需要根据后端流程动态更新组件。通过创建一个线程来监视进程并与 p:poll 一起回调组件更新来实现相同
过去几天我一直在努力处理我的网络应用程序的登录部分。我已经可以使用 tomcat 上的 JDBCRealm 成功验证用户身份(通过从 sql 服务器数据库读取用户)。现在,当用户的帐户被阻止或凭据不正
我正在创建一个基于 Spring 的 JSF 应用程序,我在其中获取返回 null 的 FacesContext.getCurrentInstance。 这是我的 Java 代码 public sta
我是否认为这可能不是最好的主意: private static Application app = FacesContext.getCurrentInstance() .getAppl
安 Id作为 Url 参数传入。我尽量确保 id是一个数字。如果没有重定向到主页 if(facilityId != null){ try{ Long.parseLong(fac
在我的应用程序中,我有一个 WebFilter。这个 Webfilter 应该检查一个 coockie。但是使用 FacesContext.getCurrentInstance() 会导致 Nullp
在我的 jsf 应用程序中,我有大量与 FacesContext 相关的静态实用程序方法。我总是问自己同样的问题? 我应该通过参数将上下文传递给方法吗?或者使用 FacesContext.getCur
我使用的对话框框架: http://www.primefaces.org/showcase-labs/ui/dialogFrameworkData.jsf 我创建了一个文件 view_test.xht
无法获得 PrimeFaces RequestContext.getCurrentInstance().openDialog()上类。我直接从 primefaces 展示中提取了示例代码,但我从来没有
我正在使用 Spring、Hibernate 和 JSF。 为了从应用程序上下文中获取 bean,我写了: public static Object findBean(String name) {
我的页面: ... ... 我的托管Bean: public class ExampleManagedBe
当 faces-config.xml 中有 3 个消息包时,会返回哪一个?我可以控制应该返回哪一个吗?当我打印出 FacesContext.getCurrentInstance().getApplic
我有一个 Facelet,它有两个 .一种形式的命令链接可以毫无问题地执行。其他形式的命令链接不起作用:a NullPointerException被抛出是因为 FacesContext.getCu
这个问题在这里已经有了答案: How do I retrieve the FacesContext within a Filter (1 个回答) 关闭 7 年前。 我有一个处理用户 session
我已经检查了其他 stackoverflow 答案,但没有一个对 JSF facescontext 有答案,所以我不得不提出一个问题。我们有 jdk 6、jsf 1.2 和 mySQL 5.5,现在我
我是一名优秀的程序员,十分优秀!