Spring MVC下AJAX请求后无法通过Thymeleaf内联读取model中manager数据如何解决
问题根因
- Thymeleaf的
[[${xxx}]]内联语法仅在服务端渲染页面时执行一次,页面加载完成后JS在浏览器端运行时,该语法已经被替换为页面首次加载时的固定值,不会动态读取后续接口更新的model数据。 - 你当前编写的
/manager/{id}接口返回的是整个index视图页面,AJAX请求拿到的响应是完整的HTML文档,无法单独获取到manager字段的值。
解决方案
1. 改造后端接口
直接返回manager数据而非视图,新增@ResponseBody注解即可:
@GetMapping(path="/manager/{id}") @ResponseBody // 标识直接返回数据,不解析为视图路径 public String getManagedEmployees(@PathVariable int id) { List<String> employeeNames = employeesServices.findManager(id); StringBuffer strBuf = new StringBuffer(); for (String employeeName:employeeNames) { System.err.println("manager " +employeeName); String newEmployeeName = employeeName.replace(',',' '); strBuf.append(newEmployeeName ); } System.err.println("strbuf " + strBuf); return strBuf.toString(); // 直接返回manager字符串,无需存入model }
2. 改造前端AJAX逻辑
不要在success回调中使用[[${manager}]],直接读取接口返回的响应结果即可:
$.ajax({ url: '/manager/'+ id , type: 'GET', success: function(result) { console.log('manager retrieve correctly'); console.log("manager1 " + result); // 直接赋值返回结果,原代码的[0]不需要,因为接口返回的是字符串不是数组 document.getElementById("detailledManagerDataLabelId").value = result; }, error: function() { console.log ("manager ajax failed "); } });
3. 定时器逻辑调整
你现有定时器中的[[${manager}]]是页面首次加载的固定值,不会实时更新。如果需要定时拉取最新的manager数据,需要在定时器回调中发起AJAX请求拉取最新数据,不能直接使用Thymeleaf内联语法读取。
内容的提问来源于stack exchange,提问作者kim
相关产品推荐
相关产品推荐

