4.使用Maven搭建Web项目

# 0.写在前面 回忆一下之前我们的工作,我们发现之前我们使用Maven创建的项目全部都是基于一般Java SE的项目 换句话说就是:之前的项目都是单机项目 但是从目前情况来看,学习如何使用Maven框架搭建一个Java Web项目才是当务之急 那么这一篇章我们主要的目的如下:
1.学习如何通过Java EE版本Eclipse搭建一个Maven项目并且部署运行:     为了方便学习,本着工欲善其事必先利其器的思想(实际上就是为了偷懒)     我们推荐大家使用最新版本的Eclipse工具。     因为在老版本的Eclipse中,使用Maven搭建的Java Web项目会缺东少西     需要使用一定的插件进行补齐     而且如果是第一次使用这些功能,那么下载这些插件也需要很长时间(插件在国外服务器上……你懂得……)     所以在此,我是用最新更新版本的Eclispe构建Java Web项目
2.在基于Maven的Java Web项目中搭建一个Servlet工程:     Servlet是所有Java Web项目的根本。     不管是基于web.xml配置文件版本的还是基于Web 3.0提供的注解标签版本的     都值得我们进行尝试
3.解决Maven使用Web 3.0(及以上)版本的问题:     通过Maven创建的Web项目默认使用的Web版本是2.3版本,这个版本的Web项目可以说是目前来看版本最低的Web版本了     这个版本的Web工程并不支持一些我们常用的Web特性,例如EL表达式(EL表达式从Web 2.4版本才开始支持……)     但是如果我们强行修改web.xml配置文件使用的Web版本号为3.0或者更高版本,将会带来一些额外的麻烦     所以我们必须讨论如何将Maven创建的Web项目正确的更改为Web 3.0或者更高的版本 上述就是本篇章要做的事情。
但是从整体来说,本章的重点还是放在对Maven的配置方式上,
所以本篇章中的Java代码将会直接贴出,不做过多解释,请读者自行参考。   # 1.搭建基于Maven的Java Web项目
1.Eclipse版本的选 首先我们分析下我们现在能够使用的Eclispe版本,并从中选择一个最适合我们的进行使用:     1.MyEclispe:         首先MyEclispe是我们所讨论的3个版本中,功能最强大,也是最为方便的版本         但是,MyEclipse是收费软件这一点大家都是比较清楚的         所以,如果想使用MyEclipse的话,我们需要进行手动破解(手动滑稽)才能够进行使用         并且从内存角度来说,MyEclispe占用的系统资源是十分严重的,所以如果我在开启数据库服务的前提下,         打开MyEclipse、关联Tomcat服务器、部署Web项目并运行将会耗费大量的时间,并且相当容易死机(划重点)         所以,
我们不使用MyEclipse版本     2.Eclispe Java SE版本:         Eclipse本身是开源的,而且分为Java SE和Java EE两个版本         我们平时使用最多的是Eclispe Java SE版本,这个版本的Eclipse提供了相当丰富的Java SE开发功能(主要是各种快捷键……)         但是,Java SE版本的Eclispe并没有提供针对Java Web开发的相关组件         这也就导致我们在使用Java SE版本Eclispe开发Maven Web项目的时候,需要手动安装一部分插件         之前已经说过,这些插件存储在国外的远程服务器上,所以下载相当耗费时间(就像在没配置镜像的Maven上下载Jar包是一样的)         所以,
我们也不使用Eclipse Java SE版本构建Maven的Web项目     3.Eclipse Java EE版本:         好了,没得选了,现在只剩下Eclispe Java EE版本可用了         但是!但是!我们需要精心挑选最新版本的Eclipse Java EE版本使用         因为经过测试,通过早期版本的Eclipse Java EE版本创建Maven Web项目,会缺少必要的项目结构         但是在我的不懈努力下,我终于发现,只要将Eclipse的版本升级到最新版本就行了         在最新版本的Eclipse Java EE版本中修正了这个问题         所以,
我们使用Eclipse Java EE版本的最新版本,创建并运行我们的Maven Web项目
        亲,不要忘记在新的Eclipse中配置Maven环境哦!

附:如何查看Eclipse的型号和版本: 打开Eclispe,并在软件右上角点击Help选项,选择其中的About Eclipse IDE选项:
在弹出的弹窗中,就有当前Eclipse的相关版本信息:

2.创建一个基于Maven的Web项目: 创建一个基于Maven的Web项目的第一个步骤和创建一个普通的Maven项目并没有区别,在此不再赘述,直接上图:

注意:在选择使用的Maven框架的时候,我们不再选择使用quickstart框架,而是选择使用webapp框架:
接下来的步骤和之前创建一般的Maven项目是一样的,还是直接上图:
到此为止,一个基于Maven的Java Web项目就已经搭建成功了!(So easy!)
3.关于项目中的小红叉: 在搭建好Maven项目之后,项目上会出现一个小红叉(挺烦人的)
逐层展开项目,我们会发现,红叉出现的位置实际上指向一个JSP文件:
通过观察这个JSP文件中报错位置的提示信息我们发现,实际上这是因为我们的项目中没有导入Java EE的相关JAR文件导致的:
在接下来的操作中,我们有两种选择:     1.通过Build Path手动导入Java EE相关Jar包     2.通过Maven的pom.xml文件配置这些Jar包的相关依赖 我们使用的可是Maven项目!手动导入Jar包,多丢人啊!妥妥的选择使用Maven配置依赖啊! 于是我们来到:

https://mvnrepository.com

  并搜索Java EE关键字,选择使用最多的一个选项:
接下来选择基于Java 8版本的Java EE类库:
将其中的依赖声明代码复制到项目的pom.xml文件中:
配置之后的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/maven-v4_0_0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.oracle.TestMavenWeb</groupId> <artifactId>TestMavenWeb</artifactId> <packaging>war</packaging> <version>0.0.1-SNAPSHOT</version> <name>TestMavenWeb Maven Webapp</name> <url>http://maven.apache.org</url> <dependencies> <!-- https://mvnrepository.com/artifact/javax/javaee-api --> <dependency> <groupId>javax</groupId> <artifactId>javaee-api</artifactId> <version>8.0</version> <scope>provided</scope> </dependency> </dependencies> <build> <finalName>TestMavenWeb</finalName> </build></project>

  到此为止,保存文件,等待Maven下载相关Jar文件到本地仓库,项目中的红叉就消失了。
4.关于补全丢失的Maven文件结构: 但是经过测试,我发现了Eclipse的一个Bug!!! 之前因为项目中存在错误,Maven项目的目录结构是不完整的(完整的Maven项目目录结构请参考第3章内容) 残缺的项目结构如下:

TestMavenWeb: |---src |----|---main |----|----|---resources |---pom.xml

 
但是在我们通过Maven的方式配置对Java EE的Jar文件的依赖之后,这个问题并没有解决 也就是说,项目中的红叉是没了,但是项目的文件结构还是残缺的,并没有给我们自动补齐 所以,在这里简单介绍下如何通过设置Eclipse,来补齐我们的项目路径: 从网上查询的资料中,我们可以得到这样的一个结论:     
项目路径之所以没有补齐,是因为我们的项目没有使用Eclipse工作空间的默认JRE所导致的 所以从这个思路入手,我们只要将项目使用的JRE版本调整为Eclipse工作空间的默认版本就可以了,步骤如下: 首先选中项目,单击右键,选择Build Path选项,选择其中的Configure Build Path...选项:
在弹出的界面中,选中JRE System Library选项,并点击窗口右侧的Edit(编辑)按钮:
在弹出的窗口中,勾选Workspace default JRE选项:
然后点击Finish结束,一路Apply,我们会惊喜(内心毫无波澜)的发现,Eclipse已经为我们自动补齐了丢失的Maven文件结构:

5.完整的基于Maven的Java Web项目目录结构:
其中:

Java Resources |---src/main/java |---src/main/resources |---src/test/java

 
结构是Maven项目的标准结构(这里少了一个src/test/resources结构,但是不影响项目的部署和运行,如果必要可以手动创建),
其作用和一般Maven项目中结构相同,用来存放项目和测试中的Java源代码和所需的资源文件等。
这个结构也可以在下面展开的src中看到。
其次:

 src |---main |----|---webapp |----|----|---WEB-INF |----|----|----|---web.xml |----|----|---index.jsp

  这个结构是典型的Java Web应用的结构,其中:     webapp文件夹等同于不使用Maven的Java Web项目中的WebRoot(或者WebContent)文件夹,是Web应用的根路径     webapp文件夹下同样存在WEB-INF文件夹,用以存放不希望外界访问的项目文件     WEB-INF文件夹下的web.xml配置文件和不使用Maven的Java Web项目中的web.xml配置文件作用相同,用于配置Servlet等Web组件     与WEB-INF文件夹同级别的index.jsp文件是Eclipse自动为我们提供的一个默认的JSP页面,没有实际内容,如果不需要,可以删除
到此为止,一个健全的,没有任何错误的基于Maven的Java Web项目就已经创建成功了!   # 2.运行基于Maven的Java Web项目 在上述项目创建成功之后,我们就可以搭建一个Tomcat服务器,部署这个项目到服务器中,并通过浏览器访问这个Web项目了 因为这个项目中已经给我们写好了一个index.jsp文件,所以我们直接访问这个JSP文件,就能够测试是否能够正常访问这个Maven项目了 index.jsp文件内容如下(这TM不就是一个HTML页面吗!):

<html><body><h2>Hello World!</h2></body></html>

  我们搭建Tomcat服务器的过程在此不做描述,仅讲解将Maven项目部署到服务器上的过程。
注意:此处我们使用的Tomcat版本为Tomcat 9.0版本
1.将基于Maven的Java Web项目部署到Tomcat服务器上: 在Servers标签项中选中一个已经存在的服务器选项,单击右键,选择Add and Remove...选项:
在弹出的窗口中,将我们刚刚新建好的Maven项目添加到服务器当中:

已经添加Maven项目的服务器列表:

2.启动服务器,检查是否存在报错等情况: 选中带有Maven项目的服务器,单击右键,选择Start启动服务器:
观察Tomcat服务器启动的提示信息,保证启动时没有因为缺少Jar文件而导致的报错信息:

3.通过浏览器访问项目下的index.jsp页面: 启动服务器,输入路径:

http://localhost:8080/TestMavenWeb/index.jsp

  如果得到如下界面,说明能够正常访问Maven项目中的JSP页面,说明Maven项目部署并运行成功:

到此为止,我们已经验证,这个基于Maven的Java Web项目实际上和一般的Java Web项目没有任何区别
可以直接运行在服务器上,并通过浏览器进行访问   # 3.搭建基于Maven的Servlet项目并运行 接下来我们使用Maven和Servlet创建一个用户登录的小案例 老规矩,案例中使用的所有Jar文件均使用Maven进行配置,不通过Build Path进行导入
1.案例说明: 首先先来说明一下案例需求: 在数据表User表中保存了4个字段:     u_id字段:用户主键字段,自增(基本用不上)     username字段:用户名字段     password字段:用户密码字段     phone字段:用户手机号码字段 其中,我们设定用户的手机号码是唯一的(可以在数据库表中使用唯一约束,但是我并不推荐这么做),也就是说没有两个用户的手机号码是一样的 在用户执行登录操作的时候,前端页面要求用户输入用户手机号码和密码,并通过数据库进行登录验证 如果用户登录成功,则在返回页面中显示:欢迎XXX用户回来(XXX就是登录的用户名) 如果用户不存在或者密码错误,那么在返回页面显示:登录失败
2.数据库表结构: 下面我们来看一下数据库表结构:

注意:在数据库User表中,我们没有对phone字段添加唯一键约束,
也就是说对User表中phone字段唯一性的体现是通过Java代码实现的。
3.相关类库说明: 该案例中我们使用如下相关类库:     Java EE类库:为案例提供基本的HttpServlet等类型的支持,是JavaEE项目的基本类库     C3P0类库:本案例中与MySQL数据库的相关链接工作使用C3P0连接池来完成,所以需要使用相关Jar文件     MySQL类库:MySQL数据库的JDBC实现类库 上述类库文件统一通过Maven进行配置,不通过手动当时进行配置。
4.创建项目,配置pom.xml文件: 创建基于Maven的Java EE项目的操作在此不再进行赘述,详细请参考上面#1的内容(偷懒……) 废话少说,直接上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/maven-v4_0_0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.oracle.TestMavenServlet</groupId> <artifactId>TestMavenServlet</artifactId> <packaging>war</packaging> <version>0.0.1-SNAPSHOT</version> <name>TestMavenServlet Maven Webapp</name> <url>http://maven.apache.org</url> <dependencies> <!-- Java EE相关Jar文件配置 --> <!-- https://mvnrepository.com/artifact/javax/javaee-api --> <dependency> <groupId>javax</groupId> <artifactId>javaee-api</artifactId> <version>8.0</version> <scope>provided</scope> </dependency> <!-- MySQL数据库驱动Jar文件配置 --> <!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.40</version> </dependency> <!-- C3P0数据库连接池Jar文件配置 --> <!-- https://mvnrepository.com/artifact/com.mchange/c3p0 --> <dependency> <groupId>com.mchange</groupId> <artifactId>c3p0</artifactId> <version>0.9.5.2</version> </dependency> </dependencies> <build> <finalName>TestMavenServlet</finalName> </build> </project>

 
5.案例核心代码: 在此我们展示项目中核心几个层面的代码: 1.登录页面:Login.html

<!DOCTYPE html><html><head><meta charset="UTF-8"><title>登录页面</title></head><body> <h1>用户登录页面:</h1> <form action="/TestMavenServlet/LoginServlet?method=login" method="post"> <table border="1px" cellpadding="3px" cellspacing="0px" width="30%"> <tr> <td>用户手机号:</td> <td> <input name="phone" type="text" maxlength="11"/> </td> </tr> <tr> <td>用户密码:</td> <td> <input name="password" type="password"/> </td> </tr> <tr> <td colspan="2"> <input type="submit" value="提交登录"/> <input type="reset" value="清空数据"/> </td> </tr> </table> </form></body></html>

  2.连接池:C3P0ConnectionPool

public class C3P0ConnectionPool { private static ComboPooledDataSource dataSource = new ComboPooledDataSource(); private C3P0ConnectionPool() { } public static Connection getConnection() { Connection conn = null; try { conn = dataSource.getConnection(); conn.setAutoCommit(false); }catch(Exception e) { e.printStackTrace(); } return conn; } }

  3.Servlet类型:UserServlet

public class UserServlet extends HttpServlet { private static final long serialVersionUID = 8177420861630816913L; private UserService userServie = new UserService(); //用于执行User相关业务逻辑的服务层对象 @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { String method = req.getParameter("method"); if("login".equals(method)) { userServie.login(req, resp); } } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { req.setCharacterEncoding("utf-8"); resp.setCharacterEncoding("utf-8"); doGet(req, resp); } }

  4.Servlet配置:web.xml配置文件中对UserServlet的配置

 <!-- 对UserServlet的配置信息 --> <servlet> <servlet-name>UserServlet</servlet-name> <servlet-class>com.oracle.servlet.UserServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>UserServlet</servlet-name> <url-pattern>/UserServlet</url-pattern> </servlet-mapping>

  5.Service层:UserService

public class UserService { private UserDAO userDao = new UserDAOImpl(); //用于数据库查询的DAO对象 /** * 执行用户登录的Service方法 * @param req * @param res * @throws Exception */ public void login(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { try { //[1]获取前端页面的表单数据 String phone = req.getParameter("phone"); String password = req.getParameter("password"); //[2]查询用户的登录结果 boolean loginSuccess = userDao.queryUserLogin(phone, password); //[3]如果用户登录成功,则查询用户名 String username = ""; if(loginSuccess) { username = userDao.queryUsernameByPhone(phone); } //[4]编织响应页面,返回用户登录结果 resp.setContentType("text/html;charset=utf-8"); PrintWriter pw = resp.getWriter(); pw.println("<!DOCTYPE html>"); pw.println("<html>"); pw.println("<head>"); pw.println("<meta charset=\"utf-8\">"); pw.println("<title>"); pw.println("登录结果页面"); pw.println("</title>"); pw.println("</head>"); pw.println("<body>"); pw.println("<h1>"); if(loginSuccess) { pw.println("欢迎" + username + "用户回来!"); }else { pw.println("登录失败!"); } pw.println("</h1>"); pw.println("</body>"); pw.println("</html>"); pw.flush(); }catch(Exception e) { e.printStackTrace(); } } }

  6.POJO类:User

public class User { private Integer uId; private String username; private String password; private String phone; public User() { super(); } public User(Integer uId, String username, String password, String phone) { super(); this.uId = uId; this.username = username; this.password = password; this.phone = phone; } public User(String username, String password, String phone) { super(); this.username = username; this.password = password; this.phone = phone; } //后续getter/setter方法和equals方法、hashCode方法、toString方法原码省略 ...}

  7.DAO接口:UserDAO

public interface UserDAO { /** * 通过用户电话号码和用户密码查询用户登录是否成功的方法 * @param phone 用户电话号码 * @param password 用户密码 * @return 用户是否存在 * @throws SQLException */ public boolean queryUserLogin(String phone, String password) throws SQLException; /** * 通过用户手机号码查询用户名的方法 * @param phone 用户手机号码 * @return 用户名 * @throws SQLException */ public String queryUsernameByPhone(String phone) throws SQLException; }

  8.DAO接口实现类:UserDAOImpl

public class UserDAOImpl implements UserDAO { @Override public boolean queryUserLogin(String phone, String password) throws SQLException { Connection conn = C3P0ConnectionPool.getConnection(); String sql = "select count(*) from User where phone = ? and password = ?"; PreparedStatement stat = conn.prepareStatement(sql); stat.setString(1, phone); stat.setString(2, password); ResultSet resultSet = stat.executeQuery(); int result = 0; if(resultSet.first()) { result = resultSet.getInt(1); } if(result == 1) { return true; } return false; } @Override public String queryUsernameByPhone(String phone) throws SQLException { Connection conn = C3P0ConnectionPool.getConnection(); String sql = "select username from User where phone = ?"; PreparedStatement stat = conn.prepareStatement(sql); stat.setString(1, phone); ResultSet resultSet = stat.executeQuery(); String username = ""; if(resultSet.first()) { username = resultSet.getString("username"); } return username; }}

 
9.项目整体文件夹结构:



6.项目部署和运行结果: 部署项目的过程和运行的方式在此不再赘述,详细请参考#2内容(再次偷懒……) 下面展示项目的运行结果: 登录时输入数据的页面:
登录成功的页面:
登录失败的页面:

7.案例总结: 本案例中最为重点的部分有如下两个:     1.对Java Web项目的pom.xml文件配置。通过这个文件,我们再次熟(fu)练(zhi)的应用了Maven,     并综合的配置了Java EE -> MySQL -> C3P0等多个层面,综合运用的Jar文件依赖     2.了解基于Maven的Java Web项目的目录结构。例如:在一般的Java EE项目中,HTML等类型的非Java文件都是直接定义在WebRoot或者WebContent文件夹下的     但是在基于Maven的Java Web项目中,这些文件必须放在Deployed Resources文件夹下的webapp文件夹下才能够访问   # 4.解决Maven使用高版本Web的问题 通过长期的实(cai)践(keng),我们发现:通过Maven创建的Java Web项目,默认使用的Web版本号是2.3版本的 但是这个版本的Web项目已经很古老了,最重要的是早期版本的Web工程并不支持一些高版本的优秀特性 下面我们通过一个小案例来演示这个问题
1.问题演示: 首先我们创建一个基于Maven的Java Web项目,这个项目使用Maven默认的Web版本进行创建 (创建过程不再演示,请自行参考#1中的过程) 然后我们在这个Java Web项目中创建两个JSP页面,并在其中一个页面中使用链接标签的方式跳转到另一个页面中: JSP页面内容: from.jsp:

<%@ page language="java" contentType="text/html;charset=utf-8" pageEncoding="utf-8"%><!DOCTYPE html><html><head><meta charset="utf-8"><title>From JSP</title></head><body> <%String webPath = application.getContextPath();%> <h1>进行跳转的JSP页面</h1> <!-- 使用一般的JSP代码获取跳转的目标路径 --> <a href="<%=webPath%>/jsp/target.jsp">GO! GO! GO!</a></body></html>

  target.jsp:

<%@ page language="java" contentType="text/html;charset=utf-8" pageEncoding="utf-8"%><!DOCTYPE html><html><head><meta charset="utf-8"><title>Target JSP</title></head><body> <%String webPath = application.getContextPath();%> <h1>跳转到的JSP页面</h1></body></html>

  通过实验,上述方式实现的页面跳转功能是可以正常使用的 但是,我们将from.jsp中执行跳转的链接标签中,目标路径的获取方式改变为包含EL表达式的方式,那么就会发现如下问题: 首先,最直观的为题在于:页面跳转失败了!(知道为什么失败吗?真让我替你感到悲哀~~~)

2.问题原因分析: 经过仔细认真的分析(我认真了5分钟左右),我确定:我的EL表达式没有写错! 再次查看报错页面,我发现这样一个问题:
如图中红框所示:
跳转路径中的EL表达式根本没有被解析! 这就是造成页面跳转失败的直接原因。 通过查阅大量资料,我得到这样一条信息:
并不是所有的版本的Java Web都支持EL表达式的使用,Java Web对EL表达式的支持是从Web 2.4版本之后才开始的。 通过这条信息,我又得到一条推论:
当前基于Maven的Java Web项目使用的版本一定比Web 2.4要低,至于具体使用的哪个Web版本,我也不知道(废话,轻喷) 知道后来我去翻看web.xml配置文件,我才注意到文件头中声明的Web版本号是2.3!
好了,问题的原因找到了,下面就剩下如何解决这个问题了
3.调整项目使用的Web版本号为3.0版本 为了能够使用更多Web的高级特性,我们需要想办法将当前项目使用的Web版本调整到更高 为了方便起见,我使用Web 3.0版本作为案例标准,其余版本的调整大同小异 1.修改org.eclipse.wst.common.project.facet.core.xml文件: 为了修改这个文件,我们首先需要借助Navigator(导航)这个窗口,找到这个文件,具体步骤如下: 单击Window选项 -> 选择Show View选项 -> 找到Navigator选项:
切换到Navigator视图之后,找到我们需要修改Web版本的项目,并在项目下按照如下路径找到文件: 项目 -> .settings文件夹 -> 
org.eclipse.wst.common.project.facet.core.xml文件
双击并打开这个文件,文件内容如下:

<?xml version="1.0" encoding="UTF-8"?><faceted-project> <fixed facet="wst.jsdt.web"/> <installed facet="java" version="1.8"/> <installed facet="jst.web" version="2.3"/> <installed facet="wst.jsdt.web" version="1.0"/></faceted-project>

  在这个文件添加如下代码:

<installed facet="jst.jaxrs" version="2.0"/><installed facet="jst.jsf" version="2.2"/>

  并将其中的

<installed facet="jst.web" version="2.3"/>

  选项的version取值更改为3.0,表示我们目前使用的项目Web版本为:

<installed facet="jst.web" version="3.0"/>

  更改后的文件整体内容如下:

<?xml version="1.0" encoding="UTF-8"?><faceted-project> <fixed facet="wst.jsdt.web"/> <installed facet="java" version="1.8"/> <installed facet="jst.web" version="3.0"/> <!-- 将version的取值改变为3.0 --> <installed facet="wst.jsdt.web" version="1.0"/> <installed facet="jst.jaxrs" version="2.0"/> <!-- 新加入的内容 --> <installed facet="jst.jsf" version="2.2"/> <!-- 新加入的内容 --></faceted-project>

 
注意:如果我们不对这个配置文件进行修改的话,后续操作将会出现异常 2.确认当前项目使用的Web版本号: 在Eclipse中选中Project选项,点击Properties选项,并打开其中Project Facets选项卡:
此时我们能够通过这个窗口确认,当前的项目所使用的Web版本号变成了3.0版本:
3.修改web.xml文件头信息: 通过上述的操(zhe)作(teng),我们已经成功的将当前项目使用Web版本更改为我们想要的3.0版本了 但是这里需要提醒大家的是:Web 3.0版本需要JDK 1.6或者更高版本的支持,否在在运行的时候依然会报错 下面我们要做的就是将web.xml文件的文件头更改为Web 3.0格式的文件头了 下面提供一个Web 3.0版本的web.xml文件头的模板:

<?xml version="1.0" encoding="UTF-8"?><web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">

 
注意:在修改web.xml文件为使用Web 3.0的文件头的时候,我们需要修改<web-app>标签的起始标签,请不要忘记这一步 修改前的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配置文件:

<?xml version="1.0" encoding="UTF-8"?><web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0"> <display-name>Archetype Created Web Application</display-name></web-app>

  4.更新Maven项目: (这一步就不截图了……)
4.测试验证: 现在我们已经将项目所使用的Web版本调整为Web 3.0版本了,从理论上上来讲,项目应该已经能够支持EL表达式的操作了 下面我们将这个项目重新部署在服务器当中并运行,查看一下运行结果:
访问成功!这说明此时写在JSP页面中的EL表达式已经能够被成功解析了,也就是说,我们创建的项目所使用的Web版本号被成功修改为Web 3.0版本!
注意:实际上从Web 3.0版本开始就已经为我们提供了基于注解标签的Servlet开发方式
通过这种开发方式实现的Java Web项目是不需要再web.xml配置文件中配置<servlet>和<servlet-mapping>标签和
也就是说,此时的web.xml文件基本上没啥用了。
情况也确实如此,Web 3.0项目中并不强制要求存在web.xml配置文件
也就是说,如果我们使用Web 3.0版本进行项目开发,web.xml文件可以删除
但是在基于Maven创建的Java Web项目中,如果删除web.xml配置文件,将会导致pom.xml文件中的<package>标签报错
究其根本原因在于:Maven需要通过判断当前项目中是否存在web.xml配置文件来决定这个项目能不能打成war包(基于Maven的Java Web项目的pom.xml文件中的<package>标签的取值就是war)
虽然这个问题可以通过在pom.xml文件中添加插件声明的方式进行解决,但是我个人觉得根本没有这个必要
即使是通过Web 3.0版本进行开发的项目,带上一个空的web.xml文件又能如何呢!
所以这个问题在此我们不做讨论
到此为止,我们创建并运行一个基于Maven的Java Web项目的全部操作就完成了!

 

相关文章