自己定义标签权限分配

自定义标签的返回值:

Tag.EVAL_PAGE:继续处理标签后续的代码,doEndTag()函数可用。
Tag.SKIP_BODY:忽略对标签主体Body的处理,doStartTag()和doAfterBody()函数可用。
Tag.SKIP_PAGE:忽略对余下页面的处理,doEndTag()函数可用。
BodyTag.EVAL_BODY_BUFFERED:如果doStartTag()方法返回BodyTag.EVAL_BODY_BUFFERED,则servlet容器会先调用setBodyContent()和doInitBody()方法,再执行标签主体的内容.如果类实现了BodyTag,那么doStartTag()可用.

开发带属性的AccessControl标签,其中有accessName这个属性,前台标签通过属性名判断权限。

第一步:开发标签的实现类,可能需到倒 javax.servlet.jsp.jar这个包

package com.tayh.projectCenter.utils;

import javax.servlet.jsp.JspWriter;
import javax.servlet.jsp.tagext.TagSupport;

/**
 * com.tayh.projectCenter.utils.AccessControl.java
 * 
 * @author 王学伟
 * @history <TABLE id="HistoryTable" border="1">
 *          <TR>
 *          <TD>时间</TD>
 *          <TD>描述</TD>
 *          <TD>作者</TD>
 *          </TR>
 *          <TR>
 *          <TD>2013-1-23</TD>
 *          <TD>创建初始版本</TD>
 *          <TD>王学伟</TD>
 *          </TR>
 *          </TABLE>
 */
public class AccessControl extends TagSupport {
    private String accessName;

    public String getAccessName() {
        return accessName;
    }

    public void setAccessName(String accessName) {
        this.accessName = accessName;
    }

    // ----标签开始时调用此方法-------
    public int doStartTag(){
        System.out.println(accessName);
            if(!accessName.equals("普通用户")&&!accessName.equals("中级管理员")){
                try{
                    JspWriter out=pageContext.getOut();
                    out.print(" <li id=\""  + "man_nav_1" + "\" onclick=\""+"list_sub_nav(id,'管理员书籍管理')"+"\"  class=\""+"bg_image"+"\"><a href=\""+"findAllBook.do"+"\" target=\""+"manFrame"+"\">书籍管理</a></li>");
                    out.print(" <li id=\""  + "man_nav_2" + "\" onclick=\""+"list_sub_nav(id,'系统设置')"+"\"  class=\""+"bg_image"+"\"><a href=\""+"manframe.do"+"\" target=\""+"manFrame"+"\">系统设置</a></li>");
                    out.print(" <li id=\""  + "man_nav_3" + "\" onclick=\""+"list_sub_nav(id,'账户管理')"+"\"  class=\""+"bg_image"+"\"><a href=\""+"manframe.do"+"\" target=\""+"manFrame"+"\">账户管理</a></li>");
                    out.print(" <li id=\""  + "man_nav_4" + "\" onclick=\""+"list_sub_nav(id,'公司公告')"+"\"  class=\""+"bg_image"+"\"><a href=\""+"manframe.do"+"\" target=\""+"manFrame"+"\">公司公告</a></li>");
                    out.print(" <li id=\""  + "man_nav_5" + "\" onclick=\""+"list_sub_nav(id,'广告新闻')"+"\"  class=\""+"bg_image"+"\"><a href=\""+"manframe.do"+"\" target=\""+"manFrame"+"\">广告新闻</a></li>");
                    
                    out.print(" <li id=\""  + "man_nav_8" + "\" onclick=\""+"list_sub_nav(id,'待办事务')"+"\"  class=\""+"bg_image"+"\"><a href=\""+"manframe.do"+"\" target=\""+"manFrame"+"\">待办事务</a></li>");
                    out.print(" <li id=\""  + "man_nav_9" + "\" onclick=\""+"list_sub_nav(id,'公司论坛')"+"\"  class=\""+"bg_image"+"\"><a href=\""+"manframe.do"+"\" target=\""+"manFrame"+"\">公司论坛</a></li>");
                    
                    
                }catch(Exception e){
                    System.out.println(e);
                }
                
            }else{
                try{
                    JspWriter out=pageContext.getOut();
                    out.print(" <li id=\""  + "man_nav_1" + "\" onclick=\""+"list_sub_nav(id,'书籍管理')"+"\"  class=\""+"bg_image"+"\"><a href=\""+"manframe.do"+"\" target=\""+"manFrame"+"\">书籍管理</a></li>");
                    out.print(" <li id=\""  + "man_nav_2" + "\" onclick=\""+"list_sub_nav(id,'系统设置')"+"\"  class=\""+"bg_image"+"\"><a href=\""+"manframe.do"+"\" target=\""+"manFrame"+"\">系统设置</a></li>");
                    out.print(" <li id=\""  + "man_nav_3" + "\" onclick=\""+"list_sub_nav(id,'账户管理')"+"\"  class=\""+"bg_image"+"\"><a href=\""+"manframe.do"+"\" target=\""+"manFrame"+"\">账户管理</a></li>");
                    out.print(" <li id=\""  + "man_nav_4" + "\" onclick=\""+"list_sub_nav(id,'公司公告查看')"+"\"  class=\""+"bg_image"+"\"><a href=\""+"manframe.do"+"\" target=\""+"manFrame"+"\">公司公告</a></li>");
                    out.print(" <li id=\""  + "man_nav_5" + "\" onclick=\""+"list_sub_nav(id,'广告新闻')"+"\"  class=\""+"bg_image"+"\"><a href=\""+"manframe.do"+"\" target=\""+"manFrame"+"\">广告新闻</a></li>");
                
                    out.print(" <li id=\""  + "man_nav_8" + "\" onclick=\""+"list_sub_nav(id,'待办事务查看')"+"\"  class=\""+"bg_image"+"\"><a href=\""+"manframe.do"+"\" target=\""+"manFrame"+"\">待办事务</a></li>");
                    out.print(" <li id=\""  + "man_nav_9" + "\" onclick=\""+"list_sub_nav(id,'公司论坛查看')"+"\"  class=\""+"bg_image"+"\"><a href=\""+"manframe.do?"+"\" target=\""+"manFrame"+"\">公司论坛</a></li>");
                    
                    
                }catch(Exception e){
                    System.out.println(e);
                }
                
            }
            return EVAL_BODY_INCLUDE;

        }

    // ----标签结束时调用此方法-------
    public int doEndTag() {

        return EVAL_PAGE;

    }
}

第二步:编写tld文件  accesscontrol.tld放在WEB-INF下(此外 Scriptlet表明可以使用“<%= %>”表达式)。必须加入文件头和版本

<?xml version="1.0" encoding="UTF-8"?>
<taglib version="2.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee web-jsptaglibrary_2_0.xsd">
    <tlib-version>1.0</tlib-version>
    <short-name>jsps</short-name>
    <tag>
        <!-- 标签名称 -->
        <name>accessControl</name>
        <!-- 标签对应的处理类 -->
        <tag-class>com.tayh.projectCenter.utils.AccessControl</tag-class>
        <!-- 标签体内容,没有标签体则设为empty -->
        <body-content>empty</body-content>
        <!-- 标签的属性声明 -->
        <attribute>
            <name>accessName</name>
            <!--表明属性是必须的-->

   <required>true</required> <!--表明允许使用EL表达式-->


<rtexprvalue>true</rtexprvalue> </attribute> </tag> </taglib>

第三步:在jsp中使用标签

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ include file="/WEB-INF/pages/base/include.jsp"%>
<%@taglib uri="/WEB-INF/accesscontrol.tld" prefix="access" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
<link rel="stylesheet" href="css/common.css" type="text/css" />
<style type="text/css">
a:hover {
    color: white;
}

</style>

<title>管理导航区域</title>
</head>
<script  type="text/javascript">
var preClassName = "man_nav_1";
function list_sub_nav(Id,sortname){
   if(preClassName != ""){
      getObject(preClassName).className="bg_image";
   }
   if(getObject(Id).className == "bg_image"){
      getObject(Id).className="bg_image_onclick";
      preClassName = Id;
      showInnerText(Id);
      window.top.frames['leftFrame'].outlookbar.getbytitle(sortname);
      window.top.frames['leftFrame'].outlookbar.getdefaultnav(sortname);
   }
}

function showInnerText(Id){
    var switchId = parseInt(Id.substring(8));
    var showText = "对不起没有信息!";
    switch(switchId){
        case 1:
           showText =  "欢迎使用无忧易货网(www.51ehuo.cn)后台管理系统!";
           break;
        case 2:
           showText =  "system setting!";
           break;
        case 3:
           showText =  "User Manage";
           break;           
        case 4:
           showText =  "Chanage Manage";
           break;    
        case 5:
           showText =  "Ad AND news!";
           break;                      
    }
    getObject('show_text').innerHTML = showText;
}
 //获取对象属性兼容方法
 function getObject(objectId) {
    if(document.getElementById && document.getElementById(objectId)) {
    // W3C DOM
    return document.getElementById(objectId);
    } else if (document.all && document.all(objectId)) {
    // MSIE 4 DOM
    return document.all(objectId);
    } else if (document.layers && document.layers[objectId]) {
    // NN 4 DOM.. note: this won't find nested layers
    return document.layers[objectId];
    } else {
    return false;
    }
}
</script>

<body>
<div id="menu">
    <ul>
    <access:accessControl accessName="${sessionScope.powername}"/>
    </ul>
</div>
</body>
</html>

以上代码从项目中截取,并不完全,按此操作可实现简单的自定义标签!!

posted @ 2013-01-24 18:45  蜗牛的夏天  阅读(297)  评论(0编辑  收藏  举报