admin管理员组

文章数量:1794759

Springboot之SpringMVC常用注解

Springboot之SpringMVC常用注解

1.时间类型格式化

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

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

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

区别详解

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的获取如下

4.@ModelAttribute全局请求域增强
  • 作用于全局,因此不是很灵活,不是所有的控制器都需要这种增强,使用时需要注意
  • 一次请求一个model对象,@ModelAttribute的作用是:每次请求时预先对model进行处理
  • 本质是对一次请求的唯一Model对象进行预处理
  • 作用在本控制器上,不影响其他控制器
作用在方法上预先执行
  • 当前端发送了请求,如果有@ModelAttribute注解的方法,那么会先执行这个方法,后执行访问的控制层的方法
  • 相当于一个全局增强,作用周期是请求域

作用在参数上获取值 方法一:请求域Model对象

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

方法二:返回值绑定

同样的也可以通过{}来进行多值绑定

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

  • 请求域不能获取会话域数据,但会话域可以获取请求域的数据:即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类下就对所有控制器进行异常处理

    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解决跨域问题

    总结

    本文标签: 注解常用SpringBootspringmvc