JSTL fn:escapeXml转义路径报错:无效Unicode转义序列求助
问题修复方案
你的问题核心在于fn:escapeXml的作用边界——它仅负责转义HTML/XML特殊字符(如<、>、&),完全不处理JavaScript的特殊字符(比如反斜杠\)。而JavaScript中\u是Unicode转义序列的起始标识,原字符串里的\university会被解析器判定为无效转义,直接抛出语法错误。
以下是两种可行的修复方案:
方案1:用JSTL的fn:replace转义反斜杠
直接在现有代码基础上嵌套fn:replace,把单个反斜杠替换为JavaScript可识别的双反斜杠:
function setLocation() { var fullPath = "${fn:replace(fn:escapeXml(folderPath), '\\', '\\\\')}"; updateFolderPath(fullPath); }
- 说明:JSP中
'\\'会被解析为单个\,'\\\\'会被解析为两个\\;替换后原字符串里的\会变成\\,JavaScript解析时会将其视为普通反斜杠字符,不会触发转义错误。
方案2:自定义EL函数(适合频繁使用场景)
如果项目中需要多次处理JS字符串转义,可以封装自定义EL函数统一处理:
- 编写Java工具类:
public class JsEscapeUtils { public static String escapeJs(String input) { if (input == null) return null; return input.replace("\\", "\\\\") .replace("'", "\\'") .replace("\"", "\\\"") .replace("\n", "\\n") .replace("\r", "\\r"); } }
- 在
WEB-INF下创建tld文件(如custom-functions.tld)注册函数:
<?xml version="1.0" encoding="UTF-8"?> <taglib xmlns="http://java.sun.com/xml/ns/javaee" version="2.1"> <tlib-version>1.0</tlib-version> <short-name>custom</short-name> <uri>http://example.com/custom-functions</uri> <function> <name>escapeJs</name> <function-class>com.yourpackage.JsEscapeUtils</function-class> <function-signature>java.lang.String escapeJs(java.lang.String)</function-signature> </function> </taglib>
- 在JSP页面引入并使用:
<%@ taglib prefix="custom" uri="http://example.com/custom-functions" %>
function setLocation() { var fullPath = "${custom:escapeJs(folderPath)}"; updateFolderPath(fullPath); }
内容的提问来源于stack exchange,提问作者Ram Somani
相关产品推荐
相关产品推荐

