前些天在一个项目中做了一个最基本的权限管理(标准的权限结构,用户-角色-菜单),后来需要精确地控制到按钮就想到了使用自定义标签(jsp tag)来处理按钮的显示与隐藏。
下面是我参考网上的资料自己写的一个自定义标签的demo:
首先自定义标签类:
package com.vanfon.p2p.admin.core; import javax.servlet.http.HttpServletRequest; import javax.servlet.jsp.JspException; import javax.servlet.jsp.tagext.TagSupport; import com.vanfon.p2p.entity.Admin; public class PermissionTag extends TagSupport { /** * */ private static final long serialVersionUID = 4592227792811389132L; @Override public int doStartTag() throws JspException { boolean result = false; HttpServletRequest request = (HttpServletRequest) this.pageContext .getRequest();// 通过成员变量获取HttpServletRequest对象 Admin admin = (Admin) request.getSession().getAttribute("admin");//获取登录到系统的用户 if(admin!=null&&"1".equals(String.valueOf(admin.getIfsuper()))){ result = true; } return result? EVAL_BODY_INCLUDE : SKIP_BODY;//EVAL_BODY_INCLUDE代表执行自定义标签中的内容,SKIP_BODY代表不执行自定义标签中的内容。 } }
<?xml version="1.0" encoding="UTF-8" ?> <taglib xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd" version="2.0"> <description>p2p permission taglib</description> <display-name>permission taglib</display-name> <tlib-version>1.0</tlib-version> <short-name>p2p_admin</short-name> <!-- 在taglib.jsp文件中加上如下内容,<%@ taglib uri="<span style="font-family: Arial, Helvetica, sans-serif;">http://vanfon.p2p.cn</span>" prefix="p2p"%> uri中的值必须与标签<uri></uri>中的值一致,prefix名称随便取,取完后JSP那端的前缀名必须与这一致。 --> <uri>http://vanfon.p2p.cn/</uri> <tag> <description>权限校验标签,有权限就显示标签体的内容,否则不显示</description> <name>permission</name><!-- 里面的内容是JSP文件中标签里面的<p2p:permission >permission --> <tag-class>com.vanfon.p2p.admin.core.PermissionTag</tag-class><!-- JSP文件中的自定义标签里面的值会传到PermissionTag类接受,PermissionTag类接受到的值决定是否要显示JSP文件中自定义标签的内容。 --> <body-content>JSP</body-content><!-- 里面的值代表<p2p:permission>只不能用在JSP中。 --> </tag> </taglib>
web,xml中加入:
<jsp-config> <taglib> <taglib-uri>http://vanfon.p2p.cn/</taglib-uri> <taglib-location>/WEB-INF/tlds/shiros.tld</taglib-location> </taglib> </jsp-config>
<%@ taglib prefix="p2p" uri="http://vanfon.p2p.cn/" %>
<p2p:permission><a href="#" class="easyui-linkbutton" iconCls="icon-add" onclick="openCreateDialog();">新增</a></p2p:permission> <p2p:permission ><a href="#" class="easyui-linkbutton" iconCls="icon-edit" onclick="openUpdateDialog();">编辑</a></p2p:permission> <p2p:permission ><a href="#" class="easyui-linkbutton" iconCls="icon-remove" onclick="del();">删除</a></p2p:permission>
扩展
比如:
PermissionTag.java
public class PermissionTag extends TagSupport { private String module;//属性名必须与JSP自定义标签的属性名一样 private String privilege; public String getModule() { return module; } public void setModule(String module) { this.module = module; } public String getPrivilege() { return privilege; } public void setPrivilege(String privilege) { this.privilege = privilege; } @Override public int doStartTag() throws JspException { boolean result = false; Employee employee = this.pageContext.getRequest();//通过成员变量获取HttpServletRequest对象。 WebUtil.getEmployee((HttpServletRequest)this.pageContext.getRequest());//获取登录到系统的员工 SystemPrivilege methodPrivilege = new SystemPrivilege(new SystemPrivilegePK(this.getModule(), this.getPrivilege())); for(PrivilegeGroup group : employee.getGroups()) { if(group.getPrivileges().contains(methodPrivilege)) { result = true; break; } } //EVAL_BODY_INCLUDE代表执行自定义标签中的内容,SKIP_BODY代表不执行自定义标签中的内容。 return result? EVAL_BODY_INCLUDE : SKIP_BODY; } }
shiros.tld
<?xml version="1.0" encoding="UTF-8" ?> <taglib xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd" version="2.0"> <description>p2p permission taglib</description> <display-name>permission taglib</display-name> <tlib-version>1.0</tlib-version> <short-name>p2p</short-name> <!-- 在taglib.jsp文件中加上如下内容,<%@ taglib uri="<span style="font-family: Arial, Helvetica, sans-serif;">http://vanfon.p2p.cn/</span>" prefix="p2p"%> uri中的值必须与标签<uri></uri>中的值一致,prefix名称随便取,取完后JSP那端的前缀名必须与这一致。 --> <uri>http://vanfon.p2p.cn/</uri> <tag> <description>权限校验标签,有权限就显示标签体的内容,否则不显示</description> <name>permission</name><!-- 里面的内容是JSP文件中标签里面的<p2p:permission module="admin" privilege="delete">permission --> <tag-class>com.vanfon.p2p.admin.core.PermissionTag</tag-class><!-- JSP文件中的自定义标签里面的值会传到PermissionTag类接受,PermissionTag类接受到的值决定是否要显示JSP文件中自定义标签的内容。 --> <body-content>JSP</body-content><!-- 里面的值代表<p2p:permission module="admin" privilege="delete">只不能用在JSP中。 --> <attribute> <description></description> <name>module</name><!-- 里面的值代表JSP文件中自定义标签 <p2p:permission module="admin" privilege="delete">中的module。--> <required>true</required><!-- 里面的值代表在JSP文件中敲入自定义标签(<p2p:permission)的时候,自定义标签里面属性名称(module)不用手工去写会自动显示出来。 --> <rtexprvalue>false</rtexprvalue><!-- 里面的值代表JSP文件中自定义标签的属性的值不能用EL表达式(${})来表示,如果为true自定义标签的属性的值能用EL表达式(${})来表示。 --> </attribute> <attribute> <description></description> <name>privilege</name> <required>true</required> <rtexprvalue>false</rtexprvalue> </attribute> </tag> </taglib>
<p2p:permission privilege="add" module="admin"><a href="#" class="easyui-linkbutton" iconCls="icon-add" onclick="openCreateDialog();">新增</a></p2p:permission>
参考:http://blog.sina.com.cn/s/blog_a2de16f401016cpc.html