Dynamic Web开发之版本分析

来源:互联网 发布:贪心算法经典案例 编辑:程序博客网 时间:2024/06/04 18:04

前言:写这篇博客的原因是,我在使用Maven构建一个web模块的时候,其使用的JavaSE1.5环境,在build path配置中改变后,更新Maven项目又变成了1.5,而且EL表达式在JSP中无法解析,这也就是我弄清楚这些问题的初衷。

  我们使用Maven的maven-archetype-webapp创建Web模块,其默认使用的是J2SE-1.5环境,而且Dynamic Web的版本为2.3,我们可以通过如下方式进行查看:项目右击——>最下面的Properties——>Project Facets,如下:


  我们可以查看到<1>的版本为2.3,<2>的版本为1.5,更让人郁闷的是在Java上右击可以Change Version,而Dynamic Web Module却无法更改,并且Java的版本是改了,可是你是用Maven进行update Project,Java的版本又变成了1.5。

  在我们针对这个问题讲述解决方法之前,先对各个版本关系进行整理。

1. Servlet API

  Web项目开发离不开Servlet,Servlet的各版本如下:

Servlet API historyServlet APIversionPlatformImportant ChangesServlet 3.1Java EE 7Non-blocking I/O, HTTP protocol upgrade mechanism (WebSocket)Servlet 3.0Java EE 6, Java SE 6Pluggability, Ease of development, Async Servlet, Security, File UploadingServlet 2.5Java EE 5, Java SE 5Requires Java SE 5, supports annotationServlet 2.4J2EE 1.4, J2SE 1.3web.xml uses XML SchemaServlet 2.3J2EE 1.3, J2SE 1.2Addition of FilterServlet 2.2J2EE 1.2, J2SE 1.2Becomes part of J2EE, introduced independent web applications in .war filesServlet 2.1UnspecifiedFirst official specification, added RequestDispatcher, ServletContextServlet 2.0JDK 1.1Part of Java Servlet Development Kit 2.0

  我们在开发中都会接触到web.xml文件,其中根元素<web-app>其中的version就是指定的Servlet的版本,其中最主要的分水岭,就是Servlet2.4,因为从这个版本开始web.xml使用XML Schema(关于更多的web.xml头信息的写法可参考:web.xml部署描述符),而Maven创建的webapp的Servlet版本是2.3,其web.xml为如下格式:

<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd" ><web-app>  <display-name>Archetype Created Web Application</display-name></web-app>
  通过后缀可以看出该web.xml指定的Servlet版本是2.3,我们将其改成比较新的版本如3.0或3.1之后,我们更新当前的Maven项目(或模块),会报如下错误:


2. Tomcat与Servlet

Tomcat官网资料:http://tomcat.apache.org/whichversion.html

  Apache Tomcat is an open source software implementation of the Java Servlet and JavaServer Pages technologies. Different versions of Apache Tomcat are available for different versions of the Servlet and JSP specifications. The mapping between the specifications and the respective Apache Tomcat versions is:

  Tomcat 服务器是一个免费的开放源代码的Web 应用服务器,其实现了Java Servlet和JSP技术。不同版本的Tomcat可用于不同版本的servlet和JSP规范。Tomcat版本各版本与这些规范的对应关系,如下:

Servlet SpecJSP SpecEL SpecWebSocket SpecJASPIC SpecApache Tomcat VersionLatest Released VersionSupported Java Versions4.0TBD (2.4?)TBD (3.1?)TBD (1.2?)1.19.0.x9.0.0.M19 (alpha)8 and later3.12.33.01.11.18.5.x8.5.137 and later3.12.33.01.1N/A8.0.x (superseded)8.0.43 (superseded)7 and later3.02.22.21.1N/A7.0.x7.0.776 and later
(7 and later for WebSocket)2.52.12.1N/AN/A6.0.x6.0.515 and later2.42.0N/AN/AN/A5.5.x (archived)5.5.36 (archived)1.4 and later2.31.2N/AN/AN/A4.1.x (archived)4.1.40 (archived)1.3 and later2.21.1N/AN/AN/A3.3.x (archived)3.3.2 (archived)1.1 and later  Each version of Tomcat is supported for any stable Java release that meets the requirements of the final column in the table above.

3. Maven问题解决

<1> 首先就是有一个maven webapp项目。

<2> 当刚创建的时候项目上有个红叉(都是这样,正常),然后右击项目build path,添加jre&tomcat(看缺什么),此时我这边不会报错了。

<3> 打开项目所在文件夹,在.settings文件夹下打开org.eclipse.wst.common.project.facet.core.xml文件,然后修改JDK及Servlet版本。我们在最上面的图中可以看到有三项被勾选上了,分别是Dynamic WebModule、Java和JavaScript,我们在org.eclipse.wst.common.project.facet.core.xml文件文件中可以看到如下内容:

<faceted-project>  <fixed facet="wst.jsdt.web"/>  <installed facet="jst.web" version="2.3"/>  <installed facet="wst.jsdt.web" version="1.0"/>  <installed facet="java" version="1.5"/></faceted-project>
  其中有三个version分别对应的就是Dynamic WebModule、Java和JavaScript这三个选项的版本,从大体内容上我们也可以分辨出来,其对应关系如下:

  • jst.web : Servlet
  • wst.jsdt.web : JavaScript
  • java : JDK

<4> 在Maven项目的POM中加入编译器版本,其中指定的版本与上面更改的JDK版本一致,如下:

<build>      <plugins>          <plugin>              <groupId>org.apache.maven.plugins</groupId>              <artifactId>maven-compiler-plugin</artifactId>              <version>3.1</version>              <configuration>                  <source>1.8</source>                  <target>1.8</target>                  <encoding>${project.build.sourceEncoding}</encoding>              </configuration>          </plugin>      </plugins>  </build> 
<5> 修改web.xml的头文件,指定的版本也应该与上面更改的Servlet版本一致,如下:

<?xml version="1.0"?><web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"           xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee           http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"           version="3.1">  </web-app> 
<6> 右击项目找到Maven,然后选择Update Project,这样就可以了。

注意:如果你在web.xml文件头中指定的Servlet版本为3.1,而在org.eclipse.wst.common.project.facet.core.xml文件中指定的却是3.0,那么更新Maven项目后保留的是web.xml文件中指定的版本,也就是3.1,而org.eclipse.wst.common.project.facet.core.xml文件中指定版本也会被变更为3.1。同理JDK的版本也是出现这种情况,最终保留的是POM中指定的JDK版本。

  那么问题来了,如果我在POM中指定好JDK版本,然后将web.xml文件头文件改成相应的Servlet版本,而不去更改org.eclipse.wst.common.project.facet.core.xml文件的前提下,更新Maven项目,这样可以直接修改成功吗?

  我使用的Eclipse的版本为:Neon.3 Release (4.6.3),经过测试,答案是不可以,所以我们必须手动修改才可以。有趣的是,我只要手动修改一下org.eclipse.wst.common.project.facet.core.xml文件,指定Servlet的版本在2.5及其以上,更新Maven项目就会将POM与web.xml中的配置信息写入这个文件中。至于为什么,不知道。

&#8195&#8195

最后修改时间:2017年4月7日23:46:56

参考资料:

维基百科——Java servlet

servlet版本与tomcat版本对应关系,各版本web.xml头信息写法

关于web.xml不同版本之间的区别

maven webapp项目更改servlet版本

************************************************************************结束语************************************************************************
  我在写这篇博客的时候也是一名初学者,有任何疑问或问题请留言,或发邮件也可以,邮箱为:fanxiaobin.fxb@qq.com,我会尽早的进行更正及更改。
在我写过的博客中有两篇博客是对资源的整理,可能对大家都有帮助,大家有兴趣的话可以看看!!
下载资料整理——目录:http://blog.csdn.net/fanxiaobin577328725/article/details/51894331
  这篇博客里面是我关于我见到的感觉不错的好资源的整理,里面包含了书籍及源代码以及个人搜索的一些资源,如果有兴趣的可以看看,我会一直对其进行更新和添加。
优秀的文章&优秀的学习网站之收集手册:http://blog.csdn.net/fanxiaobin577328725/article/details/52753638
  这篇博客里面是我对于我读过的,并且感觉有意义的文章的收集整理,纯粹的个人爱好,大家感觉有兴趣的可以阅读一下,我也会时常的对其进行更新。
************************************************************************感谢************************************************************************

0 0
原创粉丝点击