Springboot之SpringMVC常用注解

1.时间类型格式化

一般类型的转换只讨论时间日期的格式
在Springboot中用

@InitBinder和@DateTimeFormat

  • 这个方法是ssm阶段使用的数据格式绑定,操作较为麻烦,在springboot中一般都是使用@DateTimeFormat

  • 但是@InitBinder可以绑定任何数据,@DateTimeFormat只针对于时间日期数据

Springboot之SpringMVC常用注解_第1张图片

区别详解

2.@ControllerAdvice

三种使用场景详解

3.消息头相关的注解

@RequestHeader

这个注解的功能是对原始HttpServletRequest的简化

  • 1、value值
    对应请求头中的

  • 2、defaultValue 该参数的默认值
    当键值没有传输时将使用这个参数进行赋值,前提是required=false

  • 3、required
    是否必须。默认为 true, 表示请求参数中必须包含对应
    的参数,若不存在,将抛出异常

      /**
       * 了解: 映射请求头信息 用法同 @RequestParam
       */
      @RequestMapping("/testRequestHeader")
      public String testRequestHeader(
              @RequestHeader(value = "Accept-Language") String al) {
          System.out.println("testRequestHeader, Accept-Language: " + al);
          return SUCCESS;
      }
    

@CookieValue

同样的,这个注解也是对原生Servlet处理消息头的简化,让开发者更加关注业务逻辑。例如Cookie中的JSESSIONID的获取如下
Springboot之SpringMVC常用注解_第2张图片

4.@ModelAttribute全局请求域增强

  • 作用于全局,因此不是很灵活,不是所有的控制器都需要这种增强,使用时需要注意
  • 一次请求一个model对象,@ModelAttribute的作用是:每次请求时预先对model进行处理
  • 本质是对一次请求的唯一Model对象进行预处理

作用在方法上预先执行

  • 当前端发送了请求,如果有@ModelAttribute注解的方法,那么会先执行这个方法,后执行访问的控制层的方法
  • 相当于一个全局增强,作用周期是请求域

Springboot之SpringMVC常用注解_第3张图片

作用在参数上获取值

方法一:请求域Model对象

注:Model对象的生命周期是一次请求,而不是一次会话

Springboot之SpringMVC常用注解_第4张图片

方法二:返回值绑定

同样的也可以通过{}来进行多值绑定
Springboot之SpringMVC常用注解_第5张图片

5.Session域增强

  • 也是降低开发者对Servlet的API的使用难度
  • 两个注解的使用范围是:一次会话(会话域),因此不同请求之间用HttpServletRequest不能共享的数据,一个Model对象只能存活在一次请求域;可以通过@SessionAttribute和@SessionAttributes来实现一次会话的共享
  • 本质是对一次会话的唯一HttpSession对象进行操作

请求域和会话域的区别

  1. 例如在JSP中,二者的获取方式不同

  2. 请求域不能获取会话域数据,会话域可以获取请求域的数据:即model中的数据可以通过@SessionAttributes被httpSession获取

@SessionAttributes绑定

  • 因为一次可以绑定多个Model中的数据到HttpSession中,所以 @SessionAttributes是复数
  • 标注在类上,表示该类下的所有控制器的model全部传给httpSession
  • 绑定的value和type如果有多个,顺序一定要对其,即便是有重复类型

@SessionAttribute使用

  • @SessionAttribute(value = "m2") Managers m2 的效果相当于 httpSession.getAttribute("m2") ,也相当于 model.getAttribute("m2")
  • 但是删除操作之间互不影响(不是重点)
  • 标注在形参之前,表示赋值

代码示例

@RestController
@SessionAttributes(types = {String.class , String.class , Managers.class} , value = {"s1","s2","m1"} )
//@SessionAttributes把model中add的数据注入到httpSession中,也可用@SessionAttribute来获取
public class SessionTest {

@GetMapping("/set")
//1.向请求域model中绑定数据,如果类上有@SessionAttributes则同时绑定至会话域中
    public String setSessionAttributes(Model model, HttpSession httpSession){

        //1.1前两个都是String类型的
        model.addAttribute("s1","测试1");
        model.addAttribute("s2","测试2");
        //1.2第三个是Managers类的
        model.addAttribute("m1",new Managers("张三","男",19));
        //1.3第四个是直接存入HttpSession中的
        httpSession.setAttribute("m2", new Managers("李四","男",18));

        return "success";
    }

@GetMapping("/get")
//2.利用@SessionAttribute获取数据
    public String getSessionAttribute(@SessionAttribute(value = "s2") String s2,
                                      @SessionAttribute(value = "m1") Managers m1,
                                      @SessionAttribute(value = "m2") Managers m2,
                                      //验证能否从@SessionAttribute中获取httpSession中的m2 //true
                                      HttpSession httpSession,
                                      //验证model中是否被httpSession赋予了值
                                      Model model){
        //2.1验证@SessionAttribute和@SessionAttributes的搭配使用
        System.out.println(s2);
        System.out.println(m1.getName());

        //2.2验证httpSession和@SessionAttributes是不是同一个对象
        System.out.println(httpSession.getAttribute("m2") == m2);//true

    Object m21 = httpSession.getAttribute("m2");
    Managers m22 = (Managers)m21;
    System.out.println(m22.getName());//李四

        //2.3验证model:结果表明model的生命周期仅为一次请求
    System.out.println(model.getAttribute("m2") == httpSession.getAttribute("m2"));//false



    //2.3如果删除
        httpSession.removeAttribute("m2");
        System.out.println(m2.getName());//依然存在



    return  "succese";

    }
}

6.@ExceptionHandler异常处理

  • 作用在方法上,可以指定参数(异常的类型.class)
  • 作用在@Controller类下就对该控制器进行异常处理
  • 作用在@ControllerAdvice类下就对所有控制器进行异常处理

Springboot之SpringMVC常用注解_第6张图片

7.@RequestBody

  • 有了这个注解,可以接收请求体的所有内容,但是具体是什么格式的数据,需要使用其他组件如fastjson来进行处理

  • RequestBody的作用是将前端传来的json格式的数据转为自己定义好的javabean对象,需要注意的是传入数据的属性名称要和后端javabean中定义的一致

  • 而 RequestParam参数在http请求的QueryString或者FromData上,适合参数个数少,且接口比较固定的情况

返回的数据不是html标签的页面,而是其他某种格式的数据时(如json、xml等)使用

8.@ResponseBody

  • @RequestBody+@Controller = @RestController
  • 可以写在方法上、方法返回值前、类上,效果相同
  • 效果:@ResponseBody的作用其实是将java对象转为json格式的数据
  • 适合于ajax、前后端分离的项目中,一般直接使用@RestController

9.跨域访问@CrossOrigin

  • 当A域名中的前端引入了一个js访问了B域名中的资源,就会产生跨域访问
    但如果访问B域名中src下的img图片,是可以直接拿来用的,不会产生跨域访问
  • 因为跨域问题是浏览器对于ajax请求的一种安全限制:一个页面发起的ajax请求,只能是于当前页同域名的路径,这能有效的阻止跨站攻击。
  • 多年前的项目架构较单一,跨域问题较少

解决跨域问题

  • 访问域名的时候先找系统文件host文件中有没有对应的ip地址信息,如果没有就上互联网找

  • 协议、主机、端口 任何一个不同即为跨域

  • 靠设置5个http的头来解决

springboot解决跨域问题

总结

Springboot之SpringMVC常用注解_第7张图片

Springboot之SpringMVC常用注解_第8张图片

你可能感兴趣的:(spring,boot,java,restful)