[英]How to escape apostrophe or quotes on a JSP (used by JavaScript)
我有一個用戶表單。 如果用戶輸入帶有'
或"
的字符串作為其中的一部分,我沒有問題。表單已提交並正確保存到數據庫中。我的問題是當我重新加載頁面時(所有條目都可以修改並加載到在顯示之前在 JSP 中列出)。加載頁面時,我收到一條錯誤消息:
missing ) after argument list 'Caroline's message', \n
我需要做什么來轉義這個字符串以在前端顯示它?
這是我在前端用於讀取數據並將其存儲在 JavaScript 對象中的代碼。 我不完全確定我需要逃到哪里。 導致問題的字段是 c.getComName:
communications[<%=i%>][1] = new CommObject('<%=c.getComId()%>', '<%=c.getComName()%>');
使用生成的 HTML 更新:
communications[0][1] = new CommObject('101', 'Caroline's Message');
我更喜歡避免在我的頁面中間使用 scriptlet,並且在 JavaScript 代碼中使用它們時不得不(越來越頻繁地)使用它們來轉義字符串。 我想要一種轉義字符串的表達式語言(EL) 方式。 我創建了一個非常小的自定義標簽庫,我僅用於此目的:
實用程序.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)}
使用 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'.
fn:escapeXml
在 JavaScript 中不起作用。 它將'
替換為#&0039;
執行 JavaScript 時仍然導致錯誤。
只有以 JavaScript 方式轉義才是正確的: \\'
Apache StringEscapeUtils.escapeJavaScript 函數會為您完成這項工作。 為它創建一個標簽庫大大簡化了事情。
我們也有來自 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>
結果
string (1):這是 abc 的第一個 String。
字符串 (2):這是 abc 的第二個字符串。
當您從 CommObject 類返回 HTML 時,在名稱前添加 \\" 而不是 '(例如 Caroline 的消息)
像這樣: return "\\"" + comName + "\\"";
當我將數據從我的 servlet 傳遞到我的JSP
然后傳遞到我的代碼 Javascript 以創建JSON
對象時,我遇到了這個問題,所以我需要它'
但它的呈現方式類似於' ;
它不能在JSON
對象中,所以要修復我只需將我的JSP
從寫入'
更改為`
6 鍵,它工作正常。
那很奇怪。
關於什么:
'<%=c.getComName().replaceAll("\\'","\\\\'")%>'
如果可行,您只需要弄清楚如何添加\\"。
您可以使用 JSP 核心標簽:
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
var jsVar = "<c:out value='${stringVariable}' />";
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.