如何在JSTL / EL中连接和清理字符串?

时间:2012-02-08 17:12:06

标签: string jsp jstl el

我有一组复杂的嵌套函数,基本上可以清理数据。

让我假装我想要发出一个已被清理的名字 - 姓氏组合,但这些名称是两个独立的变量。

我意识到我可以简单地单独发出每个变量,将每个变量包装在整个清理函数集中,但这既不优雅又危险:大块难以阅读,重复的代码需要保持同步应用程序的生命周期。

在真实语言中,我会写这样的东西:

${fn:trim(fn:replace(fn:replace(fn:replace(fn:replace(firstname + lastname, ..., ...), ..., ...), ..., ...), ..., ...))}

(这里,加号表示真蓝色连接运算符; javascript为'+',PHP为'。'等。)

使用单独的语句来预先连接变量似乎也是荒谬的。

结论:这个问题已在互联网上被问过一千次,但所有答案都有效地通过提出另一种实施方式来避免这个问题。我想知道这个功能是否存在,而且文档更糟糕。

请结束我的痛苦并给我一个直接的答案。

1 个答案:

答案 0 :(得分:22)

您究竟想要消毒什么? HTML / XML特殊字符,如<>等,以防止XSS漏洞?如果是这样,为什么不使用<c:out>

<c:out value="${firstname} ${lastname}" />

如果真的有更多内容,那么最干净的方法是将该作业重构为public static实用程序方法,将其注册为EL函数并调用它。

E.g。

public final class Functions {

    private Functions() {
        // Hide c'tor in utility classes.
    }

    public static String sanitizeNames(String firstname, String lastname) {
        // TODO: Implement.

        return sanitizedFirstname + sanitizedLastname;
    }

}

/WEB-INF/functions.tld文件中注册如下

<?xml version="1.0" encoding="UTF-8" ?>
<taglib 
    xmlns="http://java.sun.com/xml/ns/javaee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-jsptaglibrary_2_1.xsd"
    version="2.1">

    <display-name>Custom Functions</display-name>    
    <tlib-version>1.0</tlib-version>
    <uri>http://example.com/functions</uri>

    <function>
        <name>sanitizeNames</name>
        <function-class>com.example.Functions</function-class>
        <function-signature>java.lang.String sanitizeNames(java.lang.String, java.lang.String)</function-signature>
    </function>
</taglib>

并使用如下

<%@taglib uri="http://example.com/functions" prefix="f" %>
...
${f:sanitizeNames(firstname, lastname)}