我有一组复杂的嵌套函数,基本上可以清理数据。
让我假装我想要发出一个已被清理的名字 - 姓氏组合,但这些名称是两个独立的变量。
我意识到我可以简单地单独发出每个变量,将每个变量包装在整个清理函数集中,但这既不优雅又危险:大块难以阅读,重复的代码需要保持同步应用程序的生命周期。
在真实语言中,我会写这样的东西:
${fn:trim(fn:replace(fn:replace(fn:replace(fn:replace(firstname + lastname, ..., ...), ..., ...), ..., ...), ..., ...))}
(这里,加号表示真蓝色连接运算符; javascript为'+',PHP为'。'等。)
使用单独的语句来预先连接变量似乎也是荒谬的。
结论:这个问题已在互联网上被问过一千次,但所有答案都有效地通过提出另一种实施方式来避免这个问题。我想知道这个功能是否存在,而且文档更糟糕。
请结束我的痛苦并给我一个直接的答案。
答案 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)}