正确配置jstl的maven依赖

10月 14, 2014 |

在jsp 中使用el表达式都好几年了,原来都是将需要的jar直接放在WEB-INF/lib目录下,最近转向maven构建。一下子各种问题。
detail.jsp 的内容如下:
<%@ page language="java"  pageEncoding="UTF-8"%>
<%@ page isELIgnored ="false" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<c:out value="${request.reportDataKey}"/><br/>
运行时提示:
ClassNotFoundException: javax.servlet.jsp.jstl.core.Config
网上搜索一番,
说是jstl 需要手动引入,于是在pom.xml中添加依赖如下:

再次运行:错误如下:
java.lang.NoClassDefFoundError: org/apache/taglibs/standard/tag/rt/core/Out
刚才我们只是导入了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包冲突,改正后的依赖为

哈哈,运行正确。

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

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

顺便提一下:你知道web.xml配置中的url-pattern的'/''/*'的区别吗?
哎,基本功不扎实,这个问题折腾了好久。'/'表示该项目的所有请求路径;'/*'表示只能有一级子路径,它匹配'/a.jsp'但是不匹配'/jsp/a.jsp'

参考文档:
http://stackoverflow.com/questions/6094329/tomcat-7-and-jstl/25374024
http://www.murraywilliams.com/2011/11/running-jstl-1-2-on-tomcat-7-using-maven/

Posted in: Uncategorized | Tags: ,

Comments are closed.