4.使用Maven搭建Web项目

Posted noyitela

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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项目的全部操作就完成了!

 



以上是关于4.使用Maven搭建Web项目的主要内容,如果未能解决你的问题,请参考以下文章

SSM项目---员工管理系统的基础环境搭建

使用ideal搭建基于maven的web项目

使用ideal搭建基于maven的web项目

使用IntelliJ IDEA和maven搭建java web项目

Java学习01-使用maven插件tomcat搭建web maven项目

IDEA下web项目的搭建