首页 > 解决方案 > 如何在 JSP 中将对象呈现为 HTML

问题描述

我有一个关于在我的应用程序中渲染对象的问题。

假设我有一个对象需要在应用程序的不同位置显示,但始终使用相同的模板。

如果我做这样的事情:


import java.math.BigDecimal;
import java.util.Arrays;
import java.util.List;

import static org.apache.commons.lang.StringEscapeUtils.escapeHtml;

public class RegulDeclarationPersoDTO {

    private static final List<String> TYPES_RETRAIT = Arrays.asList(
            "TYPE_REGUL#1",
            "TYPE_REGUL#2",
            "TYPE_REGUL_AC#3",
            "TYPE_REGUL_AC#4",
            "TYPE_REGUL_AC#5");

    private static final String BG_COLOR_RETRAIT = "#FF6347";
    private static final String BG_COLOR_DEPASSSEMENT = "#FFB431";

    private Integer id;
    private BigDecimal horaire;
    private BigDecimal horaireReel;
    private Integer declId;
    private String commentaire;
    private Integer histoId;
    private ValeursDTO declaration;
    private String type;
    private String render;

    public String getRender() {
        render = String.format(
                "<tr>" +
                "<td><i class='fa fa-circle' style='color: %s'></i></td>" +
                "<td style='text-align: center'> %s h </td>" +
                "<td style='text-align: center'> %s h </td>" +
                "<td style='text-align: right'> %s </td>" +
                "</tr>",
                TYPES_RETRAIT.contains(type) ? BG_COLOR_RETRAIT : BG_COLOR_DEPASSSEMENT,
                horaire.stripTrailingZeros(),
                horaire.stripTrailingZeros(),
                escapeHtml(commentaire)
        );
        return render;
    }
}

从我的 JSP 中,我可以这样做以将我的对象呈现到表中:

${myObject.render}

我简化了案例,但在更复杂的情况下,我需要在 JSP 中添加一些业务逻辑,这是一个好方法吗?

标签: htmljspstruts2el

解决方案


这样不好。DTO 是一个数据对象,它应该只包含数据。要渲染 html 表格,您应该使用 JSP 标记,如果您想在渲染文档时创建表格,则应使用 javascript。

${myObject.render}

JSP 中的 EL 输出很危险,因为它不会转义 XSS 符号。在 Struts2 中,所有 UI 标记都会转义 HTML 文本。您应该使用它们来呈现应该转义的文本。


推荐阅读