web-dev-qa-db-ja.com

JSPでアポストロフィまたは引用符をエスケープする方法(JavaScriptで使用)

ユーザーフォームがあります。ユーザーが'または"の一部として文字列を入力した場合、問題はありません。フォームが送信され、データベースに正しく保存されます。私の問題は、ページをリロードするときです(すべてのエントリは変更可能で、表示される前にJSPのリストにロードされます)。ページをロードすると、次のエラーが表示されます。

missing ) after argument list 'Caroline's message', \n

この文字列をエスケープしてフロントエンドに表示するにはどうすればよいですか?

これが、データを読み込んでJavaScriptオブジェクトに保存するためにフロントエンドで使用しているコードです。どこに逃げる必要があるのか​​よくわかりません。問題の原因となっているフィールドはc.getComNameです。

communications[<%=i%>][1] = new CommObject('<%=c.getComId()%>', '<%=c.getComName()%>');

HTML GENERATEDで更新:

communications[0][1] = new CommObject('101', 'Caroline's Message');
34
Caroline

Apache StringEscapeUtils.escapeJavaScript 関数を使用します。

Escapes the characters in a String using JavaScript String rules.

Escapes any values it finds into their JavaScript String form.
Deals correctly with quotes and control-chars (tab, backslash, cr, ff, etc.)

So a tab becomes the characters '\\' and 't'.
22
Kevin Hakanson

私はページの中央でスクリプトレットを避けることを好み、JavaScriptコードで使用するときに文字列をエスケープするために(ますます頻繁に)スクリプトレットを使用する必要がありました。 Expression Language (EL)文字列をエスケープする方法が必要でした。この目的のために使用する非常に小さなカスタムtaglibを作成しました。

Utilities.Java:

package com.mycom.taglibs;

import org.Apache.commons.lang.StringEscapeUtils;

public class Utilities {
    public static String escapeJS(String value) {
        return StringEscapeUtils.escapeJavaScript(value);
    }
}

mytaglib.tld:

<?xml version="1.0" encoding="UTF-8" ?>
<taglib xmlns="http://Java.Sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://Java.Sun.com/xml/ns/j2ee http://Java.Sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd"
version="2.0">

  <description>My Tag Library</description>
  <display-name>Tag Utils</display-name>
  <tlib-version>1.1</tlib-version>
  <short-name>myt</short-name>

  <function>
    <description>
        JavaScript Escape function
    </description>
    <name>escapeJS</name>
    <function-class>com.mycom.taglibs.Utilities</function-class>
    <function-signature>Java.lang.String escapeJS(Java.lang.String)</function-signature>
  </function>
</taglib>

そして、JSPページ:

<%@ taglib prefix="myt" uri="/WEB-INF/mytaglib.tld" %>
The escaped string is: ${myt:escapeJS(variableHoldingTheString)}
47
RHSeeger

fn:escapeXmlはJavaScriptでは機能しません。 'を#&0039;に置き換えます。 JavaScriptの実行時に引き続きエラーが発生します。

JavaScript方式でのエスケープのみが正しい:\ '

Apache StringEscapeUtils.escapeJavaScript関数がこれを行います。そのためのtaglibの作成は、問題を大幅に単純化します。

3
Radboud

また、Springの非常に優れたソリューションもあります。

_<%@ taglib prefix="spring" uri="http://www.springframework.org/tags" %>

<spring:message code="${propertyName}" javaScriptEscape="true"/>_

したがって、この投稿の質問からの問題は、この方法で解決できます。

communications[<%=i%>][1] = new CommObject('<spring:message code="${c.comId}" javaScriptEscape="true"/>', '<spring:message code="${c.comName}" javaScriptEscape="true"/> <%=c.getComName()%>');
1
Aleksey Shnepov

JSTLエスケープ関数fn:escapeXml()を使用して、一重引用符( `)による異常を取り除くことができます。次の例は、違いを示しています。

例えば:

<c:set var="string1" value="This is abc's first String."/>
<c:set var="string2" value="This is abc's second String."/>

<p>With escapeXml() Function:</p>
<p>string (1): ${fn:escapeXml(string1)}</p>

<p>Without escapeXml() Function:</p>
<p>string (2): ${fn:escapeXml(string2)}</p>

[〜#〜] result [〜#〜]

文字列(1):これはabcの最初の文字列です。

文字列(2):これはabcの2番目の文字列です。

0
boniezuvyz

CommObjectクラスからHTMLを返す場合、名前の前に 'ではなく\ "を追加します(例:Carolineのメッセージ)

このように:return "\" "+ comName +"\"";

0
amischiefr