【问题标题】:java.lang.RuntimeException Cannot find FacesContextjava.lang.RuntimeException 找不到 FacesContext
【发布时间】:2013-04-27 13:53:48
【问题描述】:

我不知道如何继续,但我的新 JSF 1.2 Web 应用程序总是收到“java.lang.RuntimeException:找不到 FacesContext”。我确定这只是我找不到的一些配置。

第一个f: 或h: 标记发生异常。已经在开头加上了重要的<f:view>。

我的index.jsp

<%@ taglib uri="http://java.sun.com/jsf/html" prefix="h"%>
<%@ taglib uri="http://java.sun.com/jsf/core" prefix="f"%>
<%@page contentType="text/html" pageEncoding="UTF-8"%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<f:view>
<html>
    <head>
        <title>MyWebsite</title>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <meta http-equiv="pragma" content="no-cache">
        <meta http-equiv="cache-control" content="no-cache">
        <meta http-equiv="expires" content="0">
    </head>
    <body>
        <div>MyContent</div>
    </body>
</html>
</f:view>

我的web.xml 看起来像这样:

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
    <servlet>
        <servlet-name>Faces Servlet</servlet-name>
        <servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <context-param>
        <param-name>javax.faces.DEFAULT_SUFFIX</param-name>
        <param-value>.jsp</param-value>
    </context-param>
    <servlet-mapping>
        <servlet-name>Faces Servlet</servlet-name>
        <url-pattern>*.jsf</url-pattern>
    </servlet-mapping>
    <session-config>
        <session-timeout>720</session-timeout>
    </session-config>
    <welcome-file-list>
        <welcome-file>index.jsp</welcome-file>
    </welcome-file-list>
</web-app>

然后我还有一个 faces-config.xml 应该引用我以后想在页面正文中使用的 myBean:

<?xml version='1.0' encoding='UTF-8'?>
<faces-config version="1.2" 
              xmlns="http://java.sun.com/xml/ns/javaee" 
              xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
              xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-facesconfig_1_2.xsd">
    <application>
        <view-handler>com.sun.facelets.FaceletViewHandler</view-handler>
    </application>

    <managed-bean>
        <managed-bean-name>myClassName</managed-bean-name>
        <managed-bean-class>
            com.company.className
        </managed-bean-class>
        <managed-bean-scope>session</managed-bean-scope>
    </managed-bean>
</faces-config>

我在这里错过了什么?

【问题讨论】:

    标签: jsp jsf tomcat runtimeexception facescontext


    【解决方案1】:

    java.lang.RuntimeException: Cannot find FacesContext

    因此,JSF &lt;f:xxx&gt; 和 &lt;h:xxx&gt; 标签抱怨找不到 FacesContext。 FacesServlet 负责创建人脸上下文。当请求 URL 与其 URL 模式匹配时,将调用 faces servlet,在您的特定情况下为 *.jsf。因此,当您以http://localhost:8080/context/index.jsp 的形式打开index.jsp,或者依赖&lt;welcome-file&gt; 设置时,您并没有调用faces servlet,您确实会得到这个异常。

    您需要将index.jsp打开为http://localhost:8080/context/index.jsf,或者将欢迎文件条目设置为index.jsf才能正确调用faces servlet,以便它可以创建JSF所需的faces上下文JSP 页面中声明的组件。

    但是请注意,在这个 JSF 1.x + Tomcat 环境中,仅修复欢迎文件是不够的。您还需要在 web 内容中的 index.jsp 文件旁边提供一个实际存在但完全为空的 index.jsf 文件,以欺骗 Tomcat,index.jsf 确实作为欢迎文件存在。否则它会显示 404 错误,因为它会事先检查欢迎文件的物理存在。

    另见:


    与具体问题无关,我想知道如果您显然已经安装了 Facelets 1.x 并注册了它的视图处理程序,为什么还要使用 JSP。 Facelets 与 JSP 相去甚远 superior。

    【讨论】:

    • 是的,你是对的,我看到我们(在另一个 Web 项目中)也使用了带有 .jsf 后缀的起始页面,然后重定向到 .jsp 页面。好吧,我仍然没有真正理解 JSF 的概念——我已经习惯了 HTML,并希望继续使用这种语法——因为我对用户获得的代码有 100% 的控制权。所以我将继续使用 .jsp 并忘记 jsf。
    • stackoverflow.com/a/4424775 简而言之:JSF 消除了自己编写所有 HTML/CSS/JS 的需要(您只需了解 JSF 组件生成哪些 HTML 输出,以便您可以轻松选择正确的一)它还消除了手动收集提交的值、转换/验证它们并将它们作为 bean 属性和标识并调用操作方法的需要。您最终会得到一个作为“视图”的 JSP 文件和一个作为“模型”的 javabean。换句话说,你最终得到的代码更少。
    • 然而,我必须承认 JSP 是一种糟糕的视图技术,并且使 JSF 1.x 不必要地痛苦。另见stackoverflow.com/a/3646940
    • 开发人员的代码更少,但浏览器必须处理生成的代码。因此,这种“更少的代码”将意味着更少的控制、第三方依赖,并最终在出现问题或定制时产生挫败感。但是非常感谢 cmets - 也许我真的应该研究像 2.X+ 这样的高级版本。
    • @FiveO 生成的代码是 HTML。浏览器必须“处理”您是否使用 JSF。总的来说,任何框架都会给你“更少的控制”,无论是 JSF、EJB、JPA 等。但是,大多数时候它们会给你一种“手动”做事的方法。使用 JSF,您始终可以编写纯 HTML/CSS/JS,或创建自己的自定义标签/组件。您不需要第三方依赖,只需使用在完整的 Java 应用服务器(如 Glassfish、JBoss AS 或 WebSphere AS)上运行的纯 Java EE。 IMO,沮丧是不得不一遍又一遍地重新发明轮子,而不是专注于业务代码。
    猜你喜欢
    • 2011-05-28
    • 2014-05-22
    • 2012-08-01
    • 2011-07-17
    • 1970-01-01
    • 1970-01-01
    • 2011-10-13
    • 2019-03-04
    相关资源
    最近更新 更多