主要是类别是树形的添加和遍历都比较别扭
看看工作流程, 真用的时候还是jQuery搞定吧...
private void createCategoryTree(){
String where = "where level=1";//查询一级节点
PageModel<ProductCategory> pageModel = categoryDao.find(-1, -1,where ,null);//执行查询方法
List<ProductCategory> allCategorys = pageModel.getList();
map = new LinkedHashMap<Integer, String>();//创建新的集合
for(ProductCategory category : allCategorys){//遍历所有的一级节点
setNodeMap(map,category,false);//将节点添加到Map集合中
}
}
参数中map是树, node是类别, flag代表是否是末节点
如果节点为空就停止遍历, 然后根据读取到节点级别添加制表符和空格
迭代此方法,直到遍历完为止.
private void setNodeMap(Map<Integer, String> map,ProductCategory node,boolean flag){
if (node == null) {//如果节点为空
return;//返回空,结束程序运行
}
int level = node.getLevel();//获取节点级别
StringBuffer sb = new StringBuffer();//定义字符串对象
if (level > 1) {//如果不是根节点
for (int i = 0; i < level; i++) {
sb.append(" ");//添加空格
}
sb.append(flag ? "├" : "└");//如果为末节点添加"└",反之添加"├"
}
map.put(node.getId(), sb.append(node.getName()).toString());//将节点添加的集合中
Set<ProductCategory> children = node.getChildren();//获取其子节点
// 包含子类别
if(children != null && children.size() > 0){//如果节点不为空
int i = 0;
// 遍历子类别
for (ProductCategory child : children) {
boolean b = true;
if(i == children.size()-1){//如果子节点长度减1为i,说明为末节点
b = false;//设置布尔常量为false
}
setNodeMap(map,child,b);//重新调用该方法
}
}
}
前台显示:
<td><s:select list="map" name="category.id"></s:select></td>
添加子类别:
先判断子类别的数量
<s:if test="children == null || children.isEmpty">
没有子类别
</s:if>
<s:else>
<s:a action="category_list" namespace="/admin/product">
<s:param name="pid" value="id"></s:param>
有<s:property value="children.size"/>个子类别
</s:a>
</s:else>
选定父节点后,添加子类别
<s:param name="pid" value="id"/>添加