Как объединить и очистить строки в JSTL / EL? - PullRequest
6 голосов
/ 08 февраля 2012

У меня сложный набор вложенных функций, которые по существу очищают данные.

Давайте представим, что я хочу создать очищенную комбинацию имени-фамилии, но имена представлены в виде двух отдельных переменных.

Я понимаю, что мог бы просто выдавать каждую переменную по отдельности, оборачивая каждую во весь набор дезинфицирующих функций, но это одновременно и не элегантно, и опасно: большие куски трудно читаемого, дублирующего кода, который необходимо синхронизировать время жизни приложения.

На реальном языке я бы написал что-то вроде этого:

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

(Здесь знак плюс представляет оператор конкатенации синего цвета; javascript '+', PHP ''. 'И т. Д.)

Также кажется абсурдным использование отдельного оператора для простого объединения переменных заранее.

Итог: этот вопрос задавался тысячу раз в Интернете, но все ответы эффективно уклоняются от вопроса, предлагая альтернативную реализацию. Я хочу знать, существует ли эта функция, и документация хуже, чем тривиальная.

Пожалуйста, прекратите мои страдания и дайте мне прямой ответ.

1 Ответ

22 голосов
/ 09 февраля 2012

Что именно вы хотите продезинфицировать? Специальные символы HTML / XML, такие как <, > и т. Д., Чтобы предотвратить дыры в XSS? Если так, то почему бы просто не использовать <c:out>?

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

Если на самом деле есть что-то еще, самым чистым было бы преобразовать это задание в служебный метод public static, зарегистрировать его как функцию EL и вызвать его.

1010 * Е.Г. *

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)}
...