在expression式语言中转义JavaScript

有时,我需要在JSF页面中使用EL来呈现JavaScriptvariables。

例如

<script>var foo = '#{bean.foo}';</script> 

要么

 <h:xxx ... onclick="foo('#{bean.foo}')" /> 

当ELexpression式求值为包含JS特殊字符(如撇号和换行符)的string时,这会失败,并出现JS语法错误。 我如何逃避它?

您可以在EL中使用Apache Commons Lang 3.x StringEscapeUtils#escapeEcmaScript()方法。

首先创build一个/WEB-INF/functions.taglib.xml ,如下所示:

 <?xml version="1.0" encoding="UTF-8"?> <facelet-taglib xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-facelettaglibrary_2_0.xsd" version="2.0"> <namespace>http://example.com/functions</namespace> <function> <name>escapeJS</name> <function-class>org.apache.commons.lang3.StringEscapeUtils</function-class> <function-signature>java.lang.String escapeEcmaScript(java.lang.String)</function-signature> </function> </taglib> 

然后将其注册到/WEB-INF/web.xml ,如下所示:

 <context-param> <param-name>javax.faces.FACELETS_LIBRARIES</param-name> <param-value>/WEB-INF/functions.taglib.xml</param-value> </context-param> 

那么你可以使用它如下:

 <html ... xmlns:func="http://example.com/functions"> ... <script>var foo = '#{func:escapeJS(bean.foo)}';</script> ... <h:xxx ... onclick="foo('#{func:escapeJS(bean.foo)}')" /> 

或者,如果您碰巧已经使用了JSF实用程序库OmniFaces ,那么您也可以使用它的内build函数: of:escapeJS()函数:

 <html ... xmlns:of="http://omnifaces.org/functions"> ... <script>var foo = '#{of:escapeJS(bean.foo)}';</script> ... <h:xxx ... onclick="foo('#{of:escapeJS(bean.foo)}')" /> 

你有没有试过\'#{_selectedItem.item.webName}\', ,?