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项目的全部操作就完成了!