How to escape '$' and '#' in Facelets/EL?
Asked Answered
G

2

6

I'm using Java Facelets and jQuery, however the expression

$('...')

in jQuery conflicts with EL expression, how do I escape the jQuery's one?

I'd like to escape a large chunk of Javascript, too.

ANSWERED

To convert the existing JSP to Facelets xhtml, it's convenient to just wrap the existing javascript by <![CDATA[ ... ]]>. However, the output scripts for <script> are wrapped by <!-- --> comment, which conflicts with CDATA section:

<script><![CDATA[ scripts... ]]></script>

=> <script><!-- <![CDATA[ scripts... ]]> --></script>

To resolve this problem, you should also comment out the CDATA:

<script>/* <![CDATA[ */ scripts... /* ]]> */</script>

=> <script><!-- /* <![CDATA[ */ scripts... /* ]]> */--></script>

See also When is a CDATA section necessary within a script tag?.

Gunplay answered 10/4, 2011 at 19:20 Comment(1)
As per your update, the real problem comes clear: you're writing JS code raw in a XML file and the XML parser is falling over $ which should be represented as &amp;. Apart from the ugly CDATA workaround, the best solution is to put JS code in its own .js file. After all, the question title and body does not describe the real problem and is therefore misleading.Penates
P
3

This should normally not conflict. EL uses ${} syntax. Anyway, you could either use jQuery() instead (the $() is just a shorthand) or simply put JS code in its own .js file.

Penates answered 10/4, 2011 at 19:22 Comment(0)
U
11

Should anyone need to, the Expression Language Specification Version 2.2 Maintenance Release describes how to escape EL expressions:

To generate literal values that include the character sequence "${" or "#{", the developer can choose to use a composite expression as shown here:

${'${'}exprA}
#{'#{'}exprB}

The resulting values would then be the strings ${exprA} and #{exprB}.

Alternatively, the escape characters \$ and \# can be used to escape what would otherwise be treated as an eval-expression. Given the literal-expressions:

\${exprA}
\#{exprB}
Unreserved answered 12/4, 2011 at 15:14 Comment(0)
P
3

This should normally not conflict. EL uses ${} syntax. Anyway, you could either use jQuery() instead (the $() is just a shorthand) or simply put JS code in its own .js file.

Penates answered 10/4, 2011 at 19:22 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.