2011-07-07 24 views
5

Bazen, bir JSF sayfasında EL kullanarak bir JavaScript değişkeni oluşturmam gerekiyor.İfade Dili'ndeki JavaScript'ten Kaçış

E.g.

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

veya

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

EL ifadesi kesme işareti ve yeni satır gibi JS özel karakterleri içeren bir dizi olarak değerlendirilirse, bu JS yazım hatası ile başarısız olur. Nasıl kaçarım?

+0

cevap aşağıda doğru yolda beni koy. – Ontonomo

+0

eklendi: xmlns: fn = "http://java.sun.com/jsp/jstl/functions" ve kodda # # {fn: replace (_selectedItem.item.webName, "'", "")}' , – Ontonomo

cevap

13

Bunun için EL'de Apache Commons Lang 3.xStringEscapeUtils#escapeEcmaScript() yöntemini kullanabilirsiniz. aşağıdaki gibi

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

Sonra kullanabilirsiniz: şu şekildedir:

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

Sonra /WEB-INF/web.xml bunu kayıt: şuna benzer bir /WEB-INF/functions.taglib.xml oluşturmak

İlk

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

Alternatif olarak, JSF yardımcı kitaplığını zaten kullanıyorsanız OmniFaces, o zaman da sadece kendi yerleşik of:escapeJS() işlevini kullanabilirsiniz:

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

Yukarıdakileri takip ettim ama şu istisnayı alıyorum: javax.servlet.ServletException: com.sun.faces.el.impl.ElException: "utilJS" adıyla eşleştirilen bir işlev yok. JSF 1.1'de, JSP 2.1 ... neye bakmalıyım? – bendicott

+0

@bendicott: Yukarıdaki yanıt bir Facelet taglib kullanıyor. Facelets değil JSP kullanıyorsunuz. Bunun yerine bir JSP taglib oluşturmalısınız. – BalusC

+0

taglib tanımını düzeltmek zorunda kaldınız ama çözümünüz harika ... basit ve etkili! – cljk

-1

\'#{_selectedItem.item.webName}\','u denediniz mi?

+1

Soruyu bir kez daha okuyun. Kesilen bir dize değeri döndüren 'webName'. – BalusC