在编写html文档时,有些功能用已有的标签不能完成或是用已有的标签不能很简单的达到用户的要求,这时就需要程序员自己编写相应的标签来完成指定的功能
这里笔者以网站权限的控制来着手讲解自定义标签的实现方法及其好处,希望对喜欢建站的读者有一定的帮助
在网站建设过程中相信很多开发者都会为权限的控制而烦恼,虽然理论上来说,为每一种角色都创建一套网页的想法是可行的,可是这在实际的操作中是难以令人接受的,因为可能两个角色的功能只有细小的差别而却要建立两套页面,这额外的工作量及时间的开销都是开发都不能忍的,而且最重要的是,后期的维护工作很难进行,所以开发一套对不同角色来说都通用的接口网页就很重要了
所以现在的要求就是既要实现通用,又能使得不同的用户能看到不同的视图(注意这里的视图显示控制机制和MVC中控制机制是不同的,MVC中的控制是由C控制定位到不同的页面来实现不同视图的显示,而这里是同一页面的内容根据用户的角色来显示,其本所是不一样的),或许大多数的读者首先想到方法就是在页面中加入大量的if
else语句,进行用户身份的判定,然后进行页面内容的显示,当然这也是一种方法,不过这种方法在操作起来显得很是麻烦,而且当我的权限验证机制有所改变时,那么我就得修改所有的页面中相应的代码,更新维护起来相当的麻烦
这里笔者通过自定义标签的形式来完成权限及页面显示内容的控制,使用起来更加的灵活,而且维护起来也方便,具体实现方式如下
步骤一、新建一个tld文件,这里命名为privilege.tld,这个文件主要实现自定义标签的定义,注意其中的红色标的部分,读者可以自己修改取值,而蓝色标注的部分,则是处理这个标签的类所在的路径及其名称,读者可以根据实际,自己修改这个取值,operateID表示操作的ID,roleID表示用户的角色编号,mark表示掩码,用来实现对某一角色部分功能的屏蔽,文件内容如下
<?xml
version="1.0" encoding="UTF-8"?>
<!DOCTYPE taglib PUBLIC "-//Sun
Microsystems, Inc.//DTD JSP Tag Library 1.1//EN"
"http://java.sun.com/j2ee/dtds/web-jsptaglibrary_1_1.dtd">
<taglib>
<tlibversion>1.0</tlibversion>
<jspversion>1.1</jspversion>
<shortname>privilege</shortname>
<tag>
<name>operate</name>
<tagclass>com.tag.pub.PrivilegeTag</tagclass>
<bodycontent>JSP</bodycontent>
<!--这里如果设为empty,则无body-->
<attribute>
<name>operateID</name>
<required>true</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
<attribute>
<name>roleID</name>
<required>true</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
<attribute>
<name>mark</name>
<required>true</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
</tag>
</taglib>
步骤二、新建一个标签的处理类,这里我是建在src/com/tag/pub包下面,且文件的名为PrivilegeTag.java,注意蓝色标注的部分要和上面代码中蓝色标注的部分相一致,否则会出现错误,然后在文件中红色标注的部分,根据传进来的operateID,roleID,mark(这三个参数不需要用户手动调用函数进行设置,java的反射机制能自己调用相应的set方法进行这个参数值的设置)参数查库进行判断用户是否有权限进行当前的操作,文件的内容如下:
package
com.tag.pub;
import javax.servlet.jsp.JspException;
import
javax.servlet.jsp.tagext.TagSupport;
public class
PrivilegeTag extends TagSupport {
private static
final long serialVersionUID = -532517444654109642L;
private String operateID;
private String
roleID;
private String mark;
public
void setMark(String mark) {
this.mark =
mark;
}
public void setRoleID(String
roleID) {
this.roleID =
roleID;
}
public void
setOperateID(String operateID) {
this.operateID = operateID;
}
public int doStartTag() throws JspException {
if(在这里进行权限的判断)
return
EVAL_PAGE;
return
SKIP_BODY;
}
}
步骤三、 对于页面内可展现给指定用户而又需要进行权限控制的链接操作,应该使用<privilege:operate operateID="operid"
roleID="roleid"> </privilege:operate>标签对包含起来,以实现不同身份的人访问该页面时会有不同显示的目的,标签中operateID取遵循以下的规范:模块名_操作,roleID取值为用户的角色。如我在一个查看页面中AAA_view.jsp中,可能呈现给用户的操作有add,del,fix三项操作,则我可以以下的方式将链接呈现给用户:
<privilege:operate operateID="AAA_add" roleID="roleid">添加</privilege:operate>
<privilege:operate operateID="AAA_del" roleID="roleid">删除</privilege:operate>
<privilege:operate operateID="AAA_fix"
roleID="roleid">修改</privilege:operate>
即编写代码时不考虑用户是不是有这个权限,而只考虑该页面中的该操作是不是需要权限控制即可,这样不同的用户在访问时,就会看到不同的功能了,如甲用户有添加和删除的功能,则他访问该页面时相应的地方就会显示:添加删除的链接,而对于乙用户,只有修改的权限,则他访问该页面时相应的地方就会显示:修改的链接,其它的他没有操作权限的链接都不会被显示或是执行。
最后要说明的是这里只是提供给大家有一个思路,因为具体操作起来还需要后台数据库中及表的支持,这里不支持附件的上传,而如果将全部的代码都粘贴过来显然是不现实的,所以读者可以根据这个思路自己进行设计,如果实现的时候有什么问题的话,可以给我留言并留下联系方式,我可以将实现的工程文件发给你