怎么写自定义标签
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>