自定义标签的返回值:
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>
以上代码从项目中截取,并不完全,按此操作可实现简单的自定义标签!!