爬取页面中...

SpringMVC框架学习


SpringMVC

第 1 章 SpringMVC 简介

1.1 SpringMVC 概述

SpringMVC 是一个 Java 开源框架, 是 Spring Framework 生态中的一个独立模块,它基于 Spring 实现了 Web MVC(数据、业务与展现)设计模式的请求驱动类型的轻量级 Web 框架,为简化日常开发,提供了很大便利。

总结:SpringMVC 是基于 Spring 简化了 Web 层开发,并专注于 Web 层开发的框架。

因此,其 XML 配置文件依然在 Spring 配置文件中。

1.2 Spring MVC 核心组件

1、DispatcherServlet 前置控制器

负责接收请求、分发请求。

2、Handler 处理器

处理器包括了拦截器、控制器中的方法等,主要负责处理请求。

3、HandlerMapping 处理器映射器

解析配置文件、扫描注解,将请求与处理器进行匹配。

3、HandlerAdpter 处理器适配器

根据请求来找到匹配的处理器,这个过程称为适配。

4、ViewResolver 视图解析器

处理器执行后得到的结果可能是一个视图,但这个视图属于逻辑视图(页面中存在逻辑代码,比如循环、判断),需要使用视图解析起进行处理,这个过程称为渲染视图。

SpringMVC 工作原理:

注意:SpringMVC 从本质意义上讲未能脱离 JSP。SpringBoot 才算真正脱离。

第 2 章 SpringMVC 发展演变

2.1 导入依赖

为了演示 SpringMVC 的发展史,必须导入过时的依赖,因为在最新的 Spring5 中,很多过时方法都不支持。

<!--低版本-->
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-context</artifactId>
    <version>4.3.9.RELEASE</version>
</dependency>
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-webmvc</artifactId>
    <version>4.3.9.RELEASE</version>
</dependency>
<dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>javax.servlet-api</artifactId>
    <version>4.0.1</version>
    <scope>provided</scope>
</dependency>

<!--最新Spring版本-->
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-webmvc</artifactId>
    <version>5.3.11</version>
</dependency>

2.2 控制器映射 URL 请求

2.2.1 web.xml 配置

1、替换 web.xml 内容

由于 Maven 自动生成的 web.xml 是过时的,可能会出现错误,因此首先需要利用 Tomcat 安装路径中 conf\web.xml 中的内容进行替换。如下:

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

</web-app>

2、配置核心 Servlet

<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>
        <!--配置Spring核心DispatcherServlet-->
        <servlet-name>DispatcherServlet</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>

        <!--初始化参数,读取SpringIOC核心XML配置文件-->
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <!--读取文件-->
            <param-value>classpath:spring-mvc.xml</param-value>
        </init-param>

        <!--前置控制器要接收所有的请求,因此在容器启动的时候就应该完成初始化-->
        <load-on-startup>1</load-on-startup>
    </servlet>
    <!--编写映射-->
    <servlet-mapping>
        <servlet-name>DispatcherServlet</servlet-name>
        <!--请求访问拦截路径-->
        <url-pattern>/</url-pattern>
    </servlet-mapping>

</web-app>

2.2.2 Bean id 或 name 值配置

表示传入的请求需要根据 Bean 的 id 或 name 进行匹配。

类名解析器:BeanNameUrlHandlerMapping 解析器,该解析器作用就是将控制器名作为匹配 URL 请求的依据,与控制器关联起来。

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

    <!--配置视图解析器-->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <!--即处理控制器返回的字符串为一个页面路径,例如:/ + user + .jsp:user就是传的字符串-->
        <!--配置视图前缀-->
        <property name="prefix" value="/"/>
        <!--配置视图后缀-->
        <property name="suffix" value=".jsp"/>
    </bean>

    <!--处理器映射:使用Bean配置的id或name值,进行匹配请求地址-->
    <bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/>
</beans>

2.2.3 控制器编写及配置

单操作控制器:控制器需要继承 AbstractController 类,并重写 handleRequestInternal 方法,只能一个一个执行。

package com.luochen.controller;

import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.AbstractController;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * @Author 洛尘大大
 * @projectName SpringMVC
 * @title UerController
 * @Date 2021/10/22 15:12
 * @Description User控制器
 */
public class UserController extends AbstractController {

    @Override
    public ModelAndView handleRequestInternal(HttpServletRequest req, HttpServletResponse resp){
        return new ModelAndView("user");
    }
}
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

    <!--配置视图解析器-->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <!--即处理控制器返回的字符串为一个页面路径,例如:/ + user + .jsp:user就是传的字符串-->
        <!--配置视图前缀-->
        <property name="prefix" value="/"/>
        <!--配置视图后缀-->
        <property name="suffix" value=".jsp"/>
    </bean>

    <!--处理器映射:使用Bean配置的id或name值,进行匹配请求地址-->
    <bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/>

    <!--配置控制器映射路径,该id就是请求匹配的路径-->
    <bean name="/view" class="com.luochen.controller.UserController"/>
</beans>

2.3.4 总结

1、该种匹配请求的方式类似于一个 Servlet,即一个类处理一个请求。

2、利用 Bean 配置时的 id 值或 name 值,当作请求匹配的参数,从而映射到控制器类。

3、需要在配置文件中,配置 BeanNameUrlHandlerMapping。

注意:这里跟普通的 Servlet 没差别,当处理很多请求时,就需要编写不同的类来处理不同的请求,处理效率低下。

2.3 方法名映射 URL 请求

2.3.1 方法名解析器

Spring 提供了控制器内的方法名的解析起 InternalPathMethodNameResolver,该解析器作用就是将方法名作为匹配 URL 请求的依据,与控制器关联起来。

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

    <!--配置视图解析器-->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/"/>
        <property name="suffix" value=".jsp"/>
    </bean>

    <!--配置方法名解析器,已过时-->
    <bean id="internalPathMethodNameResolver" class="org.springframework.web.servlet.mvc.multiaction.InternalPathMethodNameResolver"/>

    <!--请求匹配方法一-->
    <bean id="/login" class="com.luochen.controller.UserMultiActionController">
        <!--方法名称决定-->
        <property name="methodNameResolver" ref="internalPathMethodNameResolver"/>
    </bean>

    <!--请求匹配方法二-->
    <bean id="/register" class="com.luochen.controller.UserMultiActionController">
        <property name="methodNameResolver" ref="internalPathMethodNameResolver"/>
    </bean>
</beans>

2.3.2 多操作控制器

Spring 提供了 MultiActionController 控制器类(过时),供其他控制器类继承,在其子类中,开发者可以编写多个处理请求的方法,然后使用方法名解析器去匹配请求。

package com.luochen.controller;

import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.multiaction.MultiActionController;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * @Author 洛尘大大
 * @projectName SpringMVC
 * @title UserController
 * @Date 2021/10/22 16:43
 * @Description UserMultiAction控制器
 */
public class UserMultiActionController extends MultiActionController {

    public ModelAndView login(HttpServletRequest req, HttpServletResponse resp){
        System.out.println("登录");
        return new ModelAndView("login");
    }

    public ModelAndView register(HttpServletRequest req, HttpServletResponse resp){
        return new ModelAndView("register");
    }
}

2.3.3 总结

1、该种匹配请求较控制器匹配请求有优势。

2、设置 Bean 的 id 或 name,匹配方法名称,再匹配请求,此时请求名与方法名一致。

3、需要配置 InternalPathMethodNameResolver 解析器。

2.4 简单 URL 处理器映射

使用 SimpleUrlHandlerMapping 只需要修改 spring-mvc.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"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

    <!--配置视图解析器-->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/"/>
        <property name="suffix" value=".jsp"/>
    </bean>

    <!--配置简单映射-->
    <bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
        <!--properties配置文件映射-->
        <property name="mappings">
            <props>
                <!--映射类单个方法,不需要按照方法名映射-->
                <prop key="/view">userController</prop>

                <!--映射类多个方法,按照方法名映射-->
                <prop key="/user/*">userMultiActionController</prop>
            </props>
        </property>
    </bean>

    <!--配置Controller层实例-->
    <bean id="userController" class="com.luochen.controller.UserController"/>
    <bean id="userMultiActionController" class="com.luochen.controller.UserMultiActionController"/>
</beans>

总结:

1、该映射方式较前两种优化很多。

2、依据类中的方法名进行映射,可以进行单映射和多映射。

3、需要配置 SimpleUrlHandlerMapping 解析器。

此时,项目配置依然繁多,需要继续优化。

第 3 章 SpringMVC 注解开发

3.1 新旧版本注解开发

新旧版本注解开发,主要是配置不一样,旧版本配置已经过时。

3.1.1 旧版本注解开发

Spring 提供了 DefaultAnnotationHandlerMapping 和 AnnotationMethodHandlerAdapter 映射器,支持使用注解来匹配请求,这样就解决了请求匹配导致配置信息繁多的问题,同时还提升了开发效率。

package com.luochen.controller;

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

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * @Author 洛尘大大
 * @projectName SpringMVC
 * @title UserController
 * @Date 2021/10/22 16:43
 * @Description UserMultiAction控制器
 */
@Controller // 标记Controller层
public class UserController {

    /**
     * get方法请求
     *
     * @param req  HttpServletRequest对象
     * @param resp HttpServletResponse对象
     * @return
     */
    @RequestMapping(value = "/login", method = RequestMethod.GET) // 标记方法映射路径
    public ModelAndView login(HttpServletRequest req, HttpServletResponse resp) {
        System.out.println("登录");
        return new ModelAndView("login");
    }

    /**
     * post方法请求
     *
     * @param req  HttpServletRequest对象
     * @param resp HttpServletResponse对象
     * @return
     */
    @RequestMapping(value = "/register", method = RequestMethod.POST) // 标记方法映射路径
    public ModelAndView register(HttpServletRequest req, HttpServletResponse resp) {
        return new ModelAndView("register");
    }
}
<?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"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">

    <!--配置视图解析器-->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/"/>
        <property name="suffix" value=".jsp"/>
    </bean>

    <!--配置类注解处理器-->
    <bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping"/>
    <!--配置方法注解处理器-->
    <bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter"/>
    <!--配置注解扫描包-->
    <context:component-scan base-package="com.luochen.controller"/>
</beans>

3.1.2 新版本注解开发

<?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 http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd">

    <!--配置视图解析器-->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/"/>
        <property name="suffix" value=".jsp"/>
    </bean>

    <!--新版本开启注解-->
    <mvc:annotation-driven/>
    <!--扫描包-->
    <context:component-scan base-package="com.luochen.controller"/>
</beans>

3.2 Spring MVC 常用注解

3.2.1 @Controller

该注解是一个控制器的标识,只用于标记类。

@Controller
public class UserController{}

3.2.2 @RequestMapping

该注解用于映射请求,可用于类和方法。

@RequestMapping(value=”请求路径”, method=RequestMethod.请求方式)。

@Controller
@RequestMapping("/user")
public class UserController{

    @RequestMapping(value="/login", method=RequestMethod.POST)
    public int login(){
        return 1;
    }
}

3.2.3 @RequestBody

该注解只能应用在方法的参数上,只能用于从请求体中获取 JSON 数据并注入至参数中,此种请求方式最好用 POST。

@Controller
@RequestMapping("/user")
public class UserController{

    @RequestMapping(value="/login", method=RequestMethod.POST)
    public int login(@RequestBody User user){
        return 1;
    }
}

3.2.4 @ResponseBody

该注解只能作用在方法上,用于将向页面传递的数据转化成 JSON 数据。

@Controller
@RequestMapping("/user")
public class UserController{

    @RequestMapping(value="/login", method=RequestMethod.POST)
    @ResponseBody
    public int login(@RequestBody User user){
        return 1;
    }
}

3.2.5 @RequestParam

该注解只能应用在方法的参数上,接收的是 key-value 里面的参数,用于将接收到的数据注入至参数中。

@Controller
@RequestMapping("/user")
public class UserController{

    @RequestMapping(value="/search", method=RequestMethod.GET)
    @ResponseBody
    public List<User> searchUsers(@RequestParam(value="name") String name){
        return new ArrayList<>();
    }
}

3.2.6 @PathVariable

该注解只能应用在方法的参数上,用于从请求路径中获取数据并注入至参数中。

@Controller
public class UserController {

    // {}请求路径占位符
    @RequestMapping(value = "/login/{username}", method = RequestMethod.GET)
    public ModelAndView login(@PathVariable("username") String name) {
        System.out.println("登录:" + name);
        return new ModelAndView("login");
    }
}

3.2.7 @SessionAttributes

该注解只能使用在类定义上,用于将数据放入 Session 中,主要影响 Model 和 ModelAndView 层。

@SessionAttributes(types=User.class) // 会将model中所有类型为User的属性添加到会话中。
@SessionAttributes(value={“user1”, “user2”}) // 会将model中属性名为user1和user2的属性添加到会话中。
@SessionAttributes(types={User.class, Dept.class}) // 会将model中所有类型为 User和Dept的属性添加到会话中。
@SessionAttributes(value={“user1”,“user2”},types={Dept.class}) // 会将model中属性名为user1和user2以及类型为Dept的属性添加到会话中。

3.2.8 @RequestHeader

该注解只能应用在方法的参数上,用于从请求头中获取数据。

@RequestMapping("/find")  
// 从请求头中获取Content-Type的值
public void findUsers(@RequestHeader("Content-Type") String contentType) {}  

3.2.9 @CookieValue

该注解只能应用在方法的参数上,用于从请求中获取 cookie 的值。

@RequestMapping("/find")  
// 从请cookie中获取jsessionId的值
public void findUsers(@CookieValue("JSESSIONID") String jsessionId) {}  

第 4 章 JSR-303

4.1 JSR-303 简介

JSR 全称为 Java Specification Requests,表示 Java 规范提案。JSR-303 是 Java 为 Java Bean 数据合法性校验提供的标准框架,它定义了一套可标注在成员变量,属性方法上的校验注解。Hibernate Validation提供了这套标准的实现。

导入依赖:

<dependency>
    <groupId>org.hibernate</groupId>
    <artifactId>hibernate-validator</artifactId>
    <version>6.0.1.Final</version>
    <!-- 最新7.0.1.Final -->
</dependency>

4.2 校验注解

以下只罗列一部分:

注解 解释 注解 解释
@Null 验证对象是否为null @NotNull 验证对象是否不为null,无法查检长度为0的字符串
@AssertTrue 必须为true @AssertFalse 必须为false
@Min 必须为数字,其值大于或等于指定的最小值 @Max 必须为数字,其值小于或等于指定的最大值
@DecimalMin 必须为数字,其值大于或等于指定的最小值 @DecimalMax 必须为数字,其值小于或等于指定的最大值
@Size 集合的长度 @Digits 必须为数字,其值必须再可接受的范围内
@Past 必须是过去的日期 @Future 必须是将来的日期
@Pattern 必须符合正则表达式 @Email 必须是邮箱格式
@Length(min=,max=) 字符串的大小必须在指定的范围内 @NotEmpty 不能为null,长度大于0
@Range(min=,max=,message=) 元素必须在合适的范围内 @NotBlank 不能为null,字符串长度大于0(限字符串)

4.3 应用

在应用中,这里需要将错误信息,以 JSON 格式返回到前端页面,因此需要设置消息转换器。

1、导入依赖

<dependency>
    <groupId>org.hibernate</groupId>
    <artifactId>hibernate-validator</artifactId>
    <version>6.0.1.Final</version>
    <!-- 最新7.0.1.Final -->
</dependency>
<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <version>1.18.20</version>
</dependency>
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>fastjson</artifactId>
    <version>1.2.47</version>
</dependency>

2、编写 Controller 控制器

package com.luochen.controller;

import com.luochen.pojo.User;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.validation.Valid;

/**
 * @Author 洛尘大大
 * @projectName SpringMVC
 * @title UserController
 * @Date 2021/10/22 16:43
 * @Description UserMultiAction控制器
 */
@Controller
public class UserController {

    @RequestMapping("/addUser")
    @ResponseBody
    public Object addUser(@Valid User user, BindingResult result){
        // 如果有问题
        if (result.hasErrors()){
            // 返回错误数据
            return result.getAllErrors();
        }
        return 1;
    }
}

3、编写实体类

package com.luochen.pojo;

import lombok.Data;
import org.hibernate.validator.constraints.Length;

import javax.validation.constraints.Max;
import javax.validation.constraints.Min;
import javax.validation.constraints.Null;

/**
 * @Author 洛尘大大
 * @projectName SpringMVC
 * @title User
 * @Date 2021/10/22 19:42
 * @Description User类
 */
@Data
public class User {
    @Null(message = "姓名不能为空")
    private String name;

    @Max(value = 200,message = "年龄不能大于200")
    @Min(value = 0,message = "年龄不能小于0")
    private int age;

    @Length(min = 3, max = 6,message = "密码长度必须在3-6之间")
    private String password;
}

4、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 http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd">

    <!--配置视图解析器-->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/"/>
        <property name="suffix" value=".jsp"/>
    </bean>

    <!--新版本开启注解-->
    <mvc:annotation-driven>
        <mvc:message-converters>
            <!--处理字符串的消息转换器-->
            <bean class="org.springframework.http.converter.StringHttpMessageConverter"/>
            <!--处理JSON格式的消息处理器-->
            <bean class="com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter">
                <property name="supportedMediaTypes">
                    <list>
                        <!--将消息处理成HTML格式-->
                        <value>text/html;charset=UTF-8</value>
                        <value>application/json;charset=UTF-8</value>
                    </list>
                </property>
            </bean>
        </mvc:message-converters>
    </mvc:annotation-driven>

    <!--扫描包-->
    <context:component-scan base-package="com.luochen.controller"/>
</beans>

第 5 章 RESTFUL

5.1 RESTFUL 简介

REST 全称为 Representational State Transfer,表示表述性状态转移。

RESTFUL 有如下特点:

  • 每一个 URI 代表一种资源;
  • 客户端使用 GET、POST、PUT、DELETE 4 个表示操作方式的动词对服务端资源进行操作:GET 用来获取资源,POST 用来新建资源(也可以用于更新资源),PUT 用来更新资源,DELETE 用来删除资源。

即后端根据前端的请求方式,调用相应的响应方式并进行操作。

5.2 Spring 对 RESTFUL 的支持

5.2.1 常用分类

1、@RestController

该注解只能应用于类上,相当于 @Controller 和 @ResponseBody 注解的组合。表示该类中的所有方法执行完成后所返回的结果直接向页面输出。

2、@GetMapping

获取 GET 请求。

3、@PostMapping

获取 POST 请求。

4、@PutMapping

获取 PUT 请求。

5、@DeleteMapping

获取 DELETE 请求。

5.2.2 应用

1、编写控制类:

package com.luochen.controller;

import com.luochen.pojo.User;
import org.springframework.web.bind.annotation.*;

/**
 * @Author 洛尘大大
 * @projectName SpringMVC
 * @title UserDemoController
 * @Date 2021/10/22 20:40
 * @Description UserDemo控制层
 */
@RestController("/userDemo")
public class UserDemoController {

    @GetMapping()
    public Object get() {
        System.out.println("get请求");
        return new User();
    }

    @PostMapping()
    public Object post() {
        System.out.println("post请求");
        return new User();
    }

    @PutMapping()
    public Object put() {
        System.out.println("put请求");
        return new User();
    }

    @DeleteMapping()
    public Object delete() {
        System.out.println("delete请求");
        return new User();
    }
}

2、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 http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd">

    <!--配置视图解析器-->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/"/>
        <property name="suffix" value=".jsp"/>
    </bean>

    <!--新版本开启注解-->
    <mvc:annotation-driven>
        <mvc:message-converters>
            <!--处理字符串的消息转换器-->
            <bean class="org.springframework.http.converter.StringHttpMessageConverter"/>

            <!--处理JSON格式的消息处理器-->
            <bean class="com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter">
                <property name="supportedMediaTypes">
                    <list>
                        <!--将消息处理成HTML格式-->
                        <value>text/html;charset=UTF-8</value>
                        <value>application/json;charset=UTF-8</value>
                    </list>
                </property>
            </bean>
        </mvc:message-converters>
    </mvc:annotation-driven>

    <!--扫描包-->
    <context:component-scan base-package="com.luochen.controller"/>
</beans>

第 6 章 其它处理

6.1 静态资源处理

6.1.1 静态资源无法访问的原因

静态资源包含 html、js、css、图片、字体文件等。静态文件没有 url-pattern,所以默认是访问不到的。之所以可以访问,是因为 Tomcat 中有一个全局的 Servlet:org.apache.catalina.servlets.DefaultServlet,它的 url-pattern 是 “/“, 所以项目中不能匹配的静态资源请求,都由这个Servlet 来处理。但在 SpringMVC 中 DispatcherServlet 也采用了”/“ 作为 url-pattern, 那么项目中不会再使用全局的 Serlvet,这样就造成了静态资源不能完成访问。

6.1.2 解决方案

1、方案一

DispathcerServlet 对应的 url-pattern 修改为 “/“ 以外的其他匹配样式即可。比如 *.do, *.action。这样修改后,发送请求时,请求URL必须匹配 .do 或者 .action。

2、方案二

在 web.xml 中配置如下代码,并将静态资源文件保存到 static 文件夹中。

<servlet-mapping>
    <servlet-name>default</servlet-name>
    <url-pattern>/static/*</url-pattern>
</servlet-mapping>

3、方案三

在 Spring 核心配置文件中配置如下两种代码之一:

<!--
    这个handler就是处理静态资源的,它的处理方式就是将请求转会到tomcat中名为default的Servlet
-->
<mvc:default-servlet-handler/>

注意:以上方案可能请求速度比较慢。

<!-- mapping是访问路径,location是静态资源存放的路径 -->
<mvc:resources mapping="/static/**" location="/static/"/>

6.2 中文乱码处理

在 web.xml 中配置:

<filter>
    <filter-name>encodingFilter</filter-name>
    <!--字符编码过滤器-->
    <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
    <init-param>
        <!--编码格式-->
        <param-name>encoding</param-name>
        <param-value>UTF-8</param-value>
    </init-param>
    <init-param>
        <!--强制编码-->
        <param-name>forceEncoding</param-name>
        <param-value>true</param-value>
    </init-param>
</filter>
<filter-mapping>
    <filter-name>encodingFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

  目录