浅谈SpringMVC | 青训营笔记

73 阅读7分钟

这是我参与「第四届青训营 」笔记创作活动的第 9 天。

今天在复习后端框架知识时,突然对SpringMVC有些知识点遗忘,趁着复习,也整理一下自己的笔记。下面开始正文内容


SpringMVC全貌

img

Spring MVC属于SpringFrameWork的后续产品,已经融合在Spring Web Flow里面。SpringMVC是一种web层mvc框架,用于替代servlet(处理|响应请求,获取表单参数,表单校验等。

SpringMVC是一个MVC的开源框架,SpringMVC=struts2+spring

img

五大核心组件

  1. DispatcherServlet

    1. 作用:负责分发所有的请求
    2. 定位:请求入口
  2. HandlerMapper 请求派发,负责请求和控制器建立一一对应的关系

  3. Controller 处理器,处理DispatcherServlet分发的请求

  4. ModelAndView 封装模型信息和视图信息,可以存储模型数据,也可以储存模板路径

  5. ViewResolver 视图处理器,定位页面

MVC三层架构介绍

  1. VIEW视图层

    1. 接口

      1. VIEW是视图的顶层接口

        img

  2. Controller控制层

    1. 拦截器

      1. 功能:DispatcherServlet派发请求到具体Controller之前首先要执行拦截器中一些相关方法,进行相应预处理(例如权限检测,参数验证),决定放行还是拦截

      2. 实现方法

        1. 实现HandlerInterceptor接口
        2. 或者继承HandlerInterceptorAdaptor
      3. 具有的三个方法

        1. preHandle()

          1. 注意点:

            1. 是在请求到达Controller之前执行的,其实就是拦截器用于拦截请求的,三个参数,分别是request,response,handelr就是这个请求要去找的后端处理器Controller.

            2. 方法的返回值是bloolean类型

              1. 如果返回为false,就说明请求在此终结,不能执行后面的代码了.
              2. 如果返回值为true,那么这个拦截器就要放行,将请求交给后端处理器Controller.
        2. postHandle()

          1. 注意点

            1. 这个方法,是在后端控制器controller处理完请求之后,就执行
            2. 方法有一个参数,ModelAndView,后端控制器controller处理请求可能需要返回页面和数据,所以会多一个ModelAndView,
            3. 但是这个方法,是在渲染页面之前执行的,渲染热面是交个前端控制器来完成的.
        3. afterCompletion() 拦截器最后执行的方法

    2. 注意点

      1. 可以直接使用Request、Response对象处理请求与响应
  3. Model模型

    1. 注意点
    2. 自动实例化:可以被自动实例化,而ModelAndView需要主动实例化

数据模型

以下三个都可以作为数据模型对象,Spring MVC会自动实例化这些类型。

  1. Model

    1. 注意点

      1. 可以自动实例化
  2. ModelMap

  3. ModelAndView

    1. 注意点

      1. 手动实例化:需要主动实例化
      2. 储存对象:可以存储模型数据和模板路径

注意点

  1. ModelAttribute是注解,用于定义控制器方法执行之前,对数据模型的操作。

获取参数的方式

主要分为 get方法post方法

get请求方式参数是在url后

post请求方式的参数是在request body中。

因此两者获取参数的方式也大不一样。

GET方法

  1. 直接在方法体中指定参数

    @GetMapping("/get") 
        public User getUserById(Integer id) {
            if (id.intValue() == 0) {
                return null;
            }
            return list.get(id);
        }
    访问 :http://ip:port/xx/get?id=1
    
  2. 使用requestParam

    @GetMapping("/get")
        public User getUserById(@RequestParam(name = "id", required = true) Integer id) {
            if (id.intValue() == 0) {
                return null;
            }
            return list.get(id);
        }
    访问 :http://ip:port/xx/get?id=1
    

    其中RequestParam中name表示url中请求的字段名,当required为true时,表示该参数必填;defaultValue表示当该参数没有传递数据时给出的默认值,如defaultvalue=”0”

  3. 使用PathVariable

    @GetMapping("/get/{id}")
        public User getUserByPathValue(@PathVariable(name = "id", required = true) Integer id) {
            return list.get(id);
        }
    http:///ip:port/xx/get/1
    
  4. 使用HttpServletRequest

    @GetMapping("/get")
        public User getUserById(HttpServletRequest request) {
            Integer id = Integer.parseInt(request.getParameter("id"));
            if (id.intValue() == 0) {
                return null;
            }
            return list.get(id);
        }
    访问 http://ip:port/xx/get?id=1
    

POST方法

一般而言,post形式的参数被放在请求体中以application/json的形式被后端获取

注解

  1. @Controller

    1. 作用:把这个类作为一个控制器加载到Spring的Bean工厂,如果不加,就是一个普通的类
  2. @RequestMapping(RequestMapper标签,处理请求的处理器)

    1. 作用:

      1. 声明类或方法的访问路径,还可以声明请求的方式
      2. 是一个用来处理请求地址映射的注解,可用于类或方法上。用于类上,表示类中的所有响应请求的方法都是以该地址作为父路径。
    2. 属性

      1. value,method

        1. value: 指定请求的实际地址,指定的地址可以是URI Template 模式;

        2. method: 指定请求的method类型, GET、POST、PUT、DELETE等;

        3. 注意点

          1. method值

            1. 如果没有设置method值,则get和post方法默认都可以访问。
            2. 如果设置了method值,则只能是响应的方式可以请求
      2. consunmes,produces

        1. consumes: 指定处理请求的提交内容类型(Content-Type),例如application/json, text/html;
        2. produces: 指定返回的内容类型,仅当request请求头中的(Accept)类型中包含该指定类型才返回;
      3. params,headers

        1. params: 指定request中必须包含某些参数值是,才让该方法处理。
        2. headers: 指定request中必须包含某些指定的header值,才能让该方法处理请求。
    3. 其他

      1. Spring 4.3版本新增了几个注解,这些注解可以看成是@RequestMapping注解的快捷方式,相当于固定了method配置项的值

        1. @GetMapper
        2. @PostMapper
        3. @PatchMapper
        4. @PutMapper
        5. @DeleteMapper
  3. @RequestParam

    1. 作用:

      1. 将请求路径中的参数,绑定到控制器的方法的参数进行映射。
    2. 参数:

      @RequestParam(value=“参数名”,required=”true/false”,defaultValue=””)
       
      1.value:参数名
      2.required:是否包含该参数,默认为true,表示该请求路径中必须包含该参数,如果不包含就报错。
      3.defaultValue:默认参数值,如果设置了该值,required=true将失效,自动为false,如果没有传该参数,就使用默认值
      
  4. @PathVariable

    1. 作用:

      1. 将请求对象中的参数,绑定到控制器的方法的参数,用于从URL中提取参数
    2. 注意点:

      1. 提取参数时与@RequestParam

        1. 请求URL是localhost:8080/test/?id = 6,使用@RequestParam

          @PostMapping("/test")
          public CommonResult publishCourse(@RequestParam String id) {
          }
          
        2. 请求URL是localhost:8080/test/6,使用@PathVariable

          @PostMapping("/test/{id}")
          public CommonResult publishCourse(@PathVariable String id) {
          }
          
  5. @ResponseBody

    1. 作用:

      1. 向浏览器响应字符串,一般用于异步请求方式
      2. 将java对象转为json格式的数据。(方法返回的东西会通过IO流的方式写入到浏览器。)
      3. controller的方法返回的对象通过适当的转换器转换为指定的格式之后,写入到response对象的body区,通常用来返回JSON数据或者是XML数据。
  6. @Transectional

    1. 作用:

      1. 声明式事务管理

      2. 实质是使用了 JDBC 的事务来进行事务控制的

      3. 基于 Spring 的动态代理的机制

      4. 事务的隔离级别

        1. 是指若干个并发的事务之间的隔离程度
      5. 事物的传播行为

        1. 如果在开始当前事务之前,一个事务上下文已经存在,此时有若干选项可以指定一个事务性方法的执行行为
    2. 添加位置

      1. 类和接口实现方法:接口实现类或接口实现方法上,而不是在接口类上
      2. 访问权限:public的方法才起作用(由于Spring的AOP本质决定) img
  7. @ComponentScan

    1. 作用:用于定义Bean的扫描策略和范围

    2. 注意点

      1. 默认值:对当前包和其子包的Bean进行扫描
      2. 载入规则:,在此范围内带有特定注解的Bean才会被载入容器。

\