bootstrap框架下用jsp自定义标签动态生成菜单树

常献
2023-12-01

动态的生成菜单树思路

  • 首先,这个跟前端的框架有关,如果前端用的是Easyui的话,直接从后端传递json格式的数值,发送到前端js里面进行解析,easyui里面有菜单树组件。
  • 如果用的是bootstrap的话,也可以用treeview插件,将后端发送过来的json格式数据在js里面解析,然后动态的生成菜单树

但是:作为一个后端开发人员,可能对前端的js不大熟,因此我这里记录一个思路:从后端动态生成html代码,然后输出到前端进行显示。

jsp自定义标签用法

  1. 以admin.jsp为例,比如我需要在admin.jsp中展示动态生成的菜单树,那么我就把自定义标签放在这里:
<myTag:menutree/>  

同时我还要引入mytag.tld自定义标签文件:

<%@ taglib prefix="myTag" uri="/WEB-INF/tlds/myTag.tld" %>
  1. mytag.tld标签文件格式:
<?xml version="1.0" encoding="UTF-8" ?>

<!DOCTYPE taglib PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.2//EN" "http://java.sun.com/dtd/web-jsptaglibrary_1_2.dtd" >
<taglib>
<tlib-version>1.0</tlib-version>
<jsp-version>1.0</jsp-version>
<short-name>myTag</short-name>
<uri>/WEB-INF/tlds/myTag.tld</uri>//文件路径
<tag>
  <name>menutree</name>//自定义标签属性
  <tag-class>org.root.ambow.web.tag.MyTag</tag-class>//该属性的目标类,作为内容输出
  <body-content>scriptless</body-content>
</tag>
</taglib>
  1. MyTag.java自定义标签类,这就不多解释了,直接上代码
package org.root.ambow.web.tag;

import java.util.List;

import javax.servlet.jsp.JspWriter;

import org.apache.shiro.SecurityUtils;
import org.root.ambow.model.vo.FirstMenuVo;
import org.root.ambow.model.vo.UserVo;
import org.root.ambow.service.ResourceService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.servlet.tags.RequestContextAwareTag;

public class MyTag extends RequestContextAwareTag{
	private static final long serialVersionUID = 1L;
	@Autowired
	private ResourceService rs;
	@Override
	protected int doStartTagInternal() throws Exception {
		UserVo uservo =  (UserVo) SecurityUtils.getSubject().getSession().getAttribute("uservo");
		System.out.println(+uservo);//得到当前登录的uservo对象
		StringBuffer menuString = new StringBuffer();
		
		JspWriter out=pageContext.getOut();
		rs=this.getRequestContext().getWebApplicationContext().getBean(ResourceService.class);
		//将当前的uservo对象的id传入,查找出此登录对象的权限
		List<FirstMenuVo>fmv=rs.selectFirstMenuById(uservo.getId());
		//fmv里面全部装的是一级菜单的信息
		for(FirstMenuVo firstMenuVo:fmv) {
			menuString.append("<li>");
			menuString.append("<a href=\"\"><i class=\""+firstMenuVo.getIcon()+"\"></i> <span class=\"nav-label\">"+firstMenuVo.getName()+"</span><span class=\"fa arrow\"></span></a>");
			//判断该一级标签下面是否还有二级菜单:
			
				//通过用户id和当前一级菜单的id查找它的子菜单信息
				List<FirstMenuVo>fmvSon=rs.selectSunMenuByUseridAndPid(uservo.getId(), firstMenuVo.getId());
				if(fmvSon!=null) {//如果有二级菜单的话
					menuString.append("<ul class=\"nav nav-second-level\">");
					for(FirstMenuVo firstMenuSon:fmvSon) {//遍历子级菜单${contextPath}
						menuString.append("<li><a class=\"J_menuItem\"  href=\"/root-ambow-web"+firstMenuSon.getUrl()+"\" ><i class=\""+firstMenuSon.getIcon()+" \"></i> <span class=\"nav-label\">"+firstMenuSon.getName()+"</span></a></li>");
						
				}
								
				menuString.append("</ul>");
			}
			menuString.append("</li>");
		}

		 out.write(menuString.toString());
		   out.flush();
		return 0;
	}

}

结果就是通过out.write()方法将内容输出到前端。
至此,完成!
?

 类似资料: