环境:SpringBoot3.3.0
在SpringBoot应用开发中,传统的请求属性处理方式如@ModelAttribute,@SessionAttribute,@RequestAttribute以及RedirectAttributes似乎用的越来越少了,但是在一些特定场景下它们发挥着不可或缺的作用尤其是当涉及到表单提交、会话状态管理和重定向属性传递时。
接下来将详细接上上面几个注解及类的使用。
该注解可用于方法参数及方法上;
@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;
<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>
图片
在上面你看到了,默认访问的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绑定到模型数据上。通过上面的配置你在页面上一样也可以访问该对象数据。
该注解只能用于方法参数上。
该注解的作用用于读取session中的数据到当前的参数中,如下示例:
@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接口。
如果session中没有user,那么程序将会报错
图片
错误提示,session对象中没有user属性。通过如下方式设置不是必须的;
public User user(@SessionAttribute(value = "user", required = false) User user)
也可以将参数设置为Optional;
public User user(@SessionAttribute("user") Optional<User> user)
通过上面2中方式设置,在Session中不存在对应的属性时也不会报错。
注:还有一个@SessionAttributes注解,该注解可以用于类上。
该注解同样只能用于方法参数上。
与 @SessionAttribute 类似,你也可以使用 @RequestAttribute 注解来访问先前创建的请求属性(例如,由 Servlet Filter或 HandlerInterceptor 创建的属性),如下示例:
先定义一个Filter,该Filter作用是向Request中设置值;
@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属性。
@GetMapping("/user")@ResponseBodypublic User user(@RequestAttribute("user") Optional<User> user) { return user.orElse(new User()) ;}
图片
与@SessionAttribute一样,参数可以通过Optional设置不是必须的。
当页面通过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页面如下:
<body> <h1>Test Page</h1> <div th:if="${message}"> <h2 th:text="${message}" /> </div></body>
访问上面的/page,将redirec到最终的test.html页面;
图片
redirect过来后我们可以访问到配置的数据。
本文链接:http://www.28at.com/showinfo-26-98547-0.html在SpringBoot项目中这几个注解你们还用吗?
声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com