使用JSP标签向JavaScript传值时JSP表达式未解析问题求解
问题根因
该问题的核心原因是Struts 自定义标签(比如<html:link>)的属性值内部嵌套JSP脚本表达式时,不会被JSP容器正常解析,所以<%=MyForm.USERNAME%>没有被替换成实际常量值,而是直接作为字符串输出到了前端,导致JS函数接收到错误的参数。
可行解决方案
方案1:改用原生HTML标签替代Struts链接标签
原生HTML标签的属性内的JSP脚本表达式会被正常解析,如果你不需要用到<html:link>的特殊能力(比如自动拼接应用上下文路径、表单参数自动绑定),这是改造成本最低的方案:
<!-- 替换<html:link>为原生a标签 --> <a href="#" class="frameaction" onclick="verifyUsername('<%=MyForm.USERNAME%>'); return false;"> <img src="<%=verifyButton%>" /> </a>
方案2:提前将常量存入JSP上下文后用EL表达式传参
如果必须使用<html:link>标签,可以提前把常量值存入JSP的域对象,再用EL表达式传入标签属性,Struts标签可以正常解析EL表达式:
<% // 提前将常量值存入page域 pageContext.setAttribute("USERNAME_CONST", MyForm.USERNAME); %> <html:link href="#" styleClass="frameaction" onclick="verifyUsername('${USERNAME_CONST}'); return false;"> <html:img src="<%=verifyButton%>"/> </html:link>
方案3:直接读取页面隐藏域的值,取消参数传递
你已经在页面定义了对应常量的隐藏域,可以直接在JS中读取该隐藏域的值,完全规避参数传递的解析问题:
- 修改链接的onclick属性,取消参数传递:
<html:link href="#" styleClass="frameaction" onclick="verifyUsername(); return false;"> <html:img src="<%=verifyButton%>"/> </html:link>
- 调整JS函数逻辑,主动读取隐藏域值:
function verifyUsername() { // 读取隐藏域的实际值 const username = document.querySelector('input[name="<%=MyForm.USERNAME%>"]').value; // 原有校验逻辑保持不变 }
内容的提问来源于stack exchange,提问作者Hải Trung Phạm
相关产品推荐
相关产品推荐

