在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}\',
,?