JSP-导入taglib 出现classNotFound异常

来源:互联网 发布:js 老虎机抽奖效果 编辑:程序博客网 时间:2024/06/08 09:57

案例


前端登录跳转到指定jsp,报classNoFoundException,原因是页面导入 <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%> 导致的


Caused by: java.lang.ClassNotFoundException: org.apache.jsp.WEB_002dINF.jsp.common.index_005fmenu_jspat java.net.URLClassLoader$1.run(URLClassLoader.java:366)at java.net.URLClassLoader$1.run(URLClassLoader.java:355)at java.security.AccessController.doPrivileged(Native Method)at java.net.URLClassLoader.findClass(URLClassLoader.java:354)at org.apache.jasper.servlet.JasperLoader.loadClass(JasperLoader.java:132)at org.apache.jasper.servlet.JasperLoader.loadClass(JasperLoader.java:63)at org.apache.catalina.core.DefaultInstanceManager.newInstance(DefaultInstanceManager.java:121)at org.apache.jasper.servlet.JspServletWrapper.getServlet(JspServletWrapper.java:172)... 52 more




在pom.xml添加如下配置发现也没效果


 <dependency>            <groupId>javax.servlet.jsp.jstl</groupId>            <artifactId>jstl-api</artifactId>            <version>1.2</version>    </dependency>


解决方案

经网上搜索,是缺少jstl相关包的问题,刚才我们只是导入了jstl-api,而没有导入jstl的实现,所以再导入jstl 的实现。去mvnrepository上找jstl 的实现,基本上有两个版本,一个是glassfish 的jstl-impl, 另一个是apache的taglibs-standard-impl,一直犹豫不决该用谁,最后在stackoverflow.com/a/25374024/1443527上发现网友分享了他实现的经验,他用的是glassfish版本,所以我们也引人这个。由于tomcat7是兼容j2ee 3.0规范的,所以我们将jstl 依赖的东西给去除掉,防止和tomcat自身的servlet jar包冲突,改正后的依赖为

 <dependency>            <groupId>javax.servlet.jsp.jstl</groupId>            <artifactId>jstl-api</artifactId>            <version>1.2</version>            <exclusions>                <exclusion>                    <groupId>javax.servlet</groupId>                    <artifactId>servlet-api</artifactId>                </exclusion>                <exclusion>                    <groupId>javax.servlet.jsp</groupId>                    <artifactId>jsp-api</artifactId>                </exclusion>            </exclusions>        </dependency>         <dependency>            <groupId>org.glassfish.web</groupId>            <artifactId>jstl-impl</artifactId>            <version>1.2</version>            <exclusions>                <exclusion>                    <groupId>javax.servlet</groupId>                    <artifactId>servlet-api</artifactId>                </exclusion>                <exclusion>                    <groupId>javax.servlet.jsp</groupId>                    <artifactId>jsp-api</artifactId>                </exclusion>                <exclusion>                    <groupId>javax.servlet.jsp.jstl</groupId>                    <artifactId>jstl-api</artifactId>                </exclusion>            </exclusions>        </dependency>

顺便说一下jstl-impl-1.2.jar 和taglibs-standard-impl-1.2.1.jar 的区别,这两个包的内容很相似,后者应该是前者的一个再打包,因为Apache的taglibs工程从2009年以后一直处于停止状态。


如果你要引人后者,那么依赖应该为:

 <dependency>      <groupId>org.apache.taglibs</groupId>      <artifactId>taglibs-standard-spec</artifactId>      <version>1.2.1</version>    </dependency>    <dependency>      <groupId>org.apache.taglibs</groupId>      <artifactId>taglibs-standard-impl</artifactId>      <version>1.2.1</version>    </dependency>
参考文章:http://www.javacoder.cn/?p=195


0 0