自定义标签:就是根据需求,自己定义的标签,可以定义标签的名字、属性、作用等。


自定义标签由两部分组成

  • *.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();
}

}

 

posted on 2017-09-10 17:53  云上咖啡  阅读(222)  评论(0编辑  收藏  举报