2011-07-07 9 views
5

Đôi khi, tôi cần hiển thị biến JavaScript bằng EL trong trang JSF.JavaScript thoát bằng ngôn ngữ biểu thức

Ví dụ:

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

hoặc

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

này không thành công với một lỗi cú pháp JS khi biểu thức EL để đánh giá một chuỗi chứa JS ký tự đặc biệt như dấu nháy đơn và xuống dòng. Làm thế nào để thoát khỏi nó?

+0

Câu trả lời bên dưới giúp tôi theo dõi đúng. – Ontonomo

+0

đã thêm: xmlns: fn = "http://java.sun.com/jsp/jstl/functions" và trong mã '# {fn: replace (_selectedItem.item.webName, "'", "")} ' , – Ontonomo

Trả lời

13

Bạn có thể sử dụng phương pháp Apache Commons Lang 3.xStringEscapeUtils#escapeEcmaScript() cho điều này trong EL.

Đầu tiên tạo một /WEB-INF/functions.taglib.xml mà trông như thế này:

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

Sau đó đăng ký nó trong /WEB-INF/web.xml như sau:

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

Sau đó, bạn có thể sử dụng nó như sau:

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

Ngoài ra, nếu bạn tình cờ đã sử dụng thư viện tiện ích JSF OmniFaces, sau đó bạn cũng có thể chỉ sử dụng chức năng được tích hợp sẵn của nó 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

Tôi đã theo dõi ở trên, nhưng tôi nhận được ngoại lệ sau: javax.servlet.ServletException: com.sun.faces.el.impl.ElException: Không có hàm nào được ánh xạ tới tên "util: escapeJS" Tôi trên JSF 1.1, JSP 2.1 ... bất kỳ ý tưởng gì tôi nên xem xét? – bendicott

+0

@bendicott: Câu trả lời ở trên sử dụng thẻ tag Facelet. Bạn đang sử dụng JSP, không phải là Facelets. Bạn cần phải tạo một thẻ tag JSP thay thế. – BalusC

+0

Đã phải sửa định nghĩa taglib nhưng giải pháp của bạn rất tuyệt vời ... đơn giản và hiệu quả! – cljk

-1

Bạn đã thử \'#{_selectedItem.item.webName}\', chưa?

+1

Đọc câu hỏi một lần nữa. Đó là 'webName' trả về giá trị chuỗi được bỏ qua. – BalusC