如何在JSP中通过脚本动态修改fmt:message的key值?
如何通过JS动态修改fmt:message的文本内容?
嘿,我来帮你捋捋这个问题——你想通过前端JS修改<fmt:message>的key,但其实这里有个核心误区:fmt:message是JSTL的服务器端标签,当页面发送到前端的时候,它已经被渲染成具体的文本内容了,前端DOM里根本看不到这个key属性,所以直接改key是行不通的。
给你几个实用的实现思路,你可以根据自己的场景选择:
思路一:提前渲染两种文本,用JS控制显隐(最简单)
既然你已经在服务器端有${hasSpecificRole}这个变量,不如直接在页面里提前把两种文本都渲染出来,然后用JS控制哪个显示哪个隐藏:
<test:main> <label for="conditions"> <!-- 默认显示普通文本 --> <fmt:message key="text:test:displayNormalText" bundle="${bundle}" class="role-text normal-text" /> <!-- 特殊角色文本默认隐藏 --> <fmt:message key="text:test:differentText" bundle="${bundle}" class="role-text different-text" style="display: none;" /> </label> </test:main> <script type="text/javascript"> jQuery(function($) { let hasSpecificRole = ${hasSpecificRole}; $(function() { if(hasSpecificRole){ $('.normal-text').hide(); $('.different-text').show(); } else { // 保持默认状态,显示普通文本 $('.different-text').hide(); $('.normal-text').show(); } }); }); </script>
这个方案不需要额外请求,逻辑简单,适合文本内容固定的场景。
思路二:AJAX请求后端获取对应文本(更灵活)
如果不想在页面里提前渲染两个文本,可以写一个简单的后端接口,接收key和bundle参数,返回对应的国际化文本。然后前端根据角色状态请求接口,替换label内容:
jQuery(function($) { let hasSpecificRole = ${hasSpecificRole}; $(function() { // 根据角色确定要请求的key let targetKey = hasSpecificRole ? 'text:test:differentText' : 'text:test:displayNormalText'; // 假设后端接口为/getI18nText,接收key和bundle参数 $.get('/getI18nText', { key: targetKey, bundle: '${bundle}' }, function(responseText) { // 替换label里的文本内容 $('label[for="conditions"]').text(responseText); }); }); });
这个方案适合文本内容可能动态变化的场景,但需要后端配合提供接口。
思路三:服务器端直接判断渲染(最推荐)
其实最省心的方案是直接在服务器端处理这个逻辑,完全不需要前端JS介入——既然你已经有${hasSpecificRole}这个变量,用JSTL的<c:choose>标签就能直接控制渲染哪个<fmt:message>:
<test:main> <label for="conditions"> <c:choose> <c:when test="${hasSpecificRole}"> <fmt:message key="text:test:differentText" bundle="${bundle}" /> </c:when> <c:otherwise> <fmt:message key="text:test:displayNormalText" bundle="${bundle}" /> </c:otherwise> </c:choose> </label> </test:main>
这个方案性能最好,前端拿到的就是最终需要的文本,不需要额外的DOM操作,体验也更流畅,是最推荐的做法。
内容的提问来源于stack exchange,提问作者degath
相关产品推荐
相关产品推荐

