spring mvC语言 将一个值与Thymeleaf的前一个迭代中的值进行比较



使用Thymeleaf,我想通过关闭以前的<ul>并创建一个新的子列表来呈现DB查询的结果,每当"菜单"或"子菜单"值相对于以前的迭代发生变化时。例如,我想转换以下查询结果…

----------------------------------
| Menu      | SubMenu  | Title   |
|--------------------------------|
| MenuName1 | SubMenu1 | Title1  |
| MenuName1 | SubMenu1 | Title2  |
| MenuName1 | SubMenu2 | Title3  |
| MenuName2 | SubMenu3 | Title4  |
| MenuName3 | SubMenu4 | Title5  |
----------------------------------

…放入无序列表中,如下所示(用于菜单):

<ul>
  <li>MenuName1
    <ul>
      <li>SubMenu1
        <ul>
          <li>Title1</li>
          <li>Title2</li>
        </ul>
      </li>
      <li>SubMenu2
        <ul>
          <li>Title3</li>
        </ul>
      </li>
    </ul>
  </li>
  <li>MenuName2
    <ul>
      <li>SubMenu3
        <ul>
          <li>Title4</li>
        </ul>
      </li>
    </ul>
  </li>
  <li>MenuName3
    <ul>
      <li>SubMenu4
        <ul>
          <li>Title5</li>
        </ul>
      </li>
    </ul>
  </li>
</ul>

我可以访问服务器和客户端代码,所以我很高兴为模板提供一个更友好的格式,如果这是一个更优雅的解决方案。

必须在服务器端将数据转换为正确的格式。

在您的示例中,您将为MenuSubmenu创建类:

  • 你的主类有一个LinkedHashMap<String, Menu>,将菜单标题映射到菜单
  • Menu有一个LinkedHashMap<String, Submenu>,它将子菜单标题映射到子菜单
  • SubmenuArticle s列表

然后您的Java代码遍历Article列表,并基于Articlemenusubmenu属性动态创建MenuSubmenu实例,然后将Article添加到正确的Submenu。这可能是有帮助的方法Menu getOrCreateMenu(String title)在你的主类和Submenu getOrCreateSubmenu(String title)在你的Menu类来处理创建一个新的(子)菜单的逻辑,如果一个给定的标题还不存在,或返回一个现有的如果一个(看看Map.computeIfAbsent可以做到这一点非常简洁)。

然后将整个菜单列表放入一个模型并将其发送给Thymeleaf;然后呈现应该是微不足道的:

<ul>
  <li th:each="menu : ${menus}" th:text="${menu.title}>
    <ul>
      <li th:teach="submenu : ${menu.submenus}" th:text=${submenu.title}>
        <ul>
          <li th:each="article : ${submenu.articles}" th:text="${article.title}" />
        </ul>
      </li>
    </ul>
  </li>
</ul>

最新更新