文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

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

2024-11-29 21:15

关注

1. 简介

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

接下来将详细接上上面几个注解及类的使用。

2. 实战案例

2.1 @ModelAttribute

该注解可用于方法参数及方法上;

用于方法参数

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

图片

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

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

在页面中直接访问ProductDTO;

  • cateId:
  • id:

页面显示

图片

在上面你看到了,默认访问的key是当前类型的首字母改为小写,我们可以通过配置属性修改默认key

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

这样在页面中访问的key将是:dto。

用于方法

@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绑定到模型数据上。通过上面的配置你在页面上一样也可以访问该对象数据。

2.2 @SessionAttribute

该注解只能用于方法参数上。

该注解的作用用于读取session中的数据到当前的参数中,如下示例:

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

这里会读取Session中key=user的数据到当前User对象中,你需要先登录,然后再访问/user接口。

如果session中没有user,那么程序将会报错

图片

错误提示,session对象中没有user属性。通过如下方式设置不是必须的;

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

也可以将参数设置为Optional;

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

通过上面2中方式设置,在Session中不存在对应的属性时也不会报错。

注:还有一个@SessionAttributes注解,该注解可以用于类上。

2.3 @RequestAttribute

该注解同样只能用于方法参数上。

与 @SessionAttribute 类似,你也可以使用 @RequestAttribute 注解来访问先前创建的请求属性(例如,由 Servlet Filter或 HandlerInterceptor 创建的属性),如下示例:

先定义一个Filter,该Filter作用是向Request中设置值;

@Component
public 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属性。

@GetMapping("/user")
@ResponseBody
public User user(@RequestAttribute("user") Optional user) {
  return user.orElse(new User()) ;
}

图片

与@SessionAttribute一样,参数可以通过Optional设置不是必须的。

2.4 RedirectAttributes

当页面通过redirect进行跳转时,可以通过该类定义在接口方法参数中,将数据保存到该对象中后,你就可以在调整到的页面中使用配置的属性了,如下示例:

@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页面如下:


  
  

访问上面的/page,将redirec到最终的test.html页面;

图片

redirect过来后我们可以访问到配置的数据。

来源:Spring全家桶实战案例源码内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯