本人在实际项目和各种框架中,发现Servlet, JSP, JSTL, EL在maven中依赖的写法种类非常多,可谓五花八门,为了搞明白不同的写法有何不同,花了些时间研究了下在maven的pom.xml中如何合理的加入Servlet, JSP, JSTL, EL的依赖,本文即是研究的结果。
为了说明清楚,首先简要的介绍下这几种组件,然后重点说明如何在maven中配置,内容分为几下几个部分:
0. Servlet, JSP, JSTL, EL这些东西都是什么,做什么用的,之间有什么关系
1. 这些东西的版本是怎么回事
2. 如何在maven中具体配置
这些东西都是什么,做什么用的,之间有什么关系
这四个东西都是JavaEE规范标准的一部分,注意这只是标准而不是实现,标准和实现相当于接口和接口的实现类。JavaEE规范中有很多标准,其中这四个在JavaWeb开发中比较常用,具体来说:
- Servlet & JSP,这个估计都比较清楚;
- JSTL叫做JSP标准标签库,它是一个JSP标签集合,封装了JSP应用的通用核心功能,这个东西一般在JSP页面里使用;
- EL表达式,主要用于替换JSP页面中的脚本表达式,一般也是用在JSP页面里。
另外:如果一个容器(例如GlassFish)实现了JavaEE的全部标准,这个容器可以称之为JavaEE的容器,如果一个容器(例如Tomcat)实现了Servlet规范,可以称之为Servlet容器。
这些东西的版本是怎么回事
JavaEE有不同的版本,其组件也有不同的版本,所运行的容器也有对应的版本,在一个项目开发之初的时候,就应该明确使用哪个版本的组件,如果没有特别的情况,最好使用最新的稳定版本,在编写本文的2016年11月,本人推荐如下的组件版本组合:
Servlet 3.1
JSP 2.3
JSTL 1.2
EL 3.0
tomcat 8.0.x或者tomcat8.5.x
另外,wiki上有一个关于JavaEE版本和组件版本的对应 :Java_EE_version_history;
Tomcat官方也有一个版本和组件的对应关系说明 : tomcat版本说明。
如何在maven中具体配置
原则
我们在开发的时候,是按照标准开发的,而程序运行时是在容器中运行,容器可能会提供组件的具体(注意这里是可能会,例如Tomcat提供了Servlet和JSP的实现,但是没有提供JSTL的实现),这里有两种情况实现:
- 程序部署的容器从一开始就确定了,例如应用程序未来部署的生产环境是Tomcat;
- 程序部署的容器不确定,或者需要程序可以在不同的容器下部署,例如应用程序既能在Tomcat中部署,又可以在jetty中部署。
第一种情况,本人建议在将标准和实现的依赖都放到pom.xml中,并且scope使用provided,第二种情况复杂一些,因为不确定容器是否会提供组件的实现,不同的容器对组件支持的程度不同,具体的依赖也是不同的,这种情况可以使用maven的profile解决,在下面的配置中,以Tomcat 8.0.36作为具体的部署环境为例来重点说明第一种情况,第二种情况也会提到一些。
Servlet
- 既引入标准,也进入具体实现的写法
<!-- servlet标准 --> <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <scope>provided</scope> <version>3.1.0</version> </dependency> <!-- tomcat提供的servlet实现 --> <dependency> <groupId>org.apache.tomcat</groupId> <artifactId>tomcat-servlet-api</artifactId> <scope>provided</scope> <version>8.0.36</version> </dependency>
实际当中,Tomcat的servlet-api实现已经整合了标准在内,所以我们只需要在maven的pom.xml中加入如下内容就可以了
<dependency> <groupId>org.apache.tomcat</groupId> <artifactId>tomcat-servlet-api</artifactId> <scope>provided</scope> <version>8.0.36</version> </dependency>
注意,在maven中加入Servlet标准的依赖,不同版本的标准写法是不一样的,具体来说,是artifactId不一样。
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>
- 只引入标准的写法
<!-- servlet标准 --> <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <scope>provided</scope> <version>3.1.0</version> </dependency>
JSP
- 既引入标准,也进入具体实现的写法
和Servlet类似,Tomcat的jsp实现已经整合了标准在内,所以我们只需要在maven的pom.xml中加入如下内容就可以了:
<dependency> <groupId>org.apache.tomcat</groupId> <artifactId>tomcat-jsp-api</artifactId> <scope>provided</scope> <version>8.0.36</version> </dependency>
- 只引入标准的写法
如果需要在maven中加入JSP标准,请注意不同版本JSP标准的artifactId略有不同
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>
JSTL
JSTL的情况比较复杂,首先JSTL和Servlet,JSP不太一样,Tomcat没有提供JSTL的实现。所以在maven中加入依赖的时候,既要加入标准,也要加入具体实现,并且不能使用provided scope;再者JSTL依赖的写法非常多,我在mvnrepository.com上查了一下,以版本1.2为例,至少有以下几种写法:
<dependency> <groupId>javax.servlet.jsp.jstl</groupId> <artifactId>jstl-api</artifactId> <version>1.2</version> </dependency> <dependency> <groupId>org.glassfish.web</groupId> <artifactId>jstl-impl</artifactId> <version>1.2</version> </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> <dependency> <groupId>javax.servlet.jsp.jstl</groupId> <artifactId>jstl</artifactId> <version>1.2</version> </dependency>
其中有的是标准, 有的是实现,我们具体分析一下,考虑到从2006年的Java EE 5到预计2017年发布的Java EE 8,对应的JSTL版本均为1.2,我们以下的分析采用这个版本。
首先看下面这两种写法
<dependency> <groupId>javax.servlet.jsp.jstl</groupId> <artifactId>jstl-api</artifactId> <version>1.2</version> </dependency> <dependency> <groupId>org.glassfish.web</groupId> <artifactId>jstl-impl</artifactId> <version>1.2</version> </dependency>
其中第一种写法是标准,第二写法是GlassFish的具体实现,这个实现中没有包括标准。需要注意的是,这两个组件分别依赖与其他的组件,jstl-api有两个依赖:
Servlet 2.5和JSP 2.1
[INFO] \- javax.servlet.jsp.jstl:jstl-api:jar:1.2:compile [INFO] +- javax.servlet:servlet-api:jar:2.5:compile [INFO] \- javax.servlet.jsp:jsp-api:jar:2.1:compile
jstl-impl有三个依赖,分别是:
Servlet 2.5、JSP 1.2,以及jstl-api 1.2(也就是上面第一个),
[INFO] \- org.glassfish.web:jstl-impl:jar:1.2:compile [INFO] +- javax.servlet:servlet-api:jar:2.5:compile [INFO] +- javax.servlet.jsp:jsp-api:jar:2.1:compile [INFO] \- javax.servlet.jsp.jstl:jstl-api:jar:1.2:compile
如果项目中使用的Servlet和JSP不是这个版本,建议将其排除。
然后看下面这两种写法:
<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>
这两种写法都是就是包括了标准,也包括了实现,本人花了些时间分析这两个组件之间的不同,到头来结论是没有任何不同,这两个jar文件的md5校验码是一样的。
MD5 (jstl/jstl/1.2/jstl-1.2.jar) = 51e15f798e69358cb893e38c50596b9b MD5 (javax/servlet/jstl/1.2/jstl-1.2.jar) = 51e15f798e69358cb893e38c50596b9b
这两个的实现部分和上面GlassFish的实现是一样,没有区别,另外,这两个组件都没有自己的依赖。
最后说下这种写法
<dependency> <groupId>javax.servlet.jsp.jstl</groupId> <artifactId>jstl</artifactId> <version>1.2</version> </dependency>
这些写法虽然还存在于mvnrepository.com,但是对应的jar文件已经在maven的公共库中不存在了。其访问地址
https://repo.maven.apache.org/maven2/javax/servlet/jsp/jstl/jstl/1.2/jstl-1.2.pom
已经是404 Not Found。
解释完了这些,给出具体的写法
- 只引入标准的写法
<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>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>
这三种写法中,第一种是标准和实现分开,后两种的组件是包括了标准和实现,本人推荐分开写的第一种,查阅了一些较为权威的开源程序(例如spring官方的spring-mvc-showcase),也是采用第一种写法的居多。
EL
EL的标准和实现
GlassFish版:
<dependency> <groupId>javax.el</groupId> <artifactId>javax.el-api</artifactId> <version>3.0.0</version> </dependency> <dependency> <groupId>org.glassfish</groupId> <artifactId>javax.el</artifactId> <version>3.0.0</version> </dependency>
Tomcat版:
<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>
注意,如果使用Tomcat作为部署容器,Tomcat已经集成了EL,而jsp在构建阶段(mvn clean package)是不会被编译的,所以使用Tomcat作为部署容器时,不需要加入EL表达式的依赖
一个完整的pom例子
最后,给一个使用Servlet 3.1, JSP 2.3, JSTL 1.2,以Tomcat 8.0.36作为部署容器的完整pom.xml
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>cn.foo</groupId> <artifactId>bar</artifactId> <version>0.0.1-SNAPSHOT</version> <name>demo</name> <properties> <tomcat.version>8.0.36</tomcat.version> <jstl.version>1.2</jstl.version> </properties> <dependencies> <!-- Servlet --> <dependency> <groupId>org.apache.tomcat</groupId> <artifactId>tomcat-servlet-api</artifactId> <scope>provided</scope> <version>${tomcat.version}</version> </dependency> <!-- JSP --> <dependency> <groupId>org.apache.tomcat</groupId> <artifactId>tomcat-jsp-api</artifactId> <scope>provided</scope> <version>${tomcat.version}</version> </dependency> <!-- JSTL --> <dependency> <groupId>javax.servlet.jsp.jstl</groupId> <artifactId>jstl-api</artifactId> <version>${jstl.version}</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>${jstl.version}</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> </dependencies> </project>
欢迎批评指正,全文完。
相关推荐
项目所用技术 Servlet、jsp、el、jstl、jdbc、maven 使用MVC设计思想进行构建,使用全注解开发。
哔哩哔哩上老杜的Servlet笔记。 2020-5-05 Servlet学习 Tomcat 服务器配置 2020-5-08 UML 2020-5-08 Servlet学习 ...2020-5-21 JavaWeb学习 JSP,EL,JSTL,Filter, 2020-5-23 MVC、三层设计 2020-5-24 数据分页展示
后端使用了Java Servlet技术处理HTTP请求,加上JSP技术,使用EL表达式和JSTL标签来辅助开发 前端页面使用了Jquery、BootStrap框架。 项目使用 Maven3.6.0 构建,服务器为 Tomcat 9.0.17 ### 1.示例地址:...
攀枝花学院课程设计 javaweb的图书管理系统 ...maven+jstl+el+jsp +servlet+mvc三层控制结构 完成书籍的增删查改操作,用户登陆注册 具有前端验证 采用过滤器监听器 能统计总共历史在线人数和当然在线人数
Servlet Jsp EL JSTL Cookie Session Filter Listener 编程强化 设计模式 JVM优化 数据结构算法 多线程高级 MINA Netty NIO 软件项目,代码管理 Markdown Maven SVN Git 码云 github Jenkins Sonar Part2: 热门框架&...
│ ├<09-JSP,EL和JSTL> │ ├综合案例(用户信息)> │ ├和Listener> │ ├ │ ├和JSON> │ ├ │ ├<15-Maven基础> │ ├旅游网> │ ├ │ └ ├<阶段3.1 Mybatis·> │ ├课程介绍及环境搭建> │ ├入门案例> │ ...
MySQL、MySQL约束&多表、MySQL多表&事务、JDBC、数据库连接池、HTML、CSS、JS基础&高级、BootStrap、XML、Tomcat、Servlet&HTTP&Request、Response、Cookie&Session、JSP&EL&JSTL、Filter&Listener、jQuery、Ajax、...
1.Java学习路线 1.1JavaSE Java基础 Java8新特性 数据库MySQL与SQL语⾔ JDBC 1.2JavaWeb HTML基础与CSS JavaScript DOM 与 jQuery XML与Tomcat HTTP协议 服务器端组件Servlet JSP EL表达式 JSTL 会话控制Cookie和...
- 后端方面:JavaSe核心语法、MVC(controlle层、service、dao层)模型开发、jsp相关语法(jstl标签库、el表达式)、maven构建项目和管理jar包 - 前端方面:JavaScript(jquery)核心语法、AJAX异步刷新、Layui前端 UI...
非常详细的javaWeb知识点梳理,涵盖:XML、网络通信、Tocmcat服务器概述、servlet、Request/Response、Cookie、Session、jsp、MVC开发模式、El/JSTL表达式、过滤器、监听器、AJAX、JSON、Maven等
重点知识点:HTML、CSS、JS、jQuery框架、Servlet程序、Filter过滤器、Listener监听器、JSP页面、EL表达式、JSTL标签库、Cookie技术、Session会话、JSON使用、Ajax请求、Tomcat、maven等等。 Java开发的岗位大多是...
笔记说明:包含servlet(高新技术、dom解析、sax解析、HTTP协议、JSP、DTD、自定义标签库、JSTL标签库、 EL表达式、Filter)、mysql、jdbc、文件上传与下载、Ajax、jQuery、struts2、struts2高级、spring、hibernate、...
Servlet/JSP Servlet生命周期及Servlet服务器、Tomcat部署配置、JSP语法、自定义标记、JSTL和EL表达式、JSP 新特性、Java Web 设计模式。 透彻理解Servlet核心原理;熟练掌握Servlet API;透彻理解JSP引擎工作原理;...
后端使用Servlet(控制层开发:业务逻辑,配置)+JSP(视图层开发)+EL表达式(使用EL表达式在页面显示数据)+JSTL(STL标签库c:forEach遍历的运用)+JDBC(数据持久化) 整个项目使用maven管理依赖合构建项目
{2.8}框架中移动的小球}{59}{section.2.8} {2.9}抽象与接口}{59}{section.2.9} {2.10}访问控制}{60}{section.2.10} {2.10.1}类的属性}{60}{subsection.2.10.1} {2.10.2}类的方法}{61}{subsection.2.10.2} {...