Spring Boot货币兑换项目:Thymeleaf模板数据回显问题求助
解决Thymeleaf无法读取Model属性的问题
嘿,我明白你现在卡在哪了!问题主要出在两个地方:一是你用了重定向导致Model数据丢失,二是模板里的th:field用法不太适配当前场景。下面给你一步步拆解解决:
为什么数据读不到?
你在Controller里用了return "redirect:/exchange",这是客户端跳转——浏览器会重新发起一个GET请求到/exchange,而原来POST请求里的Model数据不会被带到新的请求里,所以Thymeleaf自然拿不到resultNumber。
解决方案1:用Flash Attributes(最推荐)
Spring提供的Flash属性专门用来解决重定向时传递数据的问题,它会把数据暂存到会话中,仅在下次请求可用,之后自动清除,不会残留。
修改你的Controller代码:
@PostMapping("/postCurrency") public String postExchange(@RequestParam Double fNumber, RedirectAttributes redirectAttributes){ Double number = exchangeLogic.exchange(fNumber); // 用addFlashAttribute代替model.addAttribute redirectAttributes.addFlashAttribute("resultNumber", number); return "redirect:/exchange"; }
然后调整模板里的输入框,把th:field改成th:value(因为th:field是用来绑定表单对象属性的,你这里没有对应的表单对象):
<input type="number" th:value="${resultNumber}" disabled/>
解决方案2:直接返回视图(无需重定向)
如果不需要重定向(比如担心用户刷新页面重复提交的话,可以加防重复提交逻辑),你可以直接返回exchange视图,这样Model里的属性就能直接被Thymeleaf读取:
修改Controller:
@PostMapping("/postCurrency") public String postExchange(@RequestParam Double fNumber, Model model){ Double number = exchangeLogic.exchange(fNumber); model.addAttribute("resultNumber", number); return "exchange"; // 直接返回视图名,不是重定向 }
模板同样改成th:value="${resultNumber}"即可。
解决方案3:用Session暂存(不推荐,除非必要)
如果需要让数据在多个请求里保留,可以把数据放到Session中,但记得用完及时清除,避免内存浪费:
Controller代码:
@PostMapping("/postCurrency") public String postExchange(@RequestParam Double fNumber, HttpSession session){ Double number = exchangeLogic.exchange(fNumber); session.setAttribute("resultNumber", number); return "redirect:/exchange"; }
模板里这样取值:
<input type="number" th:value="${session.resultNumber}" disabled/>
之后可以在处理/exchange的GET方法里清除Session属性:
@GetMapping("/exchange") public String getExchange(HttpSession session){ // 用完清除,避免残留 session.removeAttribute("resultNumber"); return "exchange"; }
内容的提问来源于stack exchange,提问作者shelo
相关产品推荐
相关产品推荐

