自定义标签:就是根据需求,自己定义的标签,可以定义标签的名字、属性、作用等。
自定义标签由两部分组成
- *.tld文件:是一个XML文件,用来定义标签名字、属性、标签处理类、标签体等
- *.class文件:每一个标签,都对应一个标签处理器类,这个类遵守一定规范,即需要继承或实现API中的特定类或接口,覆盖其中方法。也是自定义标签的主要工作
通过java类实现自动义标签的步骤:
- 首先需要在一个tld文件中描述标签。tld文件存在WEB-INF下。
<?xml version="1.0" encoding="UTF-8"?>
<taglib>
<tlib-version>1.2</tlib-version>
<jsp-version>2.1</jsp-version>
<short-name>mj</short-name>
<uri>http://www.cnmj.com/taglib</uri>
<tag>
<name>getAttr</name>
<tag-class>com.maji.taglib.GetTag</tag-class>
<body-content>empty</body-content>
<attribute>
<name>attr</name>
<required>true</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
</tag>
</taglib>
uri:是这个tld文件的唯一标记,可以自定义,不一定是真实存在的URL。使用自定义标记时将根据该值寻 找tld文件。
tag:tld文件中将定义多个tag元素,描述多个标签。
name:标签的名字
tag-class:实现该标签功能的类,是之后主要的工作
attribute:标签的属性,可以定义多个
name:属性名字
required:属性是否必须,true为必须
rtexprvalue:属性是否能使用运行期表达式传值,true表示必须
标签处理器类必须继承或实现API中的类,覆盖特定的方法
如doStartTag方法
例:
(jsp文件)
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ taglib uri="http://www.cnmj.com/taglib" prefix="mj"%><!-- 导入自定义标签的uri并命名 --> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Insert title here</title> </head> <body> <% pageContext.setAttribute("msg", "hello jsp"); %> <mj:getAttr attr="msg"/><!-- 调用标签并传参 --> </body> </html>
(java文件,继承javax.servlet.jsp.tagext.TagSupport类)
import java.io.IOException;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.JspWriter;
import javax.servlet.jsp.tagext.TagSupport;
public class GetTag extends TagSupport {
/**
* 序列号
*/
private static final long serialVersionUID = -790027529044181404L;
private String attr;//参数,需和tld文件中的attribute的name一致
public GetTag() {
}
public String getAttr() {
return attr;
}
public void setAttr(String attr) {//必须要有参数的setter方法
this.attr = attr;
}
@Override//重写方法
public int doStartTag() throws JspException {
//通过pageContext获取对象和方法
Object attribute = this.pageContext.getAttribute(attr);
JspWriter out = this.pageContext.getOut();
try {
out.write((String)attribute);
} catch (IOException e) {
e.printStackTrace();
}
return super.doStartTag();
}
}