类型 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.jar
、jsp-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) 未定义的主要内容,如果未能解决你的问题,请参考以下文章