2012-03-14 25 views
3

私は完全にこれに固執しています、私はJSPで単一引用符をエスケープしようとしています。私はJS文字列に直接出力しているいくつかのデータを持っており、一重引用符は問題を引き起こしているようです。JSPでJavaScriptをエスケープする方法は?

は、ここに私のコードです:

<dsp:droplet name="/atg/dynamo/droplet/ForEach"> 
    <dsp:param value="${CommerceItems}" name="array" /> 
    <dsp:param name="elementName" value="CommerceItem" /> 
    <dsp:oparam name="outputStart"> 
    var itemNameList =' 
    </dsp:oparam> 
    <dsp:oparam name="output"> 
    <dsp:getvalueof id="Desc" param="CommerceItem.auxiliaryData.productRef.displayName"> 
     ${fn:replace(Desc, "'", "\\/'")} 
    </dsp:getvalueof> 
    </dsp:oparam> 
    <dsp:oparam name="outputEnd">';</dsp:oparam> 
</dsp:droplet> 

そして、ここでImはなっていることを出力します:

var itemNameList =' 
Weyland Estate Santa Barbara Pinot Noir 
Raymond \/'Prodigal\/' North Coast Cabernet Sauvignon 
Chateau Haute Tuque'; 

は、しかし、これは間違っている、と私は全く/'Prodigal'/または単一引用符を必要としません!


EDIT:または私は実際に\バックスラッシュと引用符をエスケープする必要がありますか?

+1

は、その\\」http://stackoverflow.com/questions/1470768/how-のように見えますエスケープ - アポストロフィ - または - 引用符で - jspの使用 - javascript –

+0

ああ、私はこの1つの図を傾ける! – jrutter

答えて

13

スラッシュはエスケープ文字ではありません。それはバックスラッシュです。

${fn:replace(Desc, "'", "\\'")} 

(つまり Javaでエスケープ文字だから、はい、それは、二回提示されています!)

しかし、あなただけのあなたも必要、\'によりrepace 'する必要はありません\n(改行)を\\nに置き換えてください。文字列は複数の行にまたがって印刷されているため、無効なJS文字列変数になります。あなたの最終的な結果は、基本的には、このような見する必要があります。

var itemNameList = '' 
    + '\nWeyland Estate Santa Barbara Pinot Noir' 
    + '\nRaymond \'Prodigal\' North Coast Cabernet Sauvignon' 
    + '\nChateau Haute Tuque'; 

(あなたにシンタックスハイライトは、ここで私に同意することに注意しなくてください)

よりしかしできるだけの特殊文字があります。それはエスケープする必要があります。それらはすべてApache Commons LangStringEscapeUtils#escapeEcmaScript()でカバーされています。このメソッドを正確に呼び出すカスタムEL関数を作成するほうがずっと簡単です。まだ完了していない場合は、commons-lang.jarをダウンロードして/WEB-INF/libにドロップしてください。以下のように続いて/WEB-INF/functions.tldファイルを作成します。

<?xml version="1.0" encoding="UTF-8" ?> 
<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-jsptaglibrary_2_1.xsd" 
    version="2.1"> 

    <display-name>Custom Functions</display-name>  
    <tlib-version>1.0</tlib-version> 
    <uri>http://example.com/functions</uri> 

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

を次のようにあなたがそれを使用できるように:

<%@taglib prefix="util" uri="http://example.com/functions" %> 
... 
${util:escapeJS(Desc)} 
+0

これをクリアしていただきありがとうございます - これは素晴らしいことです! – jrutter

+0

よろしくお願いいたします。 – BalusC

+2

Springには、[_s:escapeBody_](http://docs.spring.io/spring/docs/3.0.x/spring-framework-reference/html/spring.tld.html#spring)用の既製のタグがあります。 tld.escapeBody)、Springを使用している場合は独自のカスタムタグを定義せずに使用できます。 –

関連する問題