路人的 SpringMVC 系列来了!!!

2021-06-25 20:22:08 浏览数 (1)

大家好,我是路人,前段时间把 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,还未学的朋友,先去补补。

  • 路人甲 Java - maven 系列
  • 路人甲 Java - 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 案例

开发步骤

代码语言:javascript复制
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

按照下图输入对应的信息

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

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

将 pom.xml 文件内容替换为下面的内容

代码语言:javascript复制

<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>

此时项目结构如下图

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

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

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

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

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

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

项目结构如下图

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

step3、maven 中添加 springmvc 相关依赖

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

代码语言:javascript复制


<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 版本太低了,我们先升级下他的版本

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

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

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

web.xml 版本升级成功

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

代码语言:javascript复制

<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.xml

文件添加成功

替换下这个文件的内容

代码语言:javascript复制

<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 这个页面,这个页面中输出一段内容

代码语言:javascript复制
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 内容如下

代码语言:javascript复制
<%@ page contentType="text/html;charset=UTF-8" language="java" %>


    


    hello SpringMVC



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

代码语言:javascript复制
<%@ page contentType="text/html;charset=UTF-8" language="java" %>


    


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

    msg:${msg}




</div style=

step7、将项目部署到 tomcat 中

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

如下图,启动 tomcat

step8、验证效果

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

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

6、SpringMVC 处理请的过程

6.1、详细的过程

1、tomcat 启动的时候,会初始化 DispatcherServlet,DispatcherServlet 中会创建一个 springmvc 容器,其实就是我们熟悉的 spring 容器(ApplicationContext),只不过这个容器的类型是(WebApplicationContext),此容器会加载 web.xml 中 contextConfigLocation 指定的 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 方法的返回值,做跳转操作,相当于

代码语言:javascript复制
request.getRequestDispatcher("/WEB-INF/view/hello.jsp").forward(request,response);

6.2、简化过程

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

7、总结

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

8、软件及代码位置

软件地址:

代码语言:javascript复制
链接:https://pan.baidu.com/s/1_Ol-UZkN_6woMBtjcFygvQ
提取码:e66j

代码位于码云上

代码语言:javascript复制
https://gitee.com/javacode2018/springmvc-series

0 人点赞