AJAX返回含Spring标签的map内容无法解析,如何显示资源包文本?
搞定AJAX返回的Spring标签不解析问题
嘿,这个坑我踩过!你遇到的问题核心原因很明确:Spring的<spring:message>是服务器端渲染标签,只有当JSP页面被服务器解析的时候,才会把它替换成资源包里的实际文本。而你通过AJAX请求拿到的是服务器已经输出的纯HTML字符串,客户端浏览器完全不认识Spring的标签语法,自然就把标签原文显示出来了。
下面给你几个实用的解决方案,按需选择:
方案1:服务器端提前解析好再返回
最直接的办法就是修改AJAX对应的后端接口(比如Spring MVC Controller或者Servlet),在服务器端先把<spring:message>替换成真实文本,再把完整的HTML返回给前端。
举个Spring MVC的例子:
@GetMapping("/getMapContent") @ResponseBody public String getMapContent() { // 从资源包获取指定key的文本,自动适配当前Locale String hoverText = messageSource.getMessage("label.cliquerIci", null, LocaleContextHolder.getLocale()); // 直接拼接已经解析好的map HTML return String.format( "<map name=\"map\"> <area shape=\"rect\" coords=\"264,716,397,744\" alt=\"Sun\" href=\"Search.html?searchPathId=4\" title=\"%s\"> </map>", hoverText ); }
这样AJAX拿到的HTML里,title已经是资源包的文本了,直接渲染就能用。
方案2:前端单独请求资源文本,动态替换
如果不想改动现有返回HTML的接口,也可以分两步走:先拿带标签的HTML,再请求对应的资源文本,最后用JS替换title属性。
前端JS代码示例:
// 第一步:获取map HTML并插入页面 fetch("/your-ajax-endpoint") .then(res => res.text()) .then(html => { document.getElementById("your-target-element").innerHTML = html; // 第二步:请求资源文本 return fetch("/get-resource-message?code=label.cliquerIci"); }) .then(res => res.text()) .then(message => { // 找到area元素,替换title document.querySelector('map[name="map"] area').setAttribute("title", message); });
对应的后端需要加一个接口来返回指定code的资源文本:
@GetMapping("/get-resource-message") @ResponseBody public String getResourceMessage(@RequestParam String code) { return messageSource.getMessage(code, null, LocaleContextHolder.getLocale()); }
方案3:页面初始化时注入资源文本(最优解如果适用)
如果这个资源文本在页面加载时就可以确定,那可以直接在JSP页面里把资源文本注入到全局JS变量中,这样AJAX拿到HTML后直接用变量替换就行,不用额外发请求。
JSP页面里加这段:
<script> // 把需要的资源文本提前存在全局变量里 window.appMessages = { cliquerIci: '<spring:message code="label.cliquerIci"/>' }; </script>
然后前端AJAX处理代码:
fetch("/your-ajax-endpoint") .then(res => res.text()) .then(html => { document.getElementById("your-target-element").innerHTML = html; // 直接用全局变量替换title document.querySelector('map[name="map"] area').setAttribute("title", window.appMessages.cliquerIci); });
这种方式效率最高,适合资源文本不需要动态变化的场景。
最后再划个重点
记住:Spring的标签只能在服务器端被解析,客户端浏览器没有处理这些标签的能力。所以要么在后端把标签换成真实文本再返回,要么前端用已经解析好的资源内容去替换标签占位符。
内容的提问来源于stack exchange,提问作者senior
相关产品推荐
相关产品推荐

