Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jsp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 将撇号转义为\';使用c:out-JSP_Java_Jsp_Jstl - Fatal编程技术网

Java 将撇号转义为\';使用c:out-JSP

Java 将撇号转义为\';使用c:out-JSP,java,jsp,jstl,Java,Jsp,Jstl,我有一个带有个人姓氏的对象字段 如果我使用${person.lastName},我会得到O'Brian 如果我使用 <c:out value="${person.lastName}"/> 或 我需要奥布赖恩以奥布赖恩的身份逃走 你知道如何解决这个问题吗 解决方案 最优雅的解决方案似乎使用了一个简单的标签 package view; import java.io.IOException; import javax.servlet.jsp.JspException; import

我有一个带有个人姓氏的对象字段

如果我使用${person.lastName},我会得到O'Brian

如果我使用

 <c:out value="${person.lastName}"/> 

我需要奥布赖恩以奥布赖恩的身份逃走

你知道如何解决这个问题吗

解决方案 最优雅的解决方案似乎使用了一个简单的标签

package view;

import java.io.IOException;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.SimpleTagSupport;

public class EscapeJS extends SimpleTagSupport {
    public String str;

    public void doTag() throws JspException, IOException {
        getJspContext().getOut().print(str.replaceAll("\'", "\\\\'"));
    }

    public String getStr() {
        return str;
    }

    public void setStr(String str) {
        this.str = str;
    }

}
然后在WEB-INF中放置一个utils.tld文件:

<!DOCTYPE taglib PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.1//EN" "http://java.sun.com/j2ee/dtds/web-jsptaglibrary_1_1.dtd">
<taglib>
    <tlibversion>1.2</tlibversion>
    <jspversion>1.1</jspversion>
    <shortname>bean</shortname><uri>utilsTags</uri>
    <uri>utilsTags</uri>
    <tag>
        <name>escapeJS</name>
        <tagclass>view.EscapeJS</tagclass>
        <bodycontent>scriptless</bodycontent>
        <attribute>
            <name>str</name>
            <required>true</required>       
            <rtexprvalue>true</rtexprvalue> 
        </attribute>                
    </tag>      
</taglib>

1.2
1.1
海狸
utilsTags
逃逸
view.EscapeJS
无脚本
str
真的
真的
然后在jsp中:

<%@ taglib prefix="utils" uri="utilsTags" %>

<utils:escapeJS str="${application.firstName}"/>


将其作为O'brian存储在数据库中,但在显示它之前,请执行“查找-替换”以将任何“转换为\”

您可以定义一个新的EL函数,用于转义字符串

例如

在爪哇

public class MyStringUtil {
  public static String escapeJs( String str )
  {
    // escape the string (e.g. replace ' with \')
  }
}
在标记库描述符文件中:

<function>
 <name>escapeJs</name>
 <function-class>package.to.MyStringUtil</function-class>
 <function-signature>
   java.lang.String escapeJs( java.lang.String )
 </function-signature>
</function>

我想将该值存储为O'Brian,因为大多数时候我想将其显示为O'Brian而不是O'Brian更新的答案,看起来您需要在显示值之前在“to\”上找到replace。仅跳过撇号是不够的。您还应该转义反斜杠、
\n
\r
\“
。如果转义的字符串是用户可以控制的,那么它也会打开一个安全漏洞,因为可以使用类似
\';my\u script();
<%@ taglib prefix="utils" uri="utilsTags" %>

<utils:escapeJS str="${application.firstName}"/>
public class MyStringUtil {
  public static String escapeJs( String str )
  {
    // escape the string (e.g. replace ' with \')
  }
}
<function>
 <name>escapeJs</name>
 <function-class>package.to.MyStringUtil</function-class>
 <function-signature>
   java.lang.String escapeJs( java.lang.String )
 </function-signature>
</function>
<a href="#" 
  class="delete" 
  onclick="if(confirm('${foo:escapeJs(person.lastName)}' + _('Are you sure you want to delete this application?'))) {deleteApplication('${application.identifier}')};return false;"><bean:message key="application.delete"/></a>