美文网首页
Java 面试系列:Spring MVC 核心组件 + 面试题

Java 面试系列:Spring MVC 核心组件 + 面试题

作者: you的日常 | 来源:发表于2021-01-12 17:35 被阅读0次

    Spring MVC 介绍

    Spring MVC(Spring Web MVC)是 Spring Framework 提供的 Web 组件,它的实现基于 MVC 的设计模式:Controller(控制层)、Model(模型层)、View(视图层),提供了前端路由映射、视图解析等功能,让 Java Web 开发变得更加简单,也属于 Java 开发中必须要掌握的热门框架。

    执行流程

    Spring MVC 的执行流程如下:

    1. 客户端发送请求至前端控制器(DispatcherServlet)
    2. 前端控制器根据请求路径,进入对应的处理器
    3. 处理器调用相应的业务方法
    4. 处理器获取到相应的业务数据
    5. 处理器把组装好的数据交还给前端控制器
    6. 前端控制器将获取的 ModelAndView 对象传给视图解析器(ViewResolver)
    7. 前端控制器获取到解析好的页面数据
    8. 前端控制器将解析好的页面返回给客户端

    流程如下图所示:

    1

    核心组件

    Spring MVC 的核心组件如下列表所示:

    1. DispatcherServlet:核心处理器(也叫前端控制器),负责调度其他组件的执行,可降低不同组件之间的耦合性,是整个 Spring MVC 的核心模块。
    2. Handler:处理器,完成具体业务逻辑,相当于 Servlet 或 Action。
    3. HandlerMapping:DispatcherServlet 是通过 HandlerMapping 将请求映射到不同的 Handler。
    4. HandlerInterceptor:处理器拦截器,是一个接口,如果我们需要做一些拦截处理,可以来实现这个接口。
    5. HandlerExecutionChain:处理器执行链,包括两部分内容,即 Handler 和 HandlerInterceptor(系统会有一个默认的 HandlerInterceptor,如果需要额外拦截处理,可以添加拦截器设置)。
    6. HandlerAdapter:处理器适配器,Handler 执行业务方法之前,需要进行一系列的操作包括表单数据的验证、数据类型的转换、将表单数据封装到 POJO 等,这一系列的操作,都是由 HandlerAdapter 来完成,DispatcherServlet 通过 HandlerAdapter 执行不同的 Handler。
    7. ModelAndView:装载了模型数据和视图信息,作为 Handler 的处理结果,返回给 DispatcherServlet。
    8. ViewResolver:视图解析器,DispatcherServlet 通过它将逻辑视图解析成物理视图,最终将渲染结果响应给客户端。

    自动类型转换

    自动类型转换指的是,Spring MVC 可以将表单中的字段,自动映射到实体类的对应属性上,请参考以下示例。

    1. JSP 页面代码

    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <html>
    <body>
    <form action="add">
        名称:<input type="input" name="name"><br>
        年龄:<input type="input" name="age"><br>
        <input type="submit" value=" 提交 ">
    </form>
    </body>
    </html>
    
    

    2. 编写实体类

    public class PersonDTO {
        private String name;
        private int age;
    
        public String getName() {
            return name;
        }
        public void setName(String name) {
            this.name = name;
        }
        public int getAge() {
            return age;
        }
        public void setAge(int age) {
            this.age = age;
        }
    }
    
    

    3. 编写控制器

    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RestController;
    @RestController
    public class PersonController {
        @RequestMapping(value = "/add", produces = "text/plain;charset=utf-8")
        public String add(PersonVO person) {
            return person.getName() + ":" + person.getAge();
        }
    }
    
    

    4. 执行结果

    执行结果如下图所示:

    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>
    </filter>
    <filter-mapping>
        <filter-name>encodingFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
    
    

    第二步,设置 RequestMapping 的 produces 属性,指定返回值类型和编码,如下所示:

    @RequestMapping(value  = "/add", produces = "text/plain;charset=utf-8")
    
    

    拦截器

    在 Spring MVC 中可以通过配置和实现 HandlerInterceptor 接口,来实现自己的拦截器。

    1. 配置全局拦截器

    在 Spring MVC 的配置文件中,添加如下配置:

    <mvc:interceptors>
      <bean class="com.learning.core.MyInteceptor"></bean>
    </mvc:interceptors>
    
    

    2. 添加拦截器实现代码

    拦截器的实现代码如下:

    相关文章

      网友评论

          本文标题:Java 面试系列:Spring MVC 核心组件 + 面试题

          本文链接:https://www.haomeiwen.com/subject/fxvebktx.html