如何使用Maven搭建SpringMVC项目

本文介绍如何使用Maven创建并配置SpringMVC项目,包括项目结构设置、依赖管理及SpringMVC核心配置。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

创建一个Maven Project

右键 -> New -> Other... -> 搜索‘maven’ -> 选择‘Maven Project’ -> Next

maven-to-springmvc

创建一个简单项目

勾选:Create a simple project(自动创建约定的项目目录结构,即不使用骨架)-> Next

maven-to-springmvc

确定唯一标示

填写如截图中的内容 -> 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的构建生命周期

maven-to-springmvc

由于packing是war包,那么下面也就多出了webapp的目录

maven-to-springmvc

转换为dynamic web project

由于我们的项目要使用eclipse发布到tomcat下面,这里我们需要先把项目转成 dynamic web project
在我们的项目上点击 右键,选择 Properties 并找到 Project Facets ,并点击Convert to faceted form...

maven-to-springmvc

将maven项目转换为Dynamic Web项目,勾选 Dynamic Web Module, 并点击 Further configuration available...

maven-to-springmvc

勾选生成web项目需要的部署描述符文件 web.xml, 然后点击 OK -> OK

maven-to-springmvc

接下来观察我们的项目结构,多了一个WebContent目录

maven-to-springmvc

META-INF
相当于一个信息包,目录中的文件和目录获得Java 2平台的认可与解释,用来配置应用程序、扩展程序、类加载器和服务。
MANIFEST.MF文件,在用jar打包时自动生成。

转为标准的Maven项目结构

虽然此时我们可以发布到tomcat中,但这不符合maven的结构,“约定优于配置”,转为标准的maven项目结构。
我们还要做如下修改:
把上图 WebContent 下面两个目录 META-INF,WEB-INF 直接剪切到 src/main/webapp 目录下,并删掉 WebContent 目录,那么现在的项目结构如下图:

maven-to-springmvc

修改发布规则

需要修改发布规则,右键点击项目,选择 Properties , 选择 Deployment Assembly

maven-to-springmvc

  • 选择 WebContent,把它 Remove
  • 测试类我们也不需要发布, test 的两个目录页可以 Remove

因为是基于Maven项目,需要把Maven依赖库也添加到发布路径,点击 Add , 选择 Java Build Path Entries, Next,选择 Maven DependenciesFinishOK

maven-to-springmvc
maven-to-springmvc

此处列表是,部署项目时,文件发布的路径

maven-to-springmvc

至此一个基于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

maven-to-springmvc

在上面的步骤中,我们在 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>

maven-to-springmvc
项目右键 -> Run as -> Run Configurations..., 在 Goals 中填入 tomcat7:run,单击 Run,项目运行。
maven-to-springmvc
控制台中会输出下面的信息

[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-to-springmvc

自此,基于maven搭建的web项目能正常访问了。
我们再看下项目结构,多了个 target 文件夹,这个是哪来的?

maven-to-springmvc

如图可知,java编译后的字节码文件就存在 target/classes

maven-to-springmvc

下一步,就是集成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>&nbsp;</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-to-springmvc

自此,用Maven搭建SpringMVC项目就讲完了,还有很多细节需要处理,需要不断学习。

完整工程下载链接:https://pan.baidu.com/s/1hrQdCwc 密码:kifh

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值