1. 程式人生 > >使用java 和freemarker實現多級選單(分類)

使用java 和freemarker實現多級選單(分類)

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>

3. 結果展示