使用java 和freemarker實現多級選單(分類)
阿新 • • 發佈:2019-01-22
import com.google.common.collect.ArrayListMultimap; import com.google.common.collect.Multimap; @RequestMapping("/test/type") @Controller public class Test { @RequestMapping("/list") public ModelAndView listTypes (HttpServletRequest request){ List<Type> types = typeService.list();//程式碼省略,功能:從db中獲取需要的分類 Multimap<Integer,Type> typeMultimap = ArrayListMultimap.create(); //使用google guava 包 對以獲取的分類按照父類Id進行組裝 for(int i=0 ;i<types.size();i++){ typeMultimap.put(types.get(i).getParentTypeId(), types.get(i)); } List<TypeView> list = new ArrayList<TypeView>(); list = subType(0,typeMultimap,0);//遞迴呼叫 生成當前節點的子節點 print(list,0); ModelAndView model = new ModelAndView("/test/type_test"); model.addObject("types", list); return model; } /** * 遞迴處理多級分類問題 * @param parentId 父類Id * @param maps 所有分類的按照父類ID組裝後容器 * @param level 分類的級別 0:根 * @return 返回 parentId 節點的子分類節點【可能是多個】 */ public List<TypeView> subType(Integer parentId, Multimap<Integer,Type> maps,int level){ List<TypeView> list = new ArrayList<TypeView>(); Collection<Type> trList = maps.get(parentId); for(Iterator<Type> iterator =trList.iterator();iterator.hasNext();){ Type typeTemp = iterator.next(); TypeView typeView = new TypeView(); typeView.setType(typeTemp); typeView.setLevel(level); list.add(typeView); typeView.setChildren(subType(typeTemp.getId(),maps,level+1)); } if(list.isEmpty()){ return null; }else{ return list; } } //列印當前歸類好的分類 private void print(List<TypeView> list,int level) { if(list==null ||list.isEmpty()){ return ; } for (Iterator<TypeView> iterator = list.iterator(); iterator.hasNext();) { TypeView typeView = iterator.next(); Type type = typeView.getType(); System.out.println("目錄等級:"+typeView.getLevel()+"----"+type.getTypeName()); print(typeView.getChildren(),level+1); } } }
2.freemarker 程式碼
定義遞迴巨集 程式碼如下:<html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/> <title>type</title> </head> <body> <#macro typeChilden items> <#assign countSize = items?size> <ul> <#list items as item> <li>${item.type.typeName} <#if item.children?? && item.children?size >0> <#if item.children?? && item.children?size >0> <@typeChilden item.children></@typeChilden> </#if> </#if> </li> </#list> </ul> </#macro> <br> <ul> <#list types as item> <li> ${item.type.typeName!''} <#if item.children?? && item.children?size >0> <@typeChilden item.children></@typeChilden> </#if> </li> </#list> </ul> </body> </html>