You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 09:42:48