用Taglib实现--根据权限动态显示菜单栏
2008-07-12 18:39
344 查看
实现一个标签库,来辅助页面上的菜单根据权限动决定是否显示该菜单。
前提知识:
1. 前面写过一篇web中验证思路的文章,提到将用户的验证信息放到Session中,这里开发的标签就是基于这个思路。http://blog.csdn.net/d8111/archive/2008/04/19/2307512.aspx
2.RBAC角色权限控制模型,前面也写了一篇文章。http://blog.csdn.net/d8111/archive/2008/04/30/2348685.aspx
开始:
一。了解Taglib
1.自定义标签是用户定义的jsp语言元素。当包含自定义标签的jsp页面转换为servlet时,这个标签就转换为一个名为tag handler的对象上的操作。之后当jsp页面的servlet执行时,web容器就调用这些操作。
2.写一个Taglib需要做的事情
a) 一个tag就是一个普通的java类,它唯一特别之处是它必须继承TagSupport或者BodyTagSupport类。这两个类提供了一些方法,负责jsp页面和你编写的类之间的交互,例如输入,输出。至于这2个类的区别和需要继承实现的方法,强烈建议阅读javaEE-doc完全理解透(如果项目引用了spring,struts2等带有标签的框架,继承这些框架实现的Taglib父类可能会得到额外惊喜:) )
b)写一个.tld文件,来描述标签格式。 tld有基于dtd和Schema的2种不同格式配置,基于dtd的虽然比较老但是参考比较多,至于Schema我看了好多资料还是没弄明白配置格式...这里就不提了,默认全是dtd的实现。
c)在web.xml添加<taglib>项来读取标签格式。
具体Taglib格式不打算详述。下面写具体实现:
二。实现菜单的权限显示
1.这里要实现一个类似<s:if> 或者说是<c:if>类似的标签,带有参数url, 根据url是否属于权限,来决定是否显示标签内容中的菜单。
a)authentication.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>2.0</tlib-version>
<jsp-version>1.2</jsp-version>
<short-name>auth</short-name>
<uri>/authentication</uri>
<description>判断菜单权限</description>
<tag>
<name>showMenu</name>
<tag-class>commons.utils.AuthenticationTag</tag-class>
<body-content>JSP</body-content>
<description>
</description>
<attribute>
<name>url</name>
<required>true</required>
<rtexprvalue>false</rtexprvalue>
<description>the menu url.</description>
</attribute>
</tag>
</taglib>
b)标签实现类
package commons.utils; import java.util.Enumeration; import java.util.List; import javax.servlet.jsp.JspException; import javax.servlet.jsp.PageContext; import javax.servlet.jsp.tagext.TagSupport; /** * 权限标签 * 用法: * <%@ taglib uri="/authentication" prefix="auth" %> * 内容 * 如果内容对应的url在权限范围,则显示内容。否则,不显示内容 * @author Administrator * */ public class AuthenticationTag extends TagSupport { private String url; @Override public int doEndTag() throws JspException { // TODO Auto-generated method stub return super.doEndTag(); } @Override public int doStartTag() throws JspException { //取权限列表 List urls = (List)pageContext.getSession().getAttribute("userResource"); if(urls.contains(url)) { //包含权限,显示内容 return TagSupport.EVAL_BODY_INCLUDE; }else { //否则跳过 return TagSupport.SKIP_BODY; } } @Override public Object getValue(String k) { // TODO Auto-generated method stub return super.getValue(k); } @Override public Enumeration getValues() { // TODO Auto-generated method stub return super.getValues(); } @Override public void setPageContext(PageContext pageContext) { // TODO Auto-generated method stub super.setPageContext(pageContext); } @Override public void setValue(String k, Object o) { // TODO Auto-generated method stub super.setValue(k, o); } public String getUrl() { return url; } public void setUrl(String url) { this.url = url; } }
c) web.xml新增配置
<jsp-config>
<taglib>
<taglib-uri>/authentication</taglib-uri>
<taglib-location>/WEB-INF/authentication.tld</taglib-location>
</taglib>
</jsp-config>
d)页面上的使用:
引入标签
<%@ taglib uri="/authentication" prefix="auth" %>
然后用标签包含菜单html内容。
<auth:showMenu url="/info/info!">
<li id="tb1_2" class="normaltab" onclick="i:HoverLi(2);"><font color="#ffffff"><strong><a href="#" onclick="openInfo()" class="hot">信息管理</a></strong></font></li>
</auth:showMenu>
相关文章推荐
- asp+ajax能实现根据下拉列表值动态无刷新显示数据
- C/S模式根据权限基于反射机制实现动态生成菜单
- 关于dorado框架datatable处的右键菜单无法根据具体数据实现动态分别显示不同菜单的解决方法
- 动态创建菜单,menustrip,根据权限显示菜单,控制菜单可用,反射,给窗体传值,反射对象传值【转】
- 实现:左边为菜单导航,当一个菜单中包含多个Tabs,并且不同的Tab要根据权限的不同显示。
- [转载内容]动态创建菜单,menustrip,根据权限显示菜单,控制菜单可用,反射,给窗体传值,反射对象传值,public static Object CreateInstance ( Type type, params Object[] args )
- 052医疗项目-模块五:权限设置-实现根据用户显示不同的菜单
- 根据权限动态加载数据库菜单的DevExpressNavBar导航栏的实现
- 【原创源码】(01):利用事件-委托,实现主-子窗体动态显示,不同菜单栏,不同工具栏。(类似SQL Server 2000 企业管理器)
- 根据用户权限,动态显示用户菜单
- 动态创建菜单,menustrip,根据权限显示菜单,控制菜单可用,反射,给窗体传值,反射对象传值,public static Object CreateInstance ( Type type, params Object[] args )
- 根据权限动态生成菜单栏和工具栏
- 利用事件-委托,实现主-子窗体动态显示,不同菜单栏,不同工具栏。(类似SQL Server 2000 企业管理器)
- 动态创建菜单,menustrip,根据权限显示菜单,控制菜单可用,反射,给窗体传值,反射对象传值,public static Object CreateInstance ( Type type, pa
- 图书购买系统之商品分类分页--根据主页面传来的值分类显示商品并实现动态分页功能
- android 动态权限申请 rxjava2实现方法
- 动态实现通知栏的显示和隐藏
- JS实现时间菜单的动态显示(已处理平年和闰年)
- EditText+ListView实现从动态显示数据库数据
- 借用鼠标指定的对象实现动态显示和隐藏菜单