복붙노트

[SPRING] 재귀 thymeleaf 사용하여 메뉴를 렌더링하는 방법

SPRING

재귀 thymeleaf 사용하여 메뉴를 렌더링하는 방법

나는 UL / 리튬 목록을 사용하여 HTML 메뉴를 렌더링하고 싶습니다. 나는이 클래스 구조를 가지고있다 :

public class MenuItem {

    private String name;

    private MenuItem parent;

    private List<MenuItem> children;

    public MenuItem(String name,List<MenuItem> children) {
        this.name = name;
        this.children = children;
        for (MenuItem child : children) {
            child.parent = this;
        }
    }

    public MenuItem(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }

    public MenuItem getParent() {
        return parent;
    }

    public List<MenuItem> getChildren() {
        return children;
    }
} 

당신이 볼 수 있듯이 그것은 일반적인 트리 구조는 하나 개의 루트 요소는 자식에 대한 참조를 포함하고 등등 그들의 참조하고 있고,입니다.

지금은이 같은 구조를 렌더링하는 사랑 :

<ul>
    <li>Item 1
        <ul>
            <li>Item 1.1</li>
            <li>Item 1.2
                <ul>
                    <li>Item 1.2.1</li>
                    <li>Item 1.2.3</li>
                </ul>
            </li>
            <li>Item 1.3</li>
        </ul>
    </li>
    <li>Item 2</li>
</ul>

나는 thymeleaf에 어떻게 그렇게 할 수 있습니까? 나는 타일, 레이아웃 또는 다른 어떤 같은 다른 기술을 사용하는 경우 쉽게입니다.

편집 : 매개 변수가 대체하지만 운 / 포함했습니다. 통과 매개 변수 문자열로 변환하고, 재귀의 또 다른 수준에 사용할 수 없습니다. https://github.com/ultraq/thymeleaf-layout-dialect/issues/12 참조

대단히 감사합니다,

솔직한

해결법

  1. ==============================

    1.이 시도:

    이 시도:

    menuFragment.html로 하나의 메뉴 항목에 대한 조각 만들기

    <html>
        <section layout:fragment="menu">
            <ul>
                <li th:each="menuItem : ${menuItemsList}" th:text="${menuItem.name}">
                    <section layout:include="@{path/to/folder/menuFragment} :: menu" th:with="menuItemsList=${menuItem.children}"></section>
                </li>
            </ul> 
        </section>
    </html>
    

    메뉴 파일의 조각 등을 포함

    <section layout:include="@{path/to/folder/menuFragment} :: menu" th:with="menuItemsList=${rootMenuItemAsList}"></section>
    

    rootMenuItemAsList은 상위 메뉴 목록입니다

    이 도움말 당신은 것입니다 희망

  2. ==============================

    2.나는 이것을 시도하고 선 나에게 보인다

    나는 이것을 시도하고 선 나에게 보인다

        <li th:each="menuItem : ${menuItemsList}" th:text="${menuItem.name}">
            <section layout:include="@{path/to/folder/menuFragment} :: menu" th:with="menuItemsList=${menuItem.children}"></section>
    

    텍스트 속성 정확하게는 않습니다 : 리 블록 내부의 내용을 덮어 일이 있기 때문에 - (가) (태그 리 안에)를 포함 덮어 쓰게됩니다.

    나는이 다음과 같은 작업을 할 수있어 :

        <li th:each="menuItem : ${menuItemsList}">
            <span  th:text="${menuItem.name}">prototype text...</span>
            <section layout:include="@{path/to/folder/menuFragment} :: menu" th:with="menuItemsList=${menuItem.children}"></section>
        </li>
    

    도움이 되었기를 바랍니다...

  3. ==============================

    3.내 주에서 나는 다음과 같습니다 :

    내 주에서 나는 다음과 같습니다 :

    <section th:include="@{categoryFragment} :: category" th:with="maincategories=${categories}"></section>
    

    그리고 조각으로 내가 사용 :

    <section th:fragment="category">
        <ul>
            <li th:each="cat : ${maincategories}">
                <span th:text="${cat.categoryName}">Main Cat</span>
                <section th:include="@{categoryFragment} :: category" th:with="maincategories=${cat.getChildren()}"></section>
            </li>
        </ul>
    </section>
    

    이것은 나를 위해 절대적으로 잘 작동합니다.

  4. from https://stackoverflow.com/questions/25032838/how-to-render-menu-using-thymeleaf-recursively by cc-by-sa and MIT license