当前位置:首页 > 科技  > 软件

在SpringBoot项目中这几个注解你们还用吗?

来源: 责编: 时间:2024-07-03 17:14:35 180观看
导读环境:SpringBoot3.3.01. 简介在SpringBoot应用开发中,传统的请求属性处理方式如@ModelAttribute,@SessionAttribute,@RequestAttribute以及RedirectAttributes似乎用的越来越少了,但是在一些特定场景下它们发挥着不可或缺

环境:SpringBoot3.3.0ZCw28资讯网——每日最新资讯28at.com

1. 简介

在SpringBoot应用开发中,传统的请求属性处理方式如@ModelAttribute,@SessionAttribute,@RequestAttribute以及RedirectAttributes似乎用的越来越少了,但是在一些特定场景下它们发挥着不可或缺的作用尤其是当涉及到表单提交、会话状态管理和重定向属性传递时。ZCw28资讯网——每日最新资讯28at.com

  • @ModelAttribute:主要用于绑定请求中的数据到方法参数或模型属性上,常用于处理表单提交,使得复杂的对象绑定变得简单直接。它允许你预处理传入的数据,或者初始化一个命令对象供表单使用。
  • @SessionAttribute:用于从HttpSession中存取属性,这对于存储非敏感的用户信息或临时数据非常有用,比如用户设置或购物车信息。
  • @RequestAttribute:处理单一请求上下文,允许你在控制器间通过HttpServletRequest传递自定义属性,适合传递那些不需要跨请求持久化的数据。
  • RedirectAttributes:是在执行重定向操作时用来传递闪存属性的利器,这些属性在重定向后的一次请求中可用,之后自动移除,非常适合于向用户展示操作成功或失败的消息,同时保持URL的干净。

接下来将详细接上上面几个注解及类的使用。ZCw28资讯网——每日最新资讯28at.com

2. 实战案例

2.1 @ModelAttribute

该注解可用于方法参数及方法上;ZCw28资讯网——每日最新资讯28at.com

用于方法参数

@GetMapping("/product/{cateId}/{id}")public ProductDTO test(@ModelAttribute ProductDTO dto) {  return dto ;}

图片图片ZCw28资讯网——每日最新资讯28at.com

首先,SpringMVC会自动将请求URI中的占位符数据绑定到当前ProductDTO对象上,这个绑定与@ModelAttribute注解没有关系。而这里注解的作用是将当前ProductDTO对象绑定到模型数据中,接下来如果你使用的thymeleaf则可以直接在页面中访问,如下示例:ZCw28资讯网——每日最新资讯28at.com

@GetMapping("/product/{cateId}/{id}")public String test(@ModelAttribute ProductDTO dto) {  return "modelattribute" ;}

在页面中直接访问ProductDTO;ZCw28资讯网——每日最新资讯28at.com

<div th:if="${productDTO}">  <ul>    <li>cateId: <a th:text="${productDTO.cateId}"></a></li>    <li>id: <a th:text="${productDTO.id}"></a></li>  </ul></div>

页面显示

图片图片ZCw28资讯网——每日最新资讯28at.com

在上面你看到了,默认访问的key是当前类型的首字母改为小写,我们可以通过配置属性修改默认keyZCw28资讯网——每日最新资讯28at.com

public String test(@ModelAttribute("dto") ProductDTO dto)

这样在页面中访问的key将是:dto。ZCw28资讯网——每日最新资讯28at.com

用于方法

@GetMapping("/product/{cateId}/{id}")public String test() {  return "modelattribute" ;}@ModelAttribute("dto")public ProductDTO dto(ProductDTO dto) {  System.out.println("dto....") ;  return dto ;}

将注解用于方法上后,当前的Controller中的所有接口都会先执行该方法将请求中的参数信息绑定到ProductDTO对象中,最后将该dto绑定到模型数据上。通过上面的配置你在页面上一样也可以访问该对象数据。ZCw28资讯网——每日最新资讯28at.com

2.2 @SessionAttribute

该注解只能用于方法参数上。ZCw28资讯网——每日最新资讯28at.com

该注解的作用用于读取session中的数据到当前的参数中,如下示例:ZCw28资讯网——每日最新资讯28at.com

@GetMapping("/user")@ResponseBodypublic User user(@SessionAttribute("user") User user) {  return user ;}// 模拟登录后将User对象存入Session中@GetMapping("/login")@ResponseBodypublic String login(HttpSession session) {  session.setAttribute("user", new User(666L, "Admin")) ;  return "login success" ;}

这里会读取Session中key=user的数据到当前User对象中,你需要先登录,然后再访问/user接口。ZCw28资讯网——每日最新资讯28at.com

如果session中没有user,那么程序将会报错ZCw28资讯网——每日最新资讯28at.com

图片图片ZCw28资讯网——每日最新资讯28at.com

错误提示,session对象中没有user属性。通过如下方式设置不是必须的;ZCw28资讯网——每日最新资讯28at.com

public User user(@SessionAttribute(value = "user", required = false) User user)

也可以将参数设置为Optional;ZCw28资讯网——每日最新资讯28at.com

public User user(@SessionAttribute("user") Optional<User> user)

通过上面2中方式设置,在Session中不存在对应的属性时也不会报错。ZCw28资讯网——每日最新资讯28at.com

注:还有一个@SessionAttributes注解,该注解可以用于类上。ZCw28资讯网——每日最新资讯28at.com

2.3 @RequestAttribute

该注解同样只能用于方法参数上。ZCw28资讯网——每日最新资讯28at.com

与 @SessionAttribute 类似,你也可以使用 @RequestAttribute 注解来访问先前创建的请求属性(例如,由 Servlet Filter或 HandlerInterceptor 创建的属性),如下示例:ZCw28资讯网——每日最新资讯28at.com

先定义一个Filter,该Filter作用是向Request中设置值;ZCw28资讯网——每日最新资讯28at.com

@Componentpublic class UserFilter extends OncePerRequestFilter {  @Override  protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain)      throws ServletException, IOException {    request.setAttribute("user", new User(888L, "Guest")) ;    filterChain.doFilter(request, response) ;  }}

接下来在Controller中通过@RequestAttribute访问user属性。ZCw28资讯网——每日最新资讯28at.com

@GetMapping("/user")@ResponseBodypublic User user(@RequestAttribute("user") Optional<User> user) {  return user.orElse(new User()) ;}

图片图片ZCw28资讯网——每日最新资讯28at.com

与@SessionAttribute一样,参数可以通过Optional设置不是必须的。ZCw28资讯网——每日最新资讯28at.com

2.4 RedirectAttributes

当页面通过redirect进行跳转时,可以通过该类定义在接口方法参数中,将数据保存到该对象中后,你就可以在调整到的页面中使用配置的属性了,如下示例:ZCw28资讯网——每日最新资讯28at.com

@GetMapping("")public String index(RedirectAttributes ra) {  // 将你需要的数据存入该对象中  ra.addFlashAttribute("message", "hello") ;  // redirect其它页面  return "redirect:/page/tm" ;}@GetMapping("tm")public String tm(RedirectAttributes ra) {  return "test" ;}

test.html页面如下:ZCw28资讯网——每日最新资讯28at.com

<body>  <h1>Test Page</h1>  <div th:if="${message}">    <h2 th:text="${message}" />  </div></body>

访问上面的/page,将redirec到最终的test.html页面;ZCw28资讯网——每日最新资讯28at.com

图片图片ZCw28资讯网——每日最新资讯28at.com

redirect过来后我们可以访问到配置的数据。ZCw28资讯网——每日最新资讯28at.com

本文链接:http://www.28at.com/showinfo-26-98547-0.html在SpringBoot项目中这几个注解你们还用吗?

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: Python 变量命名的艺术:五分钟速成秘籍

下一篇: C++ this 指针到底是个什么特殊的指针

标签:
  • 热门焦点
  • K60至尊版狂暴引擎2.0加持:超177万跑分斩获性能第一

    Redmi的后性能时代战略发布会今天下午如期举办,在本次发布会上,Redmi公布了多项关于和联发科的深度合作,以及新机K60 Ultra在软件和硬件方面的特性,例如:“K60 至尊版,双芯旗舰
  • 印度登月最关键一步!月船三号今晚进入环月轨道

    8月5日消息,据印度官方消息,月船三号将于北京时间今晚21时30分左右开始近月制动进入环月轨道。这是该探测器能够成功的最关键步骤之一,如果成功将开始围
  • 服务存储设计模式:Cache-Aside模式

    Cache-Aside模式一种常用的缓存方式,通常是把数据从主存储加载到KV缓存中,加速后续的访问。在存在重复度的场景,Cache-Aside可以提升服务性能,降低底层存储的压力,缺点是缓存和底
  • 使用LLM插件从命令行访问Llama 2

    最近的一个大新闻是Meta AI推出了新的开源授权的大型语言模型Llama 2。这是一项非常重要的进展:Llama 2可免费用于研究和商业用途。(几小时前,swyy发现它已从LLaMA 2更名为Lla
  • 慕岩炮轰抖音,百合网今何在?

    来源:价值研究所 作者:Hernanderz&ldquo;难道就因为自己的一个产品牛逼了,从客服到总裁,都不愿意正视自己产品和运营上的问题,选择逃避了吗?&rdquo;这一番话,出自百合网联合创
  • 破圈是B站头上的紧箍咒

    来源 | 光子星球撰文 | 吴坤谚编辑 | 吴先之每年的暑期档都少不了瞄准追剧女孩们的古偶剧集,2021年有优酷的《山河令》,2022年有爱奇艺的《苍兰诀》,今年却轮到小破站抓住了追
  • 花7万退货退款无门:谁在纵容淘宝珠宝商家造假?

    来源:极点商业作者:杨铭在淘宝购买珠宝玉石后,因为保证金不够赔付,店铺关闭,退货退款难、维权无门的比比皆是。&ldquo;提供相关产品鉴定证书,支持全国复检,可以30天无理由退换货。&
  • 华为将推出盘古数字人大模型 可帮助用户12小时完成数字人生成

    在今日举行的2023年华为云数字文娱AI创新峰会上,华为云全球Marketing与销售服务总裁石冀琳表示,华为云将在后续推出盘古数字人大模型,可帮助用户12小
  • 北京:科技教育体验基地开始登记

      北京“科技馆之城”科技教育体验基地登记和认证工作日前启动。首批北京科技教育体验基地拟于2023年全国科普日期间挂牌,后续还将开展常态化登记。  北京科技教育体验基
Top