ユーザーフォームがあります。ユーザーが'
または"
の一部として文字列を入力した場合、問題はありません。フォームが送信され、データベースに正しく保存されます。私の問題は、ページをリロードするときです(すべてのエントリは変更可能で、表示される前に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');
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'.
私はページの中央でスクリプトレットを避けることを好み、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)}
fn:escapeXmlはJavaScriptでは機能しません。 'を#&0039;に置き換えます。 JavaScriptの実行時に引き続きエラーが発生します。
JavaScript方式でのエスケープのみが正しい:\ '
Apache StringEscapeUtils.escapeJavaScript関数がこれを行います。そのためのtaglibの作成は、問題を大幅に単純化します。
また、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()%>');
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番目の文字列です。
CommObjectクラスからHTMLを返す場合、名前の前に 'ではなく\ "を追加します(例:Carolineのメッセージ)
このように:return "\" "+ comName +"\"";