类型 JspFactory 的方法 getJspApplicationContext(ServletContext) 未定义

Posted

技术标签:

【中文标题】类型 JspFactory 的方法 getJspApplicationContext(ServletContext) 未定义【英文标题】:The method getJspApplicationContext(ServletContext) is undefined for the type JspFactory 【发布时间】:2011-01-20 14:11:50 【问题描述】:

这是我尝试运行 JSP 文件时在浏览器屏幕上看到的内容。

方法 getJspApplicationContext(ServletContext) 未为 JspFactory 类型定义

堆栈跟踪:

org.apache.jasper.compiler.DefaultErrorHandler.javacError(DefaultErrorHandler.java:92) org.apache.jasper.compiler.ErrorDispatcher.javacError(ErrorDispatcher.java:330) org.apache.jasper.compiler.JDTCompiler.generateClass(JDTCompiler.java:439) org.apache.jasper.compiler.Compiler.compile(Compiler.java:334) org.apache.jasper.compiler.Compiler.compile(Compiler.java:312) org.apache.jasper.compiler.Compiler.compile(Compiler.java:299) org.apache.jasper.JspCompilationContext.compile(JspCompilationContext.java:586) org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:317) org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:342) org.apache.jasper.servlet.JspServlet.service(JspServlet.java:267) javax.servlet.http.HttpServlet.service(HttpServlet.java:856)

而且我运行Tomcat窗口时会抛出jasper异常。

【问题讨论】:

【参考方案1】:

对于 Maven,我还必须将 jsp-api 依赖项添加为提供的 jar,如下所示:(其他一些依赖项正在将其拉入,我永远无法弄清楚是哪一个,但这已解决)

<dependency>
  <groupId>javax.servlet</groupId>
  <artifactId>servlet-api</artifactId>
  <version>2.5</version>
  <scope>provided</scope>
</dependency>   
<dependency>
  <groupId>javax.servlet</groupId>
  <artifactId>jsp-api</artifactId>
  <version>2.0</version>
  <scope>provided</scope>
</dependency>     

【讨论】:

【参考方案2】:
<dependency>
   <groupId>javax.servlet</groupId>
   <artifactId>servlet-api</artifactId>
   <version>$servlet.version</version>
   <scope>provided</scope>
</dependency> 

也修复了问题

【讨论】:

【参考方案3】:

getJspApplicationContext(ServletContext) 方法未定义 JspFactory 类型

当您的项目需要引用服务器运行时时也会发生这种情况:

在 Eclipse 的“项目资源管理器”中右键单击您的项目 选择“构建路径 | 配置构建路径” 点击“库”标签 点击“添加库” 选择“服务器运行时”并单击“下一步” 选择“Apache Tomcat 7”,或任何您的服务器运行时版本。

注意:ANT 构建也可能发生此错误,对于这种情况,您需要在 ANT build.xml 文件中引用目标运行时...以下引用本地 tomcat 安装,并使用其“lib”编译时的文件夹:

<project name="tomcat-demo" default="compile" basedir=".">
    <property name="tomcat-home" value="/path/to/your/tomcat/apache-tomcat-7" />

    <path id="project-classpath">
        <fileset dir="WebContent/WEB-INF/lib" includes="*.jar" />
        <fileset dir="$tomcat-home/bin" includes="*.jar" />
        <fileset dir="$tomcat-home/common/lib" includes="*.jar" />
        <fileset dir="$tomcat-home/server/lib" includes="*.jar" />
    </path>
   ...
</project>

从this url抓到:

【讨论】:

【参考方案4】:

方法 getJspApplicationContext(ServletContext) 未为 JspFactory 类型定义

method 是在 JSP 2.1 中引入的。导致此问题的原因有 3 个:

    您使用的 JSP 容器版本太旧(例如,您至少需要 Tomcat 6.0)。

    您在 web.xml 中声明了错误的 Servlet 版本。 JSP 2.1 与 Servlet 2.5 齐头并进,因此您的 web.xml 至少应该按照 Servlet 2.5 规范声明(您仍然需要一个支持 Servlet 2.5 / JSP 2.1 的 servletcontainer)。

    您已将旧版本的应用服务器特定库复制到 webapp 的 /WEB-INF/lib 中,例如 servlet-api.jarjsp-api.jar 等。你应该永远不要那样做。它只会导致类加载冲突。在您的网络项目中摆脱它们,并在应用服务器中保留/取消它们。

【讨论】:

ingcarlos,您是如何解决您的问题的?你用的是什么方法? @janwen:只需检查列出的任何一个原因。 感谢 BalusC,Cause1 和 Cause2 没问题。我在我的项目中删除了 servlet-api.jar 和 jsp-api.jar。但仍然 [code]在生成的 java 中的第 22 行出现错误文件类型 JspFactory[/code] 的方法 getJspApplicationContext(ServletContext) 未定义 @janwen:那么他们仍在类路径中不属于他们的其他地方徘徊。例如,JRE 的 /lib/lib/ext 文件夹。或者您有其他 JAR 包含过时的 JSP API,例如 javaee.jar。毕竟,您的/WEB-INF/lib 绝对不应该包含除 webapp 本身所需的库之外的任何其他库。另请参阅此相关问题:***.com/questions/4076601/… 没有,我看到tomcat6的WEB-INF/lib文件夹,没有那个jars。

以上是关于类型 JspFactory 的方法 getJspApplicationContext(ServletContext) 未定义的主要内容,如果未能解决你的问题,请参考以下文章

tomcat jar 包 与 项目jar包冲突问题解决

类型方法和类型实例方法等之间的区别?

数据类型的内置方法 可变类型与不可变类型

类型方法和类型实例方法等之间的区别?

js实例Array类型的9个数组方法,Date类型的41个日期方法,Function类型

1.写一个方法,将Date类型转为String类型/将String类型转为Date类型