当前位置: 首页 > 面试题库 >

确保在StringTemplate中转义HTML实体的最佳方法是什么

蔺沛
2023-03-14
问题内容

假设下面的字符串模板被赋予了Java Bean对象的列表:

<ul>$people:{p|<li>$p.name$ $p.email</li>}$</ul>

即人员列表中可能包含Person您可能无法或无法增强/扩展的对象:

class Person {
    ....
    public getName() { ... }
    public getEmail() { ... }
}

getName()getEmail()方法不返回消毒(编码的HTML实体)。您如何解决这个问题?


问题答案:

您可以使用自定义渲染器,例如:

public static class HtmlEscapeStringRenderer implements AttributeRenderer {
    public String toString(Object o, String s, Locale locale) {
        return (String) (s == null ? o : StringEscapeUtils.escapeHtml((String) o));
    }
}

然后在模板中指示您希望其转义:

$p.name;format="html"$

也就是说,您可能更喜欢清理输入的数据,在发送到模板之前进行转换,将经过装饰的人发送到模板等。

public class App {
    public static void main(String[] args) {
        STGroupDir group = new STGroupDir("src/main/resource", '$', '$');
        group.registerRenderer(String.class, new HtmlEscapeStringRenderer());

        ST st = group.getInstanceOf("people");
        st.add("people", Arrays.asList(
                new Person("<b>Dave</b>", "dave@ohai.com"),
                new Person("<b>Nick</b>", "nick@kthxbai.com")
        ));

        System.out.println(st.render());
    }

    public static class HtmlEscapeStringRenderer implements AttributeRenderer {
        public String toString(Object o, String s, Locale locale) {
            return (String) (s == null ? o : StringEscapeUtils.escapeHtml((String) o));
        }
    }
}

输出:

<ul><li>&lt;b&gt;Dave&lt;/b&gt; dave@ohai.com</li><li>&lt;b&gt;Nick&lt;/b&gt; nick@kthxbai.com</li></ul>


 类似资料:
  • 问题内容: cgi.escape似乎是一种可能的选择。它运作良好吗?有什么更好的东西吗? 问题答案: 很好 它逃脱了: 至 至 至 对于所有HTML而言,这就足够了。 编辑:如果您有非ASCII字符,您还想转义,以便包含在使用不同编码的另一个编码文档中,如 Craig 所说,只需使用: 不要忘了解码到第一,使用任何编码它编码的。 但是根据我的经验,如果您从头开始一直都在工作,那么这种编码是没有用的

  • 问题内容: 我正在寻找一种库/方法来解析比通用xml解析库具有更多html特定功能的html文件。 问题答案: 这是一个敏捷的HTML解析器,它构建了一个读/写DOM并支持纯XPATH或XSLT(您实际上不必了解XPATH或XSLT来使用它,不用担心…)。这是一个.NET代码库,可让您解析“网络外” HTML文件。该解析器对“真实世界”格式的HTML十分宽容。对象模型与提出System.Xml的对

  • 我有一个Android应用程序,我想实现一个功能,用户可以上传SVG,然后将SVG保存在firebase实时数据库中,然后其他用户可以看到它并与之交互,我选择SVG而不是常规照片或PNG的原因是因为它非常小,不会消耗存储或数据来加载, 加上它们具有多种显示密度和不同的屏幕比例更好,问题是我不知道这是否可行,如果它是我不知道它将被保存为的格式是什么,因为我有一个保存SVG路径的想法,但没有找到将其转

  • 问题内容: 我正在写一个Chrome扩展程序,包括做了 很多 以后的工作中:消毒的字符串 可能 包含HTML标签,通过转换,并以,和分别。 (换句话说,与PHP相同-我认为并不需要转换双引号字符。) 这是到目前为止我发现的最快的功能: 但是当我不得不一次性运行数千个字符串时,仍然存在很大的滞后。 任何人都可以对此进行改进吗?如果有所不同,则通常用于10到150个字符之间的字符串。 (我曾经想到的一

  • 问题内容: 我正在尝试在select语句中打印日期,但是我需要在输出中添加一个字母: Oracle不喜欢T。我只希望T像冒号和破折号一样输出。我可以用反斜杠或其他东西来逃脱吗? 问题答案: 您只需要在它周围加上双引号即可:

  • 我正在编写一个可序列化的类,它接受多个参数,包括一个函数: 存储在成员变量中,因此需要可序列化。如果分配给它们的类型是可序列化的,则Javalambda是可序列化的。如果使用lambda创建,那么确保在构造函数中传递的是可序列化的最佳方法是什么? > 创建一个可序列化函数,并使用该函数: 问题: 现在,