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

原文地址:https://www.cnblogs.com/noyitela/p/10386455.html

时间: 2024-12-21 13:25:56

4.使用Maven搭建Web项目的相关文章

如何使用maven搭建web项目

博客园注册了有二十多天了,还没有写过博客,今天就发一篇,也便于后面查找笔记. 我个人已经做了几年的java web开发了,由于所在的公司是业务型公司,用的都是一些老旧的稳定技术,很少接触到稍微新点的内容, 经过几年的不进则退,自己的技术能力已经开始慢慢的被时代潮流淘汰.为了在大浪淘沙中能生存下来,自己要好好加油,从基本内容开始,稳步沉淀,更新自己的技术库. 不求一口吃个大胖子,只求每天进步一点点. 废话不多说,言归正传.如何使用maven搭建web项目呢? 第一步:首先创建一个maven项目 创

springmvc+maven搭建web项目之二 通过另一种方式配置spring

1.创建maven web项目 2. 配置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

Maven搭建web项目

1,设置本地仓库 maven-->conf-->setting.xml2,新建maven项目 org.apache.maven.archetypes  maven-archetype-webapp RELEASE3,填写详细信息 groupId(项目结构) artifactid(项目名)4,添加Source Folder Maven规定,必须创建以下几个Source Folder src/main/resources src/main/java src/test/resources src/t

springmvc+maven搭建web项目

1.创建一个maven project 为spring1 2.进行项目的配置:默认的java 1.5 在properties中选择project facts项目进行配置,反选web之后修改java环境为1.8.修改之后如下图: 3. 配置好的工作目录如下: 4 修改pom.xml文件 增加两个jar包:servlet和spring webmvc pom.xml如下: <!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web A

eclipse+maven搭建web工程之创建

本文参考了 一米阳光的搭建过程,大致基本是一样的,有一些不一样,自己也搭一个练习一下! 1.创建maven project 1)首先,右键-->项目: 2)弹出选择导向框,在里面输入maven: 接着处理webapp,还是右键工程,选择属性,这里上面给过图了,还是选择Project Facets:如下 右键工程,选择属性: 下一篇:eclipse+maven搭建web工程之发布和访问 .

Java EE 学习(4):IDEA + maven 搭建 web(2)

参考:http://www.bubuko.com/infodetail-1855067.html 现使用 Maven 创建项目:本节接上节,主要完成使用 maven 创建 web 项目,并进行基本的打包操作,未涉及 spring 包. 1  为方便,首先打开工具按钮: 安装好IntelliJ IDEA默认界面一般是这样的 ,没有显示工具栏,操作很不方便 由于是第一次用,所以对整个工具使用都不是很清楚,那如果想要显示出来,我们点击 view,然后勾选 toolbar 就行了 现在我们可以看到我们的

Spring-Boot快速搭建web项目详细总结

最近在学习Spring Boot 相关的技术,刚接触就有种相见恨晚的感觉,因为用spring boot进行项目的搭建是在太方便了,我们往往只需要很简单的几步,便可完成一个spring MVC项目的搭建,感觉就是下图: 好,下面就本人搭建项目的过程简单说说如何快速搭建一个spring MVC项目,相信我,spring-boot这趟车,你上了根本就停不下来了! 下面是这篇博客的主要内容: 1.spring boot 介绍 2.spring boot 项目快速搭建 3.spring-boot中单元测试

IDEA下使用maven构建web项目(SpringMVC+Mybatis整合)

需求背景:由于最近总是接到一些需求,需要配合前端团队快速建设移动端UI应用或web应用及后台业务逻辑支撑的需求,若每次都复用之前复杂业务应用的项目代码,总会携带很多暂时不会用到的功能或组件,这样的初始工程就存在冗余代码. 在本文中,我们将使用Java语言开发集成环境IntelliJ IDEA(其倡言是智能编码?),应用maven构建SpringMVC整合Mybatis+MySQL5.7(流行框架)的web项目:目的在于快速构建一个简洁纯净版的web应用工程,将其作为一个基础web-demo,以便

Maven学习(三)- 使用Maven构建Web项目

从网上查了一些资料,才算明白(也就是怎么操作吧),怎么使用Maven构建一个Web项目,找到一篇文档,主要都是从这里学到的: 下载地址:使用Eclipse构建Maven的Web项目.docx 现自己在重新操作一下:(使用的是Eclipse JavaEE版 ps:eclipse-jee-indigo-SR1-win32,已经安装好了m2eclipse插件) 1.新建Maven项目 1.1 File -> New -> Other 1.2 选择Maven Project ,单击Next 1.3 保