当前位置: 首页 > 知识库问答 >
问题:

Tymeleaf渲染

邹玮
2023-03-14
<c:set var="size" value="0" />
<c:forEach items="${fields}" var="field" varStatus="status">

    <c:if="${status.first}">
        <div class="row">
    </c:if>

    <c:set var="size" value="${size + field.size}" />
    <c:if="${size > 12}">
        </div>
        <div class="row">
        <c:set var="size" value="${field.size}" />
    </c:if>

    <jsp:include page="/WEB-INF/jsp/field.jsp" >
        <jsp:param name="field" value="${field}"/>
    </jsp:include>  

    <c:if="${status.last}">
        </div>
    </c:if>

</c:forEach>
<div class="row">
  <div class="span6">
     <input />
  <div>
  <div class="span3">
     <input />
   <div>
</div>
<div class="row">
  <div class="span8">
     <input />
  <div>
  <div class="span4">
     <input />
   <div>
</div>
<th:block th:with="size=0">
    <th:block th:each="field, iterStat : ${fields}">
        <th:block if="${iterStat.index == 0}">  
            <div class="row">
        </th:block> 
            <th:block if="${iterStat.index == (#lists.size(${fields}) - 1)}">   
            </div>
        </th:block>
    </th:block> 
</th:block> 

thymeleaf无法呈现它,因为div标记 未在其启动的 中关闭。有没有办法把上面的jsp代码转换成thymeleaf。

我正在使用thymeleaf 2.0.17和spring3

共有1个答案

亢建木
2023-03-14

如果我是您,我将使用以下代码,这将实现关注点的分离,也将实现您正在尝试的功能:

首先创建一个类,它负责根据大小列表创建子列表。为了便于使用这个带有Thymeleaf的类,我们可以使这个类成为Spring bean。下面是一段简单的代码,可以完成这项工作:

@Component
public class BoostrapUtility {

   public List<List<Integer>> createSubLists(Collection<Integer> sizeList) {
        final List<List<Integer>> results = new ArrayList<>();

        final int maxSize = 12;
        int rowSize = 0;
        List<Integer> subList = new ArrayList<>();
        for (Integer size : sizeList) {
            if(rowSize + size <= maxSize) {
                subList.add(size);
                rowSize += size;
            }
            else {
                results.add(subList);
                subList = new ArrayList<>();
                subList.add(size);
                rowSize = size;
            }
        }
        if(!subList.isEmpty()) {
            results.add(subList);
        }

        return results;
   }
}

那么您的Thymeleaf代码将如下所示:

<div class="row" th:each="subLists : ${@boostrapUtility.createSubLists(${fields})}">
   <div th:class="span+${field}" th:each="field : ${subLists}">
     <!-- whatever in here -->
   </div>
</div>
 类似资料:
  • 正如我从thymeleaf文档中了解到的那样,我尝试了:

  • 这是我的html表单: 这是DTO 这里的日期是 此外,当我导入一个JSON文件时,我有一个用户数组,我能够成功地运行它。 我错过了什么? 注意:java.util.date起作用!

  • 图片

  • 在 Hexo 中,有两个方法可用于渲染文件或字符串,分别是非同步的 hexo.render.render 和同步的 hexo.render.renderSync,这两个方法的使用方式十分类似,因此以下仅以非同步的 hexo.render.render 为例。 渲染字符串 在渲染字符串时,您必须指定 engine,如此一来 Hexo 才知道该使用哪个渲染引擎来渲染。 hexo.render.rend

  • 6.1 渲染模板 一旦你拥有一个模版文件,你可以通过给一个map来给它传递数据。 map是一个变量及赋予的值的集合,模板使用它来得到变量的值,或者对于块标签求值。 它的渲染函数有一个可选的变量键值对map 通过 ctx.Render() 方法来渲染模板,例如: func (r *Render) Serve(ctx *faygo.Context) error { return ctx.Ren

  • 渲染 REST framework 包含许多内置的渲染器类,允许您使用各种 media type 返回响应。同时也支持自定义渲染器。 如何确定使用哪个渲染器 视图的渲染器集合始终被定义为类列表。当调用视图时,REST framework 将对请求内容进行分析,并确定最合适的渲染器以满足请求。内容分析的基本过程包括检查请求的 Accept header,以确定它在响应中期望的 media type。