创建一个Maven Project
右键
-> New
-> Other...
-> 搜索‘maven
’ -> 选择‘Maven Project
’ -> Next
创建一个简单项目
勾选:Create a simple project
(自动创建约定的项目目录结构,即不使用骨架)-> Next
确定唯一标示
填写如截图中的内容 -> Nex
-> Finish
- Group id: 组织id,域名倒写;
- Artifact id:项目、模块id;
- Version: 版本;
- Packaging: 该元素决定了项目的打包方式,有3种,jar,war,pom(比如是一个父模块);
Maven为jar项目调用了maven-jar-plugin,为war项目调用了maven-war-plugin,换言之,packaging直接影响Maven的构建生命周期
由于packing是war包,那么下面也就多出了webapp的目录
转换为dynamic web project
由于我们的项目要使用eclipse发布到tomcat下面,这里我们需要先把项目转成 dynamic web project
。
在我们的项目上点击 右键
,选择 Properties
并找到 Project Facets
,并点击Convert to faceted form...
将maven项目转换为Dynamic Web项目,勾选 Dynamic Web Module
, 并点击 Further configuration available...
勾选生成web项目需要的部署描述符文件 web.xml
, 然后点击 OK
-> OK
接下来观察我们的项目结构,多了一个WebContent目录
META-INF
相当于一个信息包,目录中的文件和目录获得Java 2平台的认可与解释,用来配置应用程序、扩展程序、类加载器和服务。
MANIFEST.MF文件,在用jar打包时自动生成。
转为标准的Maven项目结构
虽然此时我们可以发布到tomcat中,但这不符合maven的结构,“约定优于配置”,转为标准的maven项目结构。
我们还要做如下修改:
把上图 WebContent
下面两个目录 META-INF,WEB-INF
直接剪切到 src/main/webapp
目录下,并删掉 WebContent
目录,那么现在的项目结构如下图:
修改发布规则
需要修改发布规则,右键点击项目,选择 Properties
, 选择 Deployment Assembly
- 选择
WebContent
,把它Remove
- 测试类我们也不需要发布,
test
的两个目录页可以Remove
因为是基于Maven项目,需要把Maven依赖库也添加到发布路径,点击 Add
, 选择 Java Build Path Entries
, Next
,选择 Maven Dependencies
, Finish
, OK
此处列表是,部署项目时,文件发布的路径
至此一个基于maven的webapp就建立好了,并可以直接从eclipse中发布到tomcat中。
导入我们的Spring MVC依赖jar包
在 pom.xml
文件中写入下面的依赖,maven会自动为我们下载需要依赖的jar包,
<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/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.test</groupId>
<artifactId>springmvc</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>war</packaging>
<!-- 集中定义依赖版本号 -->
<properties>
<spring.version>4.1.3.RELEASE</spring.version>
<jstl.version>1.2</jstl.version>
<servlet-api.version>2.5</servlet-api.version>
<jsp-api.version>2.0</jsp-api.version>
<commons-lang3.version>3.3.2</commons-lang3.version>
<commons-io.version>1.3.2</commons-io.version>
<commons-net.version>3.3</commons-net.version>
</properties>
<dependencies>
<!-- Spring -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aspects</artifactId>
<version>${spring.version}</version>
</dependency>
<!-- JSP相关 -->
<dependency>
<groupId>jstl</groupId>
<artifactId>jstl</artifactId>
<version>${jstl.version}</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>${servlet-api.version}</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jsp-api</artifactId>
<version>${jsp-api.version}</version>
<scope>provided</scope>
</dependency>
<!-- Apache工具组件 -->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>${commons-lang3.version}</version>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-io</artifactId>
<version>${commons-io.version}</version>
</dependency>
<dependency>
<groupId>commons-net</groupId>
<artifactId>commons-net</artifactId>
<version>${commons-net.version}</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<configuration>
<port>8081</port>
<path>/</path>
</configuration>
</plugin>
</plugins>
</build>
</project>
此时工程目录下多了 Maven Dependencies
库
在上面的步骤中,我们在 pom.xml 文件中加入了好多东西,简单说说。
<!-- 集中定义依赖版本号 -->
<properties>
<spring.version>4.1.3.RELEASE</spring.version>
<jstl.version>1.2</jstl.version>
<servlet-api.version>2.5</servlet-api.version>
<jsp-api.version>2.0</jsp-api.version>
<commons-lang3.version>3.3.2</commons-lang3.version>
<commons-io.version>1.3.2</commons-io.version>
<commons-net.version>3.3</commons-net.version>
</properties>
在大型项目或者比较复杂的项目,例如聚合项目中,为了统一规定版本号,可以在父类工程中集中定义依赖版本号,这样在子类工程中就不许要考虑版本号问题了。
从这里也可以看出该文件中有3大类依赖,spring,jsp以及工具类。
<!-- Spring -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.version}</version>
</dependency>
在 <properties>
节点中集中定义了依赖版本号后,具体的依赖中就可以如上面直接用花括号的形式引用版本号了,当然要是再父类工程定义了版本号,子类想要用父类定义好的版本号,需要引入父类工程,如
<parent>
<artifactId>springmvc-parent</artifactId>
<groupId>com.test</groupId>
<version>0.0.1-SNAPSHOT</version>
</parent>
后面的 build
节点中集成了Tomcat7 插件,这样在运行项目时,只需要 项目右键 -> Run as
-> Run Configurations...
, 在 Goals
中填入 tomcat7:run
就可以自动部署项目到tomcat下运行了。
<build>
<plugins>
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<configuration>
<port>8081</port>
<path>/</path>
</configuration>
</plugin>
</plugins>
</build>
根据部署描述符(web.xml)中的默认欢迎页面,我们在webapp下新建一个 index.jsp
页面
<?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" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" 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>springmvc</display-name>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
<welcome-file>default.html</welcome-file>
<welcome-file>default.htm</welcome-file>
<welcome-file>default.jsp</welcome-file>
</welcome-file-list>
</web-app>
项目右键 -> Run as
-> Run Configurations...
, 在 Goals
中填入 tomcat7:run
,单击 Run
,项目运行。
控制台中会输出下面的信息
[INFO] Running war on http://localhost:8081/
[INFO] Creating Tomcat server configuration at D:\workspace_springmvc\springmvc\target\tomcat
[INFO] create webapp with contextPath:
在浏览器中输入 http://localhost:8081
,回车
自此,基于maven搭建的web项目能正常访问了。
我们再看下项目结构,多了个 target
文件夹,这个是哪来的?
如图可知,java编译后的字节码文件就存在 target/classes
下
下一步,就是集成SpringMVC。
集成SpringMVC
我们在
- 在
src/main/java
下新建包:控制层(mvc.controller),业务逻辑层(mvc.service),数据访问层(mvc.dao),还有实体层(mvc.entity); - 在
src/main/resources
下新建spingmvc所需要的配置文件/mvc/config/springmvc.xml
; - 在
WEB-INF
下新建文件夹: css,js,jsp,用于存放资源文件和页面等 - 在部署描述符(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" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" 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>springmvc</display-name>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
<servlet>
<servlet-name>dispatcherServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:mvc/config/springmvc.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<!-- 拦截所有的请求,包括WEB-INF下资源文件请求 -->
<servlet-mapping>
<servlet-name>dispatcherServlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
- 在新建的
springmvc.xml
文件中,我们需要加入下面的内容:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
<!-- spring基于扫描机制找到应用程序中所有基于注解的控制器类和业务逻辑层 -->
<context:component-scan base-package="mvc.controller" />
<context:component-scan base-package="mvc.service" />
<!-- 由于在`web.xml`中,会拦截所有的请求'/',包括 `WEB-INF`下的资源文件:css,js等,而在`WEB-INF` 下的文件又不能直接访问,这里需要特殊处理下-->
<mvc:annotation-driven />
<mvc:resources location="/WEB-INF/css/" mapping="/css/**"></mvc:resources>
<mvc:resources location="/WEB-INF/js/" mapping="/js/**"></mvc:resources>
<!-- 视图解析器 -->
<bean id="viewResolver"
class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/jsp/"></property>
<property name="suffix" value=".jsp"></property>
</bean>
</beans>
下面是一系列源码,很简单,就不解说了,文章最后附有完整的项目工程。
实体类 Book.java
public class Book implements Serializable {
private static final long serialVersionUID = 1520961851058396786L;
private long id;
private String isbn;
private String title;
private Category category;
private String author;
public Book() {
}
public Book(long id, String isbn, String title,
Category category, String author) {
this.id = id;
this.isbn = isbn;
this.title = title;
this.category = category;
this.author = author;
}
// getter and setter
}
实体类 Category.java
public class Category implements Serializable {
private static final long serialVersionUID = 5658716793957904104L;
private int id;
private String name;
public Category() {
}
public Category(int id, String name) {
this.id = id;
this.name = name;
}
// getter and setter
}
这里忽略数据访问层DAO
业务逻辑层接口类 BookService.java
public interface BookService {
List<Category> getAllCategories();
Category getCategory(int id);
List<Book> getAllBooks();
Book save(Book book);
Book update(Book book);
Book get(long id);
long getNextId();
}
业务逻辑层接口实现类 BookServiceImpl.java
@Service
public class BookServiceImpl implements BookService {
/*
* this implementation is not thread-safe
*/
private List<Category> categories;
private List<Book> books;
public BookServiceImpl() {
categories = new ArrayList<Category>();
Category category1 = new Category(1, "Computing");
Category category2 = new Category(2, "Travel");
Category category3 = new Category(3, "Health");
categories.add(category1);
categories.add(category2);
categories.add(category3);
books = new ArrayList<Book>();
books.add(new Book(1L, "9780980839623",
"Servlet & JSP: A Tutorial",
category1, "Budi Kurniawan"));
books.add(new Book(2L, "9780980839630",
"C#: A Beginner's Tutorial",
category1, "Jayden Ky"));
}
@Override
public List<Book> getAllBooks() {
return books;
}
...
}
最后控制层类 BookController.java
@Controller
public class BookController {
@Autowired
private BookService bookService;
private static final Log logger = LogFactory.getLog(BookController.class);
@RequestMapping(value = "/book_list")
public String listBooks(Model model) {
logger.info("book_list");
List<Book> books = bookService.getAllBooks();
model.addAttribute("books", books);
return "BookList";
}
...
}
页面 BookList.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Book List</title>
<style type="text/css">
@IMPORT url("./css/main.css");
</style>
</head>
<body>
<div id="global">
<h1>Book List</h1>
<a href="<c:url value='/book_input'/>">Add Book</a>
<table>
<tr>
<th>Category</th>
<th>Title</th>
<th>ISBN</th>
<th>Author</th>
<th> </th>
</tr>
<c:forEach items="${books}" var="book">
<tr>
<td>${book.category.name}</td>
<td>${book.title }</td>
<td>${book.isbn }</td>
<td>${book.author }</td>
<td><a href="book_edit/${book.id }">Edit</a></td>
</tr>
</c:forEach>
</table>
</div>
</body>
</html>
由于我在pom.xml 文件中配置的 项目访问路径是 “/”,所以直接在浏览器中输入:
http://localhost:8081/book_list
自此,用Maven搭建SpringMVC项目就讲完了,还有很多细节需要处理,需要不断学习。
完整工程下载链接:https://pan.baidu.com/s/1hrQdCwc 密码:kifh