自定义标签

怎么写自定义标签

1.  定义标签<mytag:a url=""  href="" onclick=""></mytag:a>

2. 定义标签处理类

      两种方式

        1). 实现接口Tag,SimpleTag和BodyTag之一

        2). 继承TagSupport和BodyTagSupport

        

import java.io.IOException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.BodyTagSupport;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
/**
 * TagSupport与BodyTagSupport的区别:
 * 主要看标签处理类是否要读取标签体的内容和改变标签体返回的内容,如果不需要就用TagSupport,否则就用BodyTagSupport
 * 用TagSupport实现的标签,都可以用BodyTagSupport来实现,因为BodyTagSupport继承了TagSupport
 */
/**
 * 处理<a href></a>链接的网页元素
 * 
 * @author yeliping2011
 * 
 */
public class RBAC_ATag extends BodyTagSupport {
	private static final long serialVersionUID = 3174234039143531070L;

	private static Log log = LogFactory.getLog("RBAC_ATag");

	private String url;

	// 根据a标签有的属性定义
	private String href;

	private String onclick;

	public String getUrl() {
		return url;
	}

	public void setUrl(String url) {
		this.url = url;
	}

	public String getHref() {
		return href;
	}

	public void setHref(String href) {
		this.href = href;
	}

	public String getOnclick() {
		return onclick;
	}

	public void setOnclick(String onclick) {
		this.onclick = onclick;
	}

	@Override
	public int doStartTag() throws JspException {// 这个方法不用所以直接返回值
		/**
		 * 1.判断href是否满足条件 2.满足则让此标签显示为<a href="www.baidu.com">百度</a>
		 * 3.不满足则在此方法中就返回skip_body,不显示链接并修改href的值
		 */
		// 如 <role:a href="www.baidu.com">百度</role:a>
		// <a href="www.baidu.com">百度</a>
		try {//进行业务处理
			if (false) {
				try {
					pageContext.getOut().print("");
				} catch (IOException e) {
					e.printStackTrace();
				}
				// 不显示标签体
				return SKIP_BODY;
			}
		} catch (Exception e) {
			log.error(e,e);
		}

		// 表示需要处理标签体,但绕过setBodyContent()和doInitBody()方法
		// return EVAL_BODY_INCLUDE;

		// 表示需要处理标签体。
		return EVAL_BODY_BUFFERED;
	}

	/**
	 * 处理标签体内的内容。 如:<mytag:a ">/login.crean</mytag:a>如这里的/login.crean
	 * 如果没有body则直接执行doEndTag
	 */
	@Override
	public int doAfterBody() throws JspException {// 重点在这个方法上
		String content = bodyContent.getString(); // 得到标签体 的内容。
		String href2 = href;
		String onclick2 = onclick;
		System.out.println(content + "  url: " + href2);
		// BodyContent对象的内容不自动写了入Servlet的输出流,而是积累在一字符串缓存中。
		bodyContent.clearBody();// 清除标签体内容
		try {
			bodyContent.print("<a href=" + href2 
					+ " onclick=" + onclick2 + ">");
			bodyContent.print(content); // 补上 内容
			bodyContent.print("</a>");

		} catch (IOException e) {
			e.printStackTrace();
		}

		// 继续tag处理下一步
		return SKIP_BODY;
	}

	@Override
	public int doEndTag() throws JspException {
		try {
			if (getBodyContent() != null) {
				this.getBodyContent().writeOut(pageContext.getOut());
			}
		} catch (IOException e) {
			e.printStackTrace();
		}

		// 此方法返回EVAL_PAGE,允许继续处理页面
		return EVAL_PAGE;
	}
}
 

3. 配置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>1.0</tlib-version>
 <!-- 标签库的版本 -->
 <jsp-version>1.2</jsp-version>
 <!-- 这个标签库要求的JSP规范版本 -->
 <short-name>mytag</short-name>
 <!-- JSP页面编写工具可以用来创建助记名的可选名字 -->
 <uri>/tld/mytag</uri>
 <tag>
  <name>a</name>
  <!-- 唯一标签名 -->
  <tag-class>com.rbac.mytag.ATag</tag-class>
  <!-- 标签ATag类的完全限定名 
 标签体内容,有标签体 则设为jsp-->
  <body-content>jsp</body-content>
  <!-- 标签的属性声明-->
  <attribute>
   <name>url</name>
   <!--rtexprvalue true 表示value可以是动态值,jsp表达式或是el表达式。否则,只能是字符串-->
   <rtexprvalue>true</rtexprvalue>
  </attribute>
  <attribute>
   <name>href</name>
   <!--rtexprvalue true 表示value可以是动态值,jsp表达式或是el表达式。否则,只能是字符串-->
   <rtexprvalue>true</rtexprvalue>
  </attribute>
<attribute>
   <name>onclick</name>
   <!--rtexprvalue true 表示value可以是动态值,jsp表达式或是el表达式。否则,只能是字符串-->
   <rtexprvalue>true</rtexprvalue>
  </attribute></tag></taglib>

4  在web.xml文件中配置tld文件

<jsp-config>  
	    <taglib>  
	        <taglib-uri>/tld/rbac</taglib-uri>  
	        <taglib-location>/WEB-INF/tlds/mytag.tld</taglib-location>       
	    </taglib>  
	  </jsp-config>

5 在jsp页面使用

<%@ taglib uri="/tld/rbac"  prefix="rbac"%>
<mytag:a url="/test" href="javascript:;" onclick="...." >自定义标签</mytag:a>














                
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值