`
shiftbank
  • 浏览: 8049 次
  • 性别: Icon_minigender_1
  • 来自: 济南
社区版块
存档分类
最新评论

Servlet, JSP, JSTL, EL在maven中的配置

    博客分类:
  • java
阅读更多

本人在实际项目和各种框架中,发现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 员工管理系统

    项目所用技术 Servlet、jsp、el、jstl、jdbc、maven 使用MVC设计思想进行构建,使用全注解开发。

    老杜Servlet笔记.zip

    哔哩哔哩上老杜的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 数据分页展示

    基于JSP+Servlet,使用Java EE开发的商城管理系统源码+项目说明.zip

    后端使用了Java Servlet技术处理HTTP请求,加上JSP技术,使用EL表达式和JSTL标签来辅助开发 前端页面使用了Jquery、BootStrap框架。 项目使用 Maven3.6.0 构建,服务器为 Tomcat 9.0.17 ### 1.示例地址:...

    pzhujavaweb的图书管理系统

    攀枝花学院课程设计 javaweb的图书管理系统 ...maven+jstl+el+jsp +servlet+mvc三层控制结构 完成书籍的增删查改操作,用户登陆注册 具有前端验证 采用过滤器监听器 能统计总共历史在线人数和当然在线人数

    百度地图毕业设计源码-Java-Notes:2020Java快速成长学习路线,从0到1的过程,打破你知识的盲区,渐渐爱上Java,我想对还是小

    Servlet Jsp EL JSTL Cookie Session Filter Listener 编程强化 设计模式 JVM优化 数据结构算法 多线程高级 MINA Netty NIO 软件项目,代码管理 Markdown Maven SVN Git 码云 github Jenkins Sonar Part2: 热门框架&...

    160G!全新升级版 JAVAEE云计算全栈就业班课程 完美试炼JAVAEE企业级云计算应用

    │ ├&lt;09-JSP,EL和JSTL&gt; │ ├综合案例(用户信息)&gt; │ ├和Listener&gt; │ ├ │ ├和JSON&gt; │ ├ │ ├&lt;15-Maven基础&gt; │ ├旅游网&gt; │ ├ │ └ ├&lt;阶段3.1 Mybatis·&gt; │ ├课程介绍及环境搭建&gt; │ ├入门案例&gt; │ ...

    JavaWeb每日总结思维导图

    MySQL、MySQL约束&多表、MySQL多表&事务、JDBC、数据库连接池、HTML、CSS、JS基础&高级、BootStrap、XML、Tomcat、Servlet&HTTP&Request、Response、Cookie&Session、JSP&EL&JSTL、Filter&Listener、jQuery、Ajax、...

    Java及大数据学习路线.pdf

    1.Java学习路线 1.1JavaSE Java基础 Java8新特性 数据库MySQL与SQL语⾔ JDBC 1.2JavaWeb HTML基础与CSS JavaScript DOM 与 jQuery XML与Tomcat HTTP协议 服务器端组件Servlet JSP EL表达式 JSTL 会话控制Cookie和...

    基于JavaWeb + Mysql + Layui实现的宿舍管理系统源码+数据库+演示截图+项目说明.zip

    - 后端方面:JavaSe核心语法、MVC(controlle层、service、dao层)模型开发、jsp相关语法(jstl标签库、el表达式)、maven构建项目和管理jar包 - 前端方面:JavaScript(jquery)核心语法、AJAX异步刷新、Layui前端 UI...

    Java Web.md

    非常详细的javaWeb知识点梳理,涵盖:XML、网络通信、Tocmcat服务器概述、servlet、Request/Response、Cookie、Session、jsp、MVC开发模式、El/JSTL表达式、过滤器、监听器、AJAX、JSON、Maven等

    Java后端学习路线 (详细路线)

    重点知识点:HTML、CSS、JS、jQuery框架、Servlet程序、Filter过滤器、Listener监听器、JSP页面、EL表达式、JSTL标签库、Cookie技术、Session会话、JSON使用、Ajax请求、Tomcat、maven等等。 Java开发的岗位大多是...

    javaee笔记

    笔记说明:包含servlet(高新技术、dom解析、sax解析、HTTP协议、JSP、DTD、自定义标签库、JSTL标签库、 EL表达式、Filter)、mysql、jdbc、文件上传与下载、Ajax、jQuery、struts2、struts2高级、spring、hibernate、...

    达内java培训目录

    Servlet/JSP Servlet生命周期及Servlet服务器、Tomcat部署配置、JSP语法、自定义标记、JSTL和EL表达式、JSP 新特性、Java Web 设计模式。 透彻理解Servlet核心原理;熟练掌握Servlet API;透彻理解JSP引擎工作原理;...

    mvn_oms:mvn_oms

    后端使用Servlet(控制层开发:业务逻辑,配置)+JSP(视图层开发)+EL表达式(使用EL表达式在页面显示数据)+JSTL(STL标签库c:forEach遍历的运用)+JDBC(数据持久化) 整个项目使用maven管理依赖合构建项目

    Java学习笔记-个人整理的

    {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} {...

Global site tag (gtag.js) - Google Analytics