Servlet, JSP, JSTL, EL在maven中依赖的写法种类非常多,可谓五花八门,为了搞明白不同的写法有何不同,花了些时间研究了下在maven的pom.xml中如何合理的加入Servlet, JSP, JSTL, EL的依赖。
这四个东西是什么
Servlet和JSP不必多说
JSTL叫做JSP标准标签库,它是一个JSP标签集合
EL表达式,主要用于替换JSP页面中的脚本表达式
什么是容器:一个容器(例如GlassFish)实现了JavaEE的全部标准,这个容器可以称之为JavaEE的容器,如果一个容器(例如Tomcat)实现了Servlet规范,可以称之为Servlet容器。
版本对应关系:
Servlet Spec | JSP Spec | JSTL(jsp标准标签库) | EL Spec | WebSocket Spec | jdk | Apache Tomcat Version | JavaEE Version |
---|---|---|---|---|---|---|---|
4.0 | 2.3 | 1.2 | 3.0 | 1.1 | JDK8+ | tomcat9.x+以上的配置 | Java EE 8 |
3.1 | 2.3 | 1.2 | 3.0 | 1.1 | JDK7+ | tomcat8.x+以上的配置 | Java EE 7 |
3.0 | 2.2 | 1.2 | 2.2 | 1.1 | JDK6+(使用websocket需要JDK7+) | tomcat7.x | Java EE 6 |
2.5 | 2.1 | 1.2 | 2.1 | 无 | jdk5+ | tomcat6 | Java EE 5 |
例如tomcat8对应的pom.xml
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>javax.servlet.jsp-api</artifactId>
<version>2.3.0</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.el</groupId>
<artifactId>javax.el-api</artifactId>
<version>3.0.0</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
更多参考:
http://tomcat.apache.org/whichversion.html(http://tomcat.apache.org/tomcat-9.0-doc/)
Servlet
只引入标准的写法
<!-- servlet标准 -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<scope>provided</scope>
<version>3.1.0</version>
</dependency>
只引入具体实现的写法,Tomcat的servlet-api实现已经整合了标准在内,实际上直接用这个就行
<dependency>
<groupId>org.apache.tomcat</groupId>
<artifactId>tomcat-servlet-api</artifactId>
<scope>provided</scope>
<version>8.0.36</version>
</dependency>
不同版本的标准写法是不一样的
Servlet 3.0.1以前
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<scope>provided</scope>
<version>2.5</version>
</dependency>
Servlet 3.0.1以后
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<scope>provided</scope>
<version>3.1.0</version>
</dependency>
JSP
只引入标准的写法
2.2.1-b03之前的写法
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>jsp-api</artifactId>
<scope>provided</scope>
<version>2.2</version>
</dependency>
2.2.1-b03之后的写法
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>javax.servlet.jsp-api</artifactId>
<scope>provided</scope>
<version>2.3.1</version>
</dependency>
引入具体实现的写法
<dependency>
<groupId>org.apache.tomcat</groupId>
<artifactId>tomcat-jsp-api</artifactId>
<scope>provided</scope>
<version>8.0.36</version>
</dependency>
JSTL
JSTL的情况比较复杂,Tomcat没有提供JSTL的实现。所以不像前面Servlet和JSP的引入往往只用引入具体实现就顺便引入了标准。
就是JSTL——既要加入标准,也要加入具体实现,且不能使用provided scope,更坑比的是JSTL依赖的写法非常多
好在从2006年的Java EE 5到现在,JSTL版本均为1.2
总结一下三种写法,推荐第一种
第一种
<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> </exclusions> </dependency>
第二种
<dependency>
<groupId>jstl</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
第三种
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
EL
用Tomcat作为部署容器,Tomcat已经集成了EL,而jsp在构建阶段(mvn clean package)是不会被编译的,所以使用Tomcat作为部署容器时,不需要加入EL表达式的依赖。
下面看一下就好
<!--标准引入-->
<dependency>
<groupId>org.apache.tomcat</groupId>
<artifactId>tomcat-el-api</artifactId>
<version>8.0.36</version>
</dependency>
<!--实现引入-->
<dependency>
<groupId>org.apache.tomcat</groupId>
<artifactId>tomcat-jasper-el</artifactId>
<version>8.0.36</version>
</dependency>
最后给一个我基于Tomcat9的dependency配置
<dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.11</version> <scope>test</scope> </dependency> <!--springframework--> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-web</artifactId> <version>4.2.6.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>4.2.6.RELEASE</version> </dependency> <!--jstl--> <dependency> <groupId>jstl</groupId> <artifactId>jstl</artifactId> <version>1.2</version> </dependency> <!-- servlet api--> <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>4.0.1</version> <scope>provided</scope> </dependency> <!--jsp api--> <dependency> <groupId>javax.servlet.jsp</groupId> <artifactId>javax.servlet.jsp-api</artifactId> <version>2.3.1</version> <scope>provided</scope> </dependency> </dependencies>