什么是 SpringMVC?

SpringMVC 是一种基于 Java 实现的 MVC 设计模式的请求驱动类型的轻量级 web 框架,使用了 MVC 架构模式的思想,将 web 层进行职责解耦,基于请求驱动指的就是使用请求-响应模型,框架的目的就是帮助我们简化开发

SpringMVC 的前置控制器(DispatchServlet )

Spring 的 web 框架围绕 DispatchServlet 设计,DispatchServlet 的作用是将请求分发到不同的处理器,DispatcherServlet 是一个实际的 Servlet,继承自 HttpServlet 基类

SpringMVC 的运行流程

当用户发起请求时,前置控制器拦截到请求,根据请求参数生成代理请求,找到请求所对应的实际控制器(Controller),控制器处理请求,创建数据模型并与后端进行交互,随后将处理过的数据模型响应给中心控制器,控制器使用数据模型与视图渲染视图结果,结果被返回给中心控制器随后被返回给用户,如下图:

spring boot controller前置处理器 springmvc前置控制器是一个_web

Hello!SpringMVC(使用注解配置 SpringMVC)

首先我们创建一个项目,我这里是使用的 Maven 项目,第一步是导入 jar 包

<!-- 导入依赖 -->
<dependencies>
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.12</version>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-webmvc</artifactId>
        <version>5.1.9.RELEASE</version>
    </dependency>
    <dependency>
        <groupId>javax.servlet</groupId>
        <artifactId>servlet-api</artifactId>
        <version>2.5</version>
    </dependency>
    <dependency>
        <groupId>javax.servlet.jsp</groupId>
        <artifactId>jsp-api</artifactId>
        <version>2.2</version>
    </dependency>
    <dependency>
        <groupId>javax.servlet</groupId>
        <artifactId>jstl</artifactId>
        <version>1.2</version>
    </dependency>
</dependencies>

随后我们要将我们的项目升级为 web 项目,我是使用 idea 进行开发的,操作如下:

添加框架支持

spring boot controller前置处理器 springmvc前置控制器是一个_java_02


升级为 web 项目

spring boot controller前置处理器 springmvc前置控制器是一个_web_03


随后我们要在web.xml中配置 DispatchServlet,先看代码:

<servlet>
    <servlet-name>springmvc_anno</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath:spring_servlet.xml</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
</servlet>

<servlet-mapping>
    <servlet-name>springmvc_anno</servlet-name>
    <url-pattern>/</url-pattern>
</servlet-mapping>

这里我们配置了一个DispatcherServlet类的 Servlet,命名为 springmvc_anno,和以往不同的是,我们这里需要使用<init-param>标签关联一个 Spring 配置文件,因为我们需要 Spring 框架帮我们找到 Contorller

<load-on-startup>标签是设置启动级别,数字越小,启动越早,我们直接设置为1即可,映射路径直接写/

随后我们配置在web.xml中声明的spring_servlet.xml,这是一个 Spring 配置文件,所以我们在src下的resources目录下创建它,因为我们是使用注解配置,毫无疑问要导入context命名空间

我们在spring_servlet.xml中进行四步操作:首先让 IOC 注解生效,即设置注解扫描,第二部过滤掉静态资源,如 HTML、JS、CSS、图片、视频等,第三步启动 MVC 注解驱动,这里会注入DefaultAnnotationHandlerMappingAnnotationMethodHandlerAdapter实例,最后一步是配置视图解析器,用于帮助我们更便捷的设计 Controller 类,spring_servlet.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: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/context
        https://www.springframework.org/schema/context/spring-context.xsd
        http://www.springframework.org/schema/mvc
        https://www.springframework.org/schema/mvc/spring-mvc.xsd">
    <!-- 自动扫描包,让指定包下的注解生效,由IOC容器统一管理 -->
    <context:component-scan base-package="com.lmh.controller"/>
    <!-- 让Spring MVC不处理静态资源 -->
    <mvc:default-servlet-handler />
    <!--
    支持mvc注解驱动
        在spring中一般采用@RequestMapping注解来完成映射关系
        要想使@RequestMapping注解生效
        必须向上下文中注册DefaultAnnotationHandlerMapping
        和一个AnnotationMethodHandlerAdapter实例
        这两个实例分别在类级别和方法级别处理。
        而annotation-driven配置帮助我们自动完成上述两个实例的注入。
     -->
    <mvc:annotation-driven />

    <!-- 视图解析器 -->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"
          id="internalResourceViewResolver">
        <!-- 前缀 -->
        <property name="prefix" value="/WEB-INF/jsp/" />
        <!-- 后缀 -->
        <property name="suffix" value=".jsp" />
    </bean>
</beans>

下一步就是创建我们的 Controller,我们实现的功能就是向前端传一个字符串并显示出来,我们起名为com.lmh.controller.HelloController

因为是用过注解实现,首先我们要用@Controller注解来修饰这个 Controller 类,随后我们只需要在类中创建一个返回值为String类型的方法即可,这个方法的返回值,就是我们视图名称,假如我们的返回值是test,再加上spring_servlet.xml的配置,我们实际上就会访问WEB-INF/jsp/test.jsp

另外,我们需要使用@RequestMapping注解来修饰我们这个函数,@RequestMapping注解用来声明我们的映射路径,即定义什么样的url可以访问到这个 Controller 中的 这个方法,HelloController.java 代码如下:

package com.lmh.controller;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
public class HelloController {
    @RequestMapping("/hello")
    public String hello(Model model) {
        model.addAttribute("msg", "Hello");
        return "hello";
    }
}

这里我们设置返回的是hello.jspModel中为我们包装的数据模型,即返回给前端的信息,随后我们在WEB-INF/jsp/目录下创建hello.jsp并接收返回的数据模型:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
    <body>
        ${msg}
    </body>
</html>

到这里,我们的所有配置就都已经结束,我们只需要配置 Tomcat 启动项目即可,在浏览器地址栏输入我们配置的映射路径localhost:8080/hello,就会出现如下结果

spring boot controller前置处理器 springmvc前置控制器是一个_web_04