1. 程式人生 > >java freemarker遍歷樹形選單(導航欄選單)

java freemarker遍歷樹形選單(導航欄選單)

最近在寫框架,到了模板對樹形的處理,從後臺到前端有必要把整個過程記錄下來

freemarker是一套模板引擎,主要用於資料的展示,你能看到這篇文章相信你對freemarker有所瞭解。

首先看我們的選單(樹形)資料結構

程式碼生成:

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

public class SysMenu implements Serializable {
    private String id;
    /**選單名稱*/
    private String name;
    /**父選單*/
    private String pId;
    /**請求地址*/
    private String url;
    /**排序序號*/
    private Integer orderNum;
    /**圖示*/
    private String ico;
    //child
    private List<SysMenu> children=new ArrayList<SysMenu>();

    //省略get set...

    public SysMenu(String name, String url) {
        this.name = name;
        this.url = url;
    }

    
    public void addChild(SysMenu sysMenu){
        children.add(sysMenu);
    }

   
}
這裡json用的阿里的fastjson

public JSONArray getMenu(){
    SysMenu root=new SysMenu("系統管理","url");
    SysMenu root1=new SysMenu("其他管理","url");
    SysMenu m1=new SysMenu("使用者管理","user/ShowUser");
    SysMenu m2=new SysMenu("角色管理","user/ShowUser");
    SysMenu m3=new SysMenu("許可權管理","user/ShowUser");
    SysMenu m4=new SysMenu("使用者列表","user/ShowUser");
    SysMenu m5=new SysMenu("會員管理","user/ShowUser");
    SysMenu m6=new SysMenu("VIP管理","user/ShowUser");
    SysMenu m7=new SysMenu("VIP管理1","user/ShowUser");
    m6.addChild(m7);
    m3.addChild(m5);
    m3.addChild(m6);
    root.addChild(m1);
    root.addChild(m2);
    root.addChild(m3);
    root1.addChild(m4);
    JSONArray json=new JSONArray();
    json.add(root);
    json.add(root1);
    System.out.println(json);
    return json;
  }
print:
[
    {
        "children": [
            {  "children": [],"name": "使用者管理", "url": "user/ShowUser"  },
            { "children": [], "name": "角色管理","url": "user/ShowUser" },
            {"children": [
                    {"children": [], "name": "會員管理","url": "user/ShowUser" },
                    { "children": [  { "children": [], "name": "VIP管理1", "url": "user/ShowUser" } ],
                        "name": "VIP管理","url": "user/ShowUser" }
                ],
                "name": "許可權管理", "url": "user/ShowUser" }
        ],
        "name": "系統管理", "url": "url"  },
    { "children": [ {"children": [], "name": "使用者列表",  "url": "user/ShowUser"}
        ],
        "name": "其他管理", "url": "url" }
]

好的 我們用java模擬下資料的展示:
public void jxJson(JSONArray ja,int x,int end){
    if(x==0){
      System.out.println("begin");
    }
    String str=" ";
    x++;
    for(int k=0;k<x;k++){
      str+=str;
    }
     for(int i=0;i<ja.size();i++){
      SysMenu menu= (SysMenu) ja.get(i);
      if(menu.getChildren().size()>0){
        System.out.println(str+menu.getName()+"-----------"+x+"級選單");
        JSONArray js=new JSONArray();
          for(int j=0;j<menu.getChildren().size();j++){
            js.add(menu.getChildren().get(j));
          }
        jxJson(js,x,end);
      }else{
        System.out.println(str+x+"級子選單-----------"+menu.getName());
      }
     }

  }

  @Test
  public void test(){
    jxJson(getMenu(),0,getMenu().size());
    System.out.println("結束");
  }

print:
begin
  系統管理-----------1級選單
    2級子選單-----------使用者管理
    2級子選單-----------角色管理
    許可權管理-----------2級選單
        3級子選單-----------會員管理
        VIP管理-----------3級選單
                4級子選單-----------VIP管理1
  其他管理-----------1級選單
    2級子選單-----------使用者列表
結束
對 這就我們想要的無限級資料許可權,我們用freemarker實現的話依舊要根據遞迴實現資料展示,那麼就要用到freemarker的巨集來實現,對巨集不瞭解的可以看看這邊博文介紹:

下面是實現程式碼:

<#macro tree data start end>
   <#if (start=="start")>
<div class="left-nav">
    <div id="side-nav">
    <ul id="nav">
    </#if>
<#list data as child>
        <#if child.children?size gt 0>
<li><a href="javascript:;">
                <i class="iconfont">&#xe6b8;</i><cite>${child.name}</cite><i class="iconfont nav_right">&#xe697;</i></a><ul class="sub-menu">
              <@tree data=child.children start="" end=""/>
</ul>
              </li>
               <#else>
<li>
              <a _href="order-list.html">
                <i class="iconfont">&#xe697;</i>
                <cite>${child.name}</cite>
              </a>
            </li>
          </#if>
      </#list>
  <#if (end=="end")>
</ul>
  </div></div>
  </#if>
</#macro>
<@tree data=menu start="start" end="end"/>
定義巨集:<#macro(關鍵字) tree(巨集的名稱) 後面全是變量了 start end>
<@tree(呼叫巨集) data=menu(menu為後臺返回的json資料,格式為上面json資料) start(開始時候div引入) end(結束時候div引入)
慢慢體會其實很容易。
前端展示效果如下:

後端請求程式碼就是對上面方法的呼叫:

@GetMapping(value = "test")
  public String test(Model model){
    model.addAttribute("menu",getMenu());
    return "ftl/test";
  }


相關推薦

java freemarker樹形選單(導航選單)

最近在寫框架,到了模板對樹形的處理,從後臺到前端有必要把整個過程記錄下來 freemarker是一套模板引擎,主要用於資料的展示,你能看到這篇文章相信你對freemarker有所瞭解。 首先看我們的選單(樹形)資料結構 程式碼生成: import java.io.Ser

java實現樹形選單方法——設計思路【含原始碼】

開發工具:MyEclipse 10後臺框架:Hibernate + Struts2 資料庫:Oracle 11g前臺框架:EasyUi瀏覽器:谷歌       在開發中我們經常會遇到左邊是樹形選單,右邊

java實現樹形選單方法——TreeAction實現

/** * @Title: TreeAction.java * @Package org.web * @Description: TODO該方法的主要作用: * @author A18ccms

Java實現N級樹形目錄結構

   最近挺忙,一直在做專案,然後有個樹形目錄結構需要返回給前端,這裡給大家說一下實現的思路。    具體達到的效果類似:       一級目錄A:         二級目錄A:           三級目錄:             四級目錄:               檔案.txt    

java實現檔案目錄,並在控制檯以樹形結構展示

package www.tree.cn; import java.io.File; /** * @Author:DAVEZJ * @Date: Created in 18:07 2018/10/27 * @E-Mail: * 一個用java遍歷檔案目錄,並且在控制

java 遞迴樹形結構

//選單樹形結構 public JSONArray treeMenuList(JSONArray menuList, int parentId) { JSONArray childMenu = new JSONArray(); f

java屬性位及值

轉自: http://bbs.csdn.net/topics/320176897 示例程式碼如下: package test; import java.lang.reflect.Field; interface IEntity{ } class Entity

java map

map 需要 既然 values 知識 關於 println bsp data- 版權聲明:本文為博主原創文章,未經博主允許不得轉載。 在Java中如何遍歷Map對象 How to Iterate Over a Map in Java 在java中遍歷Map有不少的方法

Java集合引發的"血案"

java 集合 遍歷 問題一、List集合叠代方式遍歷一 <1>、可能出現的問題一:出現並發修改異常(ConcurrentModificationException)import java.util.ArrayList; import java.util.Iterator; import

9.9-全棧Java筆記:集合的N種方式總結&Collections工具類

java遍歷集合的N種方式總結【示例1】遍歷List方法1,使用普通for循環for(int i=0;i<list.size();i++){ //list為集合的對象名 String temp = (String)list.get(i); System.out.println

java類中的屬性

遍歷 value ttr row cati mode cep 數組 att public static void testReflect(Object model) throws NoSuchMethodException, IllegalAccessException,

Java HashMap 方式探討

current entryset exceptio iterator 取出 usually ica class void JDK8之前,可以使用keySet或者entrySet來遍歷HashMap,JDK8中引入了map.foreach來進行遍歷。 keySet其實是遍

javaMap的幾種方法

叠代器 ofo popu arr highlight shm int print number 方法分為兩類: 一類是基於map的Entry;map.entrySet(); 一類是基於map的key;map.keySet() 而每一類都有兩種遍歷方式: a.利用叠代器 it

Java方法一次數組返回兩個結果(最大值與最小值)

遍歷 get urn 個數 gets IV 限定 null int 使用內部類來存儲要返回的結果即可實現返回多個參數 使用泛型並限定類型必須實現Comparable接口,實現重用 使用T...a實現傳入不定量個數的數組 public class ArrayAlg{

java集合刪除指定元素異常分析總結

它的 一次 但是 代碼 元素 拋出異常 源碼 刪除指定元素 test 在使用集合的過程中,我們經常會有遍歷集合元素,刪除指定的元素的需求,而對於這種需求我們往往使用會犯些小錯誤,導致程序拋異常或者與預期結果不對,本人很早之前就遇到過這個坑,當時沒註意總結,結果前段時間又遇到

Java實體類(處理MongoDB)

boot common ech set declare code mod exc reflect 在實際過程中,經常要將實體類進行封裝,尤其是處理數據庫的過程中;因此,對於遍歷實體類能夠與數據庫中的一行數據對應起來。 我是使用的環境是Spring boot,訪問的數據庫時M

Vue結合Element-UI實現多級選單導航

在需要加入導航欄的元件內新增麵包屑導航欄,構建出一個可以根據路由動態改變其值的資料變數 { levelList },迴圈levelList,為每一個item設定點選時的跳轉路由 <el-breadcrumb class = "app-breadcrumb" separator =

JavaSet集合的方法

對 set 的遍歷 1.迭代遍歷: Set<String> set = new HashSet<String>(); Iterator<String> it = set.iterator(); while (it.hasNext()) {

JavaScript遞迴輸出json所有位與值的方法

宣告一個三層的json物件作為測試: var js={          "text":"MXCHIP won a prize",          "id": 1234,   &nbs

map取對應位的值

後臺dao層介面: Map<String,Object> detail(IwResultSpot vo); 中間層: //接收為map Map<String,Object> map = this.detail(vo); List list1 = new Arr