簡體   English   中英

如何在 JSP 上轉義撇號或引號(由 JavaScript 使用)

[英]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對象時,我遇到了這個問題,所以我需要它'但它的呈現方式類似於&#39 ; 它不能在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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM