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

2024-01-09

在过去的几天里,我一直在为网络应用程序的登录部分而苦苦挣扎。我已经可以使用 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(至少我是这么理解的)。

因此,我将登录页面移至网页文件夹内名为 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 内存不足异常 -.-)

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


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

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

要更好地学习 JSF,请先阅读一本像样的书/教程,不要尝试将在 Internet 上找到的松散片段拼凑在一起,而没有真正理解这些代码行的作用。你应该能够写/解释它yourself一旦你真正理解了它。从这里开始:我们的 JSF 维基页面 https://stackoverflow.com/tags/jsf/info.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用FacesContext.getCurrentInstance(),它返回null 的相关文章

随机推荐

  • Java swing 的文件浏览器组件

    有没有人遇到过用于 Java Swing 的完全可定制 与所有标准 LnF 兼容 的快速文件浏览器组件 我应该能够将此组件放置到 Netbeans UI 调色板中 并在设计 UI 时拖放到任何 JPanel 中 它还应该支持目录 单个文件
  • IIS 工作线程与 Web 应用程序线程

    我正在维护一个ASP NET Core需要重复运行一些后台线程的 Web 应用程序 我知道这不是一个好的设计 但目前我必须以最小的努力解决它的主要问题 现在我想知道我是否应该担心网络服务器处理用户http请求 问题很简单 但我找不到任何明确
  • 如何设置没有幻数botframeworkV4的身份验证

    我读过了 魔法密码已被消除 我测试它使用这个样本 https github com Microsoft BotBuilder Samples tree master samples javascript nodejs 18 bot auth
  • 如何在 logcat 中获取特定模块的详细日志记录

    Android 模块之一 AudioFlinger 支持详细日志记录 使用 Tag AudioFlinger 问题是如何在 logcat 中看到这些日志 我做了 setprop log tag AudioFlinger VERBOSE 但它
  • 返回匿名结构的函数是否有合理的用途?

    这是一个 人工 示例 使用返回匿名结构并执行 某些 有用操作的函数 include
  • Visual Studio 2010 Ultimate 无法再创建 VC++ 项目

    突然 Visual Studio 2010 Ultimate 无法创建运行 Windows 7 的 VC 项目 例如 当我转到 新建 gt 项目 gt Visual C gt Win32 gt Win32 控制台应用程序 并执行向导时 我收
  • terraform aws_elastic_beanstalk_environment SSL 策略名称

    使用terraform 有谁知道如何设置预定义的ELB 的 SSL 安全策略 来自内部aws elastic beanstalk environment资源 我尝试了各种参数排列 从类似下面的内容中分支出来 但没有运气 setting na
  • 如何通过避免 mongodb 聚合中的空值来进行 $lookup

    在这里 我使用 lookup 到其他集合的左连接 查询工作正常 但是当某些记录缺少值时 它会返回 errmsg in requires an array as a second argument found null 查询文档结构如下 no
  • Angular 4 - 验证器自定义函数这是未定义的

    我正在构建一个应用程序 与组件 FormComponent 在里面我使用 Angular Core 的反应式表单模块 并创建一个自定义验证器 该函数正在使用 this 调用另一个函数 因为我认为它将引用 FormComponent 但它指的
  • Swift 中 `let` 和 `var` 有什么区别?

    有什么区别let and var用苹果的 Swift 语言 根据我的理解 它是一种编译语言 但它不会在编译时检查类型 这让我很困惑 编译器如何知道类型错误 如果编译器不检查类型 那不是生产环境的问题吗 当我尝试将值分配给 a 时出现此错误l
  • YouTube 视频标题背景

    我正在尝试创建一些网站模板来帮助我提高前端开发技能 因为我目前在后端工作方面做得更好 我试图在某种程度上复制我自己网站的风格 https thomas smyth co uk https thomas smyth co uk 这是一个简单的
  • ZF3会话超时问题

    我一直面临与使用 Zend Framework 3 的会话超时相关的问题 会话在 5 10 分钟内过期 我使用了会话的默认代码 Zf3 框架在全局 php如下 Session configuration session config gt
  • 如何将 GOPATH 链接到 LiteIDE?

    我已经安装了 LiteIde 并导出GOROOT and GOPATH in my bashrc 当我使用 LiteIDE 时 自动完成工作正常 但它无法构建 运行我的代码 当我查看 管理 GOPATH 时 系统 GOPATH 框是空的 我
  • 相同的 RSA 密钥、相同的消息、不同的加密[重复]

    这个问题在这里已经有答案了 我生成私钥 公钥和一个小文本文件 openssl genrsa out priv pem openssl rsa out pub pem in priv pem pubout echo A gt plain tx
  • 如何在matplotlib图中的特定位置添加网格线?

    如何在 matplotlib 图中 y 轴的特定位置添加网格 是的 这很简单 使用set x y ticks的方法axes对象并正常切换网格 import matplotlib pyplot as plt fig ax plt subplo
  • 如何在已处理的异常上停止 PyCharm 的中断/停止/停止功能(即仅在 python 未处理的异常上中断)?

    我发现 PyCharm 停止处理我的所有异常 甚至是我正在处理的异常try except堵塞 我不希望它在那里中断 我正在处理并且可能期待一个错误 但我确实希望它停止并暂停执行所有其他异常 例如 以便我拥有程序状态并对其进行调试 如何做到这
  • kafka生产者API中的标头信息

    我有一个 json 有效负载 我想将其作为生成器 Api 中的标头发送 type record created version 1 orgId userId userName correlationId jobId 以上有效负载应作为标头发
  • 正则表达式删除空 标签

    我想要这样的空跨度标签 填充有 nbsp 和空格 要删除 span nbsp nbsp nbsp span 我尝试过使用这个正则表达式 但它需要调整 span nbsp s span preg replace span nbsp s spa
  • 识别 Formik FieldArray 中已删除(创建和修改)的项目

    想知道 Formik 是否有一个本地解决方案来识别添加和删除 和更新 FieldArray以形式 我这里有沙箱上的代码https codesandbox io s jn7x2m75o9 https codesandbox io s jn7x
  • 如何使用FacesContext.getCurrentInstance(),它返回null

    在过去的几天里 我一直在为网络应用程序的登录部分而苦苦挣扎 我已经可以使用 tomcat 上的 JDBCRealm 成功验证用户身份 通过从 sql 服务器数据库读取用户 现在我想发送某种反馈当用户的帐户被阻止或凭据不正确时 这就是我现在陷