2011-07-07 26 views
5

A veces, necesito representar una variable de JavaScript usando EL en una página JSF.Escape JavaScript en Expression Language

E.g.

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

o

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

Esta falla con un error de sintaxis JS cuando la expresión EL evalúa como una cadena que contiene caracteres especiales tales como JS apóstrofe y la nueva línea. ¿Cómo escapo?

+0

La respuesta más adelante me puso sobre la pista correcta. – Ontonomo

+0

agregado: xmlns: fn = "http://java.sun.com/jsp/jstl/functions" y en el código '# {fn: replace (_selectedItem.item.webName, "'", "")} ' , – Ontonomo

Respuesta

13

Puede usar el método Apache Commons Lang 3.xStringEscapeUtils#escapeEcmaScript() para esto en EL.

En primer lugar crear un /WEB-INF/functions.taglib.xml que se parecen a esto:

<?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> 

continuación, se registra en /WEB-INF/web.xml de la siguiente manera:

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

continuación, puede utilizar la siguiente manera:

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

Alternativamente, si ya usa la biblioteca de utilidades JSF OmniFaces, entonces usted también puede utilizar su función incorporada 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)}')" /> 
+0

He seguido lo anterior, pero recibo la siguiente excepción: javax.servlet.ServletException: com.sun.faces.el.impl.ElException: ninguna función está asignada al nombre "util: escapeJS" Soy en JSF 1.1, JSP 2.1 ... alguna idea de lo que debería ver? – bendicott

+0

@bendicott: la respuesta anterior usa un taglib de Facelet. Estás usando JSP, no Facelets. Necesita crear un taglib JSP en su lugar. – BalusC

+0

Tuve que corregir la definición de taglib, pero tu solución es genial ... ¡simple y efectiva! – cljk

-1

¿Has probado \'#{_selectedItem.item.webName}\',?

+1

Lee la pregunta una vez más. Es 'webName' que devuelve un valor de cadena apostrofado. – BalusC

Cuestiones relacionadas