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

Tom*_*Tom 6 string jsp jstl el

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

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

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

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

${fn:trim(fn:replace(fn:replace(fn:replace(fn:replace(firstname + lastname, ..., ...), ..., ...), ..., ...), ..., ...))}
Run Code Online (Sandbox Code Playgroud)

(这里,加号代表一个真正的蓝色连接运算符; javascript的'+',PHP的'.'等等)

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

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

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

Bal*_*usC 22

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

<c:out value="${firstname} ${lastname}" />
Run Code Online (Sandbox Code Playgroud)

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

例如

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;
    }

}
Run Code Online (Sandbox Code Playgroud)

/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>
Run Code Online (Sandbox Code Playgroud)

并按如下方式使用

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