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中添加依赖如下:
1
2
3
4
5
|
<
dependency
>
<
groupId
>
javax
.
servlet
.
jsp
.
jstl
<
/
groupId
>
<
artifactId
>
jstl
-
api
<
/
artifactId
>
<
version
>
1.2
<
/
version
>
<
/
dependency
>
|
再次运行:错误如下:
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包冲突,改正后的依赖为
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
|
<
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年以后一直处于停止状态。
如果你要引人后者,那么依赖应该为:
1
2
3
4
5
6
7
8
9
10
|
<
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
>
|
顺便提一下:你知道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/