likes
comments
collection
share

SpringBoot中使用thymeleaf渲染html模板

作者站长头像
站长
· 阅读数 9

有时候我们会遇到这样的一个需求: 通过前端传入的数据渲染一个现成的打印模板出来,最后返回一个html格式的文本给前端,模板是有一个现成的,但是每次传入进来的数据是不同的,所以需要后端经过渲染出来返回渲染好的html内容给前端,这个时候我们就可以用thymeleaf来实现这个功能。 我们先建造一个模板:

打印模板是一个用于展示数据的HTML页面。在这个模板中,我们定义了样式和HTML标签,并使用了Thymeleaf的语法来动态填充数据。这个模板的目的是为了能够通过数据渲染出完整的打印内容。

<div id="print_main_full_box">
    <style>
      #print_main_full_box {
        width: 100%;
      }

      #print_main_full_box > * {
        margin: 0;
        padding: 0;
      }

      #print_main_full_box > table, td, th {
        margin: 0;
        padding: 0;
        border: 1px solid black;
        border-collapse: collapse
      }

      .yiban {
        width: 49%;
        text-align: left;
        display: inline-block;
        /*border-left: 1px solid black;*/
      }

      .jiachu {
        font-weight:bold;
      }

      td {
        font-size: 14px;
      }

      .center {
        text-align: center;
      }

    </style>
    <table width="100%">
      <tbody>
      <tr class="jiachu">
        <td colspan="8" class="center" style="font-size: 16px">
          <div th:text = ${company}>公司</div>
          <div th:text = ${title}>出货单</div>
        </td>
      </tr>
      <tr>
        <td colspan="8" class="center">
          <span th:text = ${address}>地址</span>
        </td>
      </tr>
      <tr>
        <td colspan="8">
          <div class="yiban">
            <span class="jiachu">客户名称:<span th:text = ${cursumerName}>客户名称</span></span>
          </div>
          <div class="yiban">
            <span class="jiachu">订单号:</span><span th:text = ${orderNo}>订单号</span>
          </div>
        </td>
      </tr>
      <tr>
        <td colspan="8">
          <div class="yiban">
            <span class="jiachu">送货地址:<span th:text = ${deliveryAddr}>送货地址</span></span>
          </div>
          <div class="yiban">
            <span class="jiachu">送货日期:</span><span th:text = ${actualDeliveryDate}>送货日期</span>
          </div>
        </td>
      </tr>
      <tr>
        <td colspan="8">
          <div class="yiban">
            <span class="jiachu">联系电话:<span th:text = ${phone}>联系电话</span></span>
          </div>
          <div class="yiban">
            <span class="jiachu">送货单号:</span><span th:text = ${invoiceNo}>送货单号</span>
          </div>
        </td>
      </tr>
      <tr class="center">
        <td colspan="8" class="jiachu">
          <div>机器名称:<span th:text = ${machineName}></span></div>
        </td>
      </tr>
      <tr class="jiachu">
        <td width="5%" align="center">序号</td>
        <td width="5%" align="center">内部序号</td>
        <td width="25%" align="center">图号</td>
        <td width="5%" align="center">单位</td>
        <td width="5%" align="center">数量</td>
        <td width="5%" align="center">单价</td>
        <td width="5%" align="center">总价</td>
        <td width="10%" align="center">备注</td>
      </tr>
      <tr th:each = "prod : ${prods}" data-line="5">
        <td align="center"><div data-item-index style="overflow: hidden;max-height: 40px;line-height: 20px;">序号</div></td>
        <td align="center"><div th:text = ${prod.selfNumber} style="overflow: hidden;max-height: 40px;line-height: 20px;">内部序号</div></td>
        <td align="center"><div th:text = ${prod.chartNo} style="overflow: hidden;max-height: 40px;line-height: 20px;">图号</div></td>
        <td align="center"><div th:text = ${prod.company} style="overflow: hidden;max-height: 40px;line-height: 20px;">单位</div></td>
        <td align="center"><div th:text = ${prod.invoiceNumber} style="overflow: hidden;max-height: 40px;line-height: 20px;">数量</div></td>
        <td align="center"><div th:text = ${prod.unitPrice} style="overflow: hidden;max-height: 40px;line-height: 20px;">单价</div></td>
        <td align="center"><div th:text = ${prod.totalPrice} style="overflow: hidden;max-height: 40px;line-height: 20px;">总价</div></td>
        <td align="center"><div th:text = ${prod.remarks} style="overflow: hidden;max-height: 40px;line-height: 20px;">哦呵呵</div></td>
      </tr>

      <tr>
        <td colspan="4" align="right">总计:</td>
        <td align="right"><span th:text = ${invoiceNumber}>3</span></td>
        <td align="right"></td>
        <td align="right"><span th:text = ${totalPrice}>3</span></td>
        <td align="right"></td>
      </tr>
      <tr>
        <td colspan="4">送货单位签章:</td>
        <td colspan="4">收货单位签章:</td>
      </tr>
      </tbody>
    </table>
  </div>

Thymeleaf是一个服务器端Java模板引擎,用于处理HTML、XML、JavaScript、CSS等文件。在这个例子中,我们使用Thymeleaf来填充我们的打印模板。通过在HTML标签上加上Thymeleaf的属性,我们可以将数据绑定到HTML标签上。

这个里面是一个含有thymeleaf语法的模板,现在我们要通过传入的参数不同渲染出不一样的数据出来。

例如前端传入这样的数据:

{
    "company":"csdner",
    "title":"出货单",
    "address":"中国",
    "cursumerName":"客户",
    "orderNo":"2432523234234234",
    "deliveryAddr":"工业园",
    "actualDeliveryDate":"20210526",
    "phone":"18888888888",
    "invoiceNo":"1567894",
    "machineName":"25661615",
    "prods":[
        {
            "selfNumber":"5555",
            "chartNo":"6666",
            "company":"csdner",
            "invoiceNumber":"2222",
            "unitPrice":"55",
            "totalPrice":"555",
            "remarks":"哈哈哈哈"
        }
    ],
    "invoiceNumber":"22",
    "totalPrice":"102"
}

后端要渲染出渲染好之后的html文档给前端:

<div id="print_main_full_box">
    <style>
      #print_main_full_box {
        width: 100%;
      }

      #print_main_full_box > * {
        margin: 0;
        padding: 0;
      }

      #print_main_full_box > table, td, th {
        margin: 0;
        padding: 0;
        border: 1px solid black;
        border-collapse: collapse
      }

      .yiban {
        width: 49%;
        text-align: left;
        display: inline-block;
        /*border-left: 1px solid black;*/
      }

      .jiachu {
        font-weight:bold;
      }

      td {
        font-size: 14px;
      }

      .center {
        text-align: center;
      }

    </style>
    <table width="100%">
      <tbody>
      <tr class="jiachu">
        <td colspan="8" class="center" style="font-size: 16px">
          <div>csdner</div>
          <div>出货单</div>
        </td>
      </tr>
      <tr>
        <td colspan="8" class="center">
          <span>中国</span>
        </td>
      </tr>
      <tr>
        <td colspan="8">
          <div class="yiban">
            <span class="jiachu">客户名称:<span>客户</span></span>
          </div>
          <div class="yiban">
            <span class="jiachu">订单号:</span><span>2432523234234234</span>
          </div>
        </td>
      </tr>
      <tr>
        <td colspan="8">
          <div class="yiban">
            <span class="jiachu">送货地址:<span>工业园</span></span>
          </div>
          <div class="yiban">
            <span class="jiachu">送货日期:</span><span>20210526</span>
          </div>
        </td>
      </tr>
      <tr>
        <td colspan="8">
          <div class="yiban">
            <span class="jiachu">联系电话:<span>18888888888</span></span>
          </div>
          <div class="yiban">
            <span class="jiachu">送货单号:</span><span>1567894</span>
          </div>
        </td>
      </tr>
      <tr class="center">
        <td colspan="8" class="jiachu">
          <div>机器名称:<span>25661615</span></div>
        </td>
      </tr>
      <tr class="jiachu">
        <td width="5%" align="center">序号</td>
        <td width="5%" align="center">内部序号</td>
        <td width="25%" align="center">图号</td>
        <td width="5%" align="center">单位</td>
        <td width="5%" align="center">数量</td>
        <td width="5%" align="center">单价</td>
        <td width="5%" align="center">总价</td>
        <td width="10%" align="center">备注</td>
      </tr>
      <tr data-line="5">
        <td align="center"><div data-item-index style="overflow: hidden;max-height: 40px;line-height: 20px;">序号</div></td>
        <td align="center"><div style="overflow: hidden;max-height: 40px;line-height: 20px;">5555</div></td>
        <td align="center"><div style="overflow: hidden;max-height: 40px;line-height: 20px;">6666</div></td>
        <td align="center"><div style="overflow: hidden;max-height: 40px;line-height: 20px;">csdner</div></td>
        <td align="center"><div style="overflow: hidden;max-height: 40px;line-height: 20px;">2222</div></td>
        <td align="center"><div style="overflow: hidden;max-height: 40px;line-height: 20px;">55</div></td>
        <td align="center"><div style="overflow: hidden;max-height: 40px;line-height: 20px;">555</div></td>
        <td align="center"><div style="overflow: hidden;max-height: 40px;line-height: 20px;">哈哈哈哈</div></td>
      </tr>

      <tr>
        <td colspan="4" align="right">总计:</td>
        <td align="right"><span>22</span></td>
        <td align="right"></td>
        <td align="right"><span>102</span></td>
        <td align="right"></td>
      </tr>
      <tr>
        <td colspan="4">送货单位签章:</td>
        <td colspan="4">收货单位签章:</td>
      </tr>
   
      </tbody>
    </table>
  </div>

好了,需求说完,开始实战:

第一步,我们是需要一个thymeleaf的模板,让在项目中引入一个工具类:

添加依赖:

 <!-- Thymeleaf 模板引擎 -->
        <dependency>
            <groupId>org.thymeleaf</groupId>
            <artifactId>thymeleaf</artifactId>
            <version>3.0.9.RELEASE</version>
        </dependency>
  		<dependency>
            <groupId>ognl</groupId>
            <artifactId>ognl</artifactId>
            <version>3.1.12</version>
        </dependency>

第二步,创建一个工具类:

public class HTMLTemplateUtils {

    private final static TemplateEngine templateEngine = new TemplateEngine();

    /**
     * 使用 Thymeleaf 渲染 HTML
     * @param template  HTML模板
     * @param params 参数
     * @return  渲染后的HTML
     */
    public static String render(String template, Map<String, Object> params){
        Context context = new Context();
        context.setVariables(params);
        return templateEngine.process(template, context);
    }

}

第三步:传入参数:

 String output = HTMLTemplateUtils.render(content, map);

content为模板,map为前端传入的json数据

第四步,返回output,这个时候output就是我们已经渲染好的模板了

当我们填充完数据后,我们需要将渲染好的HTML返回给前端。在Java中,我们可以将HTML页面渲染成字符串,并将其作为响应返回给前端。前端可以通过解析这个字符串来生成真正的HTML页面,或者将其用于打印等操作。

这篇文章介绍了如何使用Thymeleaf模板引擎来生成HTML文本,以满足在前端渲染一个现成的打印模板的需求。文章首先给出了一个打印模板的HTML代码示例,其中包含了一些静态的文本和一些需要通过变量来动态渲染的部分。然后,文章介绍了如何使用Thymeleaf来渲染HTML模板,从而生成需要的HTML文本,其中包括了如何引入Thymeleaf依赖、如何配置Thymeleaf模板引擎、如何在HTML代码中使用Thymeleaf语法来绑定变量值等等。最后,文章通过一个具体的Java代码示例,演示了如何使用Thymeleaf来渲染上述的HTML模板,将变量值绑定到模板中,并生成HTML文本并返回给前端。