Spring Boot中如何将Model对象的数据从View传递到Controller?
解决Spring Boot + Thymeleaf重定向传递Model数据的问题
因为重定向是客户端发起的全新HTTP请求,原请求中的Model数据不会自动携带到新请求中,针对你的场景,有以下几种可行的实现方式:
方式一:URL参数传递(最简单直接)
在test.html中,将message作为URL参数拼接到跳转链接里,让客户端发起请求时携带该参数:
<!-- test.html中的跳转按钮 --> <a th:href="@{/submit(message=${message})}" class="btn">跳转到Submit页面</a>
然后在submit()方法中通过@RequestParam接收参数,并添加到当前请求的Model中:
@Controller public class MyController { @GetMapping("/test") public String test(Model model) { model.addAttribute("message", "This is just a message"); return "test"; } @GetMapping("/submit") public String submit(@RequestParam("message") String message, Model model) { // 将接收到的参数存入当前Model,供submit.html使用 model.addAttribute("message", message); return "submit"; } }
适用场景:数据内容简单、无需保密的场景,缺点是参数会暴露在浏览器地址栏中。
方式二:HttpSession存储(跨请求保留数据)
在test()方法中将message存入HttpSession,后续请求可从会话中读取:
@Controller public class MyController { @GetMapping("/test") public String test(HttpSession session) { session.setAttribute("message", "This is just a message"); return "test"; } @GetMapping("/submit") public String submit(HttpSession session, Model model) { String message = (String) session.getAttribute("message"); model.addAttribute("message", message); // 可选:用完后移除会话中的数据,避免长期占用 session.removeAttribute("message"); return "submit"; } }
test.html中的跳转按钮无需额外处理,直接指向/submit即可:
<a href="/submit" class="btn">跳转到Submit页面</a>
适用场景:需要跨多个请求保留数据的场景,注意如果会话未失效,数据会一直存在,需手动清理。
方式三:Flash属性(重定向专用,不暴露参数)
利用Spring的RedirectAttributes实现闪存属性,这类属性仅在重定向后的下一次请求中有效,之后自动清除,适合单次重定向且不想暴露参数的场景。
首先修改test.html,通过表单提交数据到中间控制器方法:
<!-- test.html中的表单 --> <form th:action="@{/transfer-to-submit}" method="post"> <input type="hidden" th:value="${message}" name="message"> <button type="submit">跳转到Submit页面</button> </form>
然后在控制器中添加中间方法,使用RedirectAttributes添加Flash属性并执行重定向:
@Controller public class MyController { @GetMapping("/test") public String test(Model model) { model.addAttribute("message", "This is just a message"); return "test"; } @PostMapping("/transfer-to-submit") public String transferToSubmit(@RequestParam("message") String message, RedirectAttributes redirectAttributes) { // 添加Flash属性,会自动传递到重定向后的请求 redirectAttributes.addFlashAttribute("message", message); return "redirect:/submit"; } @GetMapping("/submit") public String submit(Model model) { // Flash属性已自动存入Model,直接使用即可 String message = (String) model.getAttribute("message"); return "submit"; } }
适用场景:需要隐藏参数、仅单次重定向传递数据的场景,不会在URL中暴露参数。
内容的提问来源于stack exchange,提问作者shm_csgo
相关产品推荐
相关产品推荐

