vlambda博客
学习文章列表

路人的 SpringMVC 系列来了!!!


大家好,我是路人,前段时间把 spring 系列写完之后,就直接写 springboot 系列了,但是发现了一个问题,有不少粉丝问我 springmvc 系列哪里看?这些粉丝中可能有些朋友根本没有接触过 springmvc,然后直接被我带入了 springboot,会突然感觉很懵逼。

目前大多数公司都会使用 Springboot 来开发微服务,为其他端提供接口,而这些功能都是依靠 springmvc 实现的,所以为了大家看我的文章能够顺畅一些,还是决定先把 springmvc 系列补上,不管大家是否学过 springmvc,都希望你们和我一起再过一遍 springmvc,因为每个人对 springmvc 的理解也是不一样的,我会采用大量案例来进行讲解,也会介绍原理及源码,希望对你有所帮助。

1、为什么需要学 springmvc?

工作需要

目前用到 java 的企业,99.99%都会用到 springmvc,即使没有直接使用 springmvc,也会使用 springboot,而 springboot 中基本上都会用到 springmvc

面试需要

企业都在使用 springmvc,所以面试的时候基本都会问到相关的问题。

更好的学习 springboot、springcloud

如果想学好 springboot 和 springcloud,那么必须先掌握 spring、springmvc 这 2 个技术。

2、预备知识

学习 springmvc 之前,需要先掌握 2 个系列的课程:maven 和 spring,还未学的朋友,先去补补。

3、软件版本

  • idea 2020.3.3
  • jdk1.8
  • ≥maven3.6.1
  • spring5.3.6
  • apache-tomcat-9.0.46

4、本文目标

通过 springmvc 实现一个 helloword,将项目发布到 tomcat 中,然后在首页中发起一个请求,请求交给 springmvc 处理,由 springmvc 向客户端输出一个 helloword,通过这个案例让大家熟悉下 springmvc 的使用步骤。

5、Helloword 案例

开发步骤

1、创建一个maven项目
2、在项目中创建一个maven web模块
3、maven中添加springmvc相关依赖
4、web.xml中配置springmvc
5、添加springmvc配置文件
6、写一个HelloWordController
7、将项目部署到tomcat中
8、浏览器中验证效果

下面跟着我一步步来操作。

step1:创建一个 maven 项目

使用 idea 创建父子项目,打开 idea->File->New->Project

路人的 SpringMVC 系列来了!!!

按照下图输入对应的信息

路人的 SpringMVC 系列来了!!!

点击 Finish,项目创建成功,如下图

路人的 SpringMVC 系列来了!!!

按照下图中的说明,将红框的部分删除

路人的 SpringMVC 系列来了!!!

将 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/xsd/maven-4.0.0.xsd">

    <modelVersion>4.0.0modelVersion>

    <groupId>com.javacode2018groupId>
    <artifactId>springmvc-seriesartifactId>
    <version>1.0-SNAPSHOTversion>
    <packaging>pompackaging>

    <properties>
        <maven.compiler.source>8maven.compiler.source>
        <maven.compiler.target>8maven.compiler.target>
    properties>

project>

此时项目结构如下图

路人的 SpringMVC 系列来了!!!

如下图,File->Settings中指定项目 maven 的版本

路人的 SpringMVC 系列来了!!!

step2、项目中创建一个 maven 模块

选中项目->点击鼠标右键->New->Module,创建一个 maven 模块

路人的 SpringMVC 系列来了!!!

如下图,通过 maven 的插件来创建 web 模块,这个地方的 maven 插件需要注意下,不要选错了

路人的 SpringMVC 系列来了!!!

点击上图中的 Next,进入下面页面,输入模块的信息,然后点击 Next

路人的 SpringMVC 系列来了!!!

如下图,继续点击 Finish,完成模块的创建

路人的 SpringMVC 系列来了!!!

项目结构如下图

路人的 SpringMVC 系列来了!!!

chat01-helloword 模块中需要添加几个文件夹,操作如下图:

路人的 SpringMVC 系列来了!!!

路人的 SpringMVC 系列来了!!!

路人的 SpringMVC 系列来了!!!

step3、maven 中添加 springmvc 相关依赖

将下面内容替换到 chat01-helloword/pom.xml 中,主要添加了 springmvc 和 servlet 的依赖配置信息。



<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.0modelVersion>

    <groupId>com.javacode2018groupId>
    <artifactId>chat01-hellowordartifactId>
    <version>1.0-SNAPSHOTversion>
    <packaging>warpackaging>

    <name>chat01-helloword Maven Webappname>
    <url>http://www.itsoku.comurl>

    <properties>
        <project.build.sourceEncoding>UTF-8project.build.sourceEncoding>
    properties>

    <dependencies>
        
        <dependency>
            <groupId>org.springframeworkgroupId>
            <artifactId>spring-webmvcartifactId>
            <version>5.3.6version>
        dependency>

        
        <dependency>
            <groupId>jakarta.servletgroupId>
            <artifactId>jakarta.servlet-apiartifactId>
            <version>5.0.0-M1version>
            <scope>providedscope>
        dependency>
    dependencies>

    <build>
        <finalName>chat01-hellowordfinalName>
    build>
project>

step4、web.xml 中配置 springmvc

web.xml 版本太低了,我们先升级下他的版本

路人的 SpringMVC 系列来了!!!

点击File->Project Structure->Module,进入到下面界面

路人的 SpringMVC 系列来了!!!

点击上图中的-按钮,如下图,然后确定删除

路人的 SpringMVC 系列来了!!!

路人的 SpringMVC 系列来了!!!

然后按照下面操作,添加新版本的 web.xml 文件

路人的 SpringMVC 系列来了!!!

路人的 SpringMVC 系列来了!!!

路人的 SpringMVC 系列来了!!!

路人的 SpringMVC 系列来了!!!

web.xml 版本升级成功

路人的 SpringMVC 系列来了!!!

在 web.xml 中添加 springmvc 的配置,可以直接将下面代码直接替换到 web.xml 中,主要就是配置了 DispatcherServlet 这个 servlet,这个是 springmvc 的核心配置


<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">

    
    <servlet>
        <servlet-name>springmvcservlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServletservlet-class>
        <init-param>
            
            <param-name>contextConfigLocationparam-name>
            <param-value>classpath:springmvc.xmlparam-value>
        init-param>
        
        <load-on-startup>0load-on-startup>
    servlet>
    <servlet-mapping>
        <servlet-name>springmvcservlet-name>
        <url-pattern>*.dourl-pattern>
    servlet-mapping>
web-app>

step5、添加 springmvc 配置文件

chat01-helloword->resource->鼠标右键->New->XXML Configuration File->Spring Config

路人的 SpringMVC 系列来了!!!

输入文件名称:springmvc.xml

路人的 SpringMVC 系列来了!!!

文件添加成功

路人的 SpringMVC 系列来了!!!

替换下这个文件的内容


<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd">


    
    <context:component-scan base-package="com.javacode2018.springmvcseries.chat01"/>

beans>

step6、写一个 HelloWordController

这个类中创建了一个 hello 方法,方法上面添加了一个@RequestMapping 注解,是 Springmvc 中的一个注解,value 属性用来指定一个 url 列表,springmvc 会将这些指定的 url 请求转发给当前方法处理。

我们希望访问/hello.do 的时候,跳转到/WEB-INF/view/hello.jsp 这个页面,这个页面中输出一段内容

package com.javacode2018.springmvcseries.chat01;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;

@Controller
public class HelloController {
    /**
     * @RequestMapping:用来表示url和方法的映射
     * value属性用来指定一个url列表,springmvc会将这些指定的url请求转发给当前方法处理
     * @return
     */

    @RequestMapping("/hello.do")
    public ModelAndView hello() {
        ModelAndView modelAndView = new ModelAndView();
        modelAndView.setViewName("/WEB-INF/view/hello.jsp");
        //稍后将这个信息显示在hello.jsp中,modelAndView.addObject相当于request.setAttribute(name,value)
        modelAndView.addObject("msg","这是第一个springboot程序!");
        return modelAndView;
    }
}

/WEB-INF/view/中添加 hello.jsp 内容如下

路人的 SpringMVC 系列来了!!!

<%@ page contentType="text/html;charset=UTF-8" language="java" %>


    


    

hello SpringMVC




修改 index.jsp 的内容,如下,主要添加一个超链接,当点击这个超链接的时候,请求会发给 springmvc,然后 springmvc 会将请求转发给 HelloController 的 hello 方法,然后通过这个方法最后将 hello.jsp 内容输出

<%@ page contentType="text/html;charset=UTF-8" language="java" %>


    


<div style="text-align: center">
    

hello SpringMVC


    

msg:${msg}





</div style=

step7、将项目部署到 tomcat 中

这里我们将项目部署到 tomcat10 中,过程如下:

路人的 SpringMVC 系列来了!!!

路人的 SpringMVC 系列来了!!!

路人的 SpringMVC 系列来了!!!

路人的 SpringMVC 系列来了!!!

路人的 SpringMVC 系列来了!!!

如下图,启动 tomcat

路人的 SpringMVC 系列来了!!!

step8、验证效果

访问:http://localhost:8080/chat01/

路人的 SpringMVC 系列来了!!!

点击页面中的连接,会跳转到http://localhost:8080/chat01/hello.do,输出

路人的 SpringMVC 系列来了!!!

6、SpringMVC 处理请的过程

6.1、详细的过程

1、tomcat 启动的时候,会初始化 DispatcherServlet,DispatcherServlet 中会创建一个 springmvc 容器,其实就是我们熟悉的 spring 容器(ApplicationContext),只不过这个容器的类型是(WebApplicationContext),此容器会加载 web.xml 中 contextConfigLocation 指定的 springmvc 配置文件

路人的 SpringMVC 系列来了!!!

2、由于 springmvc.xml 中指定了扫描包的规则,而 HelloController 符合这个扫描规则,所以会被注册到 springmvc 容器中

3、当发起*.do 请求的时候,请求会到达 DispatcherServlet 中央处理器,中央处理器会根据请求路径,去 springmvc 容器中找到能够处理这个请求的方法,具体由哪个方法来处理这个请求呢?

这里就是通过@RequestMapping 来匹配的,这个注解可以将请求和方法进行映射,匹配的请求会被@RequestMapping 标注的方法处理,所以在这个步骤中 springmvc 容器会发现 HelloController 这个 bean 的 hello 方法方法可以处理/hello.do 请求

4、DispatcherServlet 中通过反射来调用 helloController 这个 bean 的 hello 方法

5、DispatcherServlet 接收到了 hello 方法的返回值

6、DispatcherServlet 根据 hello 方法的返回值,做跳转操作,相当于

request.getRequestDispatcher("/WEB-INF/view/hello.jsp").forward(request,response);

6.2、简化过程

客户端发送请求 ---> 到达 tomcat ---> tomcat 发现是请求是*.do 的请求 ---> tomcat 将请求转发给中央调度器 DispatcherServlet ---> 中央调度器根据 url 将转发给我们自定义的 controller ---> DispacherServlet 根据 controller 的返回结果做跳转操作 ---> 将结果输出到客户端

7、总结

本文主要通过一个案例详细介绍了 springmvc 开发项目的一个过程,大家把案例敲一遍,有问题,欢迎留言交流。

8、软件及代码位置

链接:https://pan.baidu.com/s/1_Ol-UZkN_6woMBtjcFygvQ
提取码:e66j

代码位于码云上

https://gitee.com/javacode2018/springmvc-series
Java充电社
Java充电社,专注分享Java技术干货,包括多线程、JVM、SpringBoot、SpringCloud、Dubbo、Zookeeper、Redis、架构设计、微服务、消息队列、Git、面试题、程序员攻略、最新动态等。
2篇原创内容
Official Account