|  | 
 
| 
1,关于自定义标签的几个重要组成部分: 继承的类:javax.Servlet.jsp.tagext.*:TagSupport
 一个属性: protected PageContext pageContext
 两个方法: public int doStartTag()
 public int doEndTag()
 三个常量: SKIP_BODY,SKIP_PAGE,EVAL_PAGE
 SKIP_PAGE,EVAL_PAGE是doEndTag()方法的返回值
 标签库描述文件 (*.tld)
 2,流程(工具:eclipse):
 1.新建一个web project
 2.在项目下新建一个包,包里建类,继承TagSupport
 3.完成标签处理类
 
 package demo.tag;
 import javax.servlet.jsp.JspException;
 import javax.servlet.jsp.*;
 import javax.servlet.jsp.tagext.TagSupport;
 import java.io.*;
 //需要导入的几个常用的包
 @SuppressWarnings(\"serial\")
 public class TagDemo extends TagSupport ...{
 private int pageSize;//pageSize属性,控制页面显示的个数,并且要生成get和set方法
 public int getPageSize() ...{
 return pageSize;
 }
 public void setPageSize(int pageSize) ...{
 this.pageSize = pageSize;
 }
 //    public int doEndTag() throws JspException {
 //        在这里没有用
 //        return super.doEndTag();
 //    }
 public int doStartTag() throws JspException ...{
 JspWriter out = pageContext.getOut();//用pageContext获取out,他还能获取session等,基本上jsp的内置对象都能获取,非常有用
 for (int i=0; i<pageSize; i++) ...{
 try ...{
 out.println(\"<table>\");
 out.println(\"<tr>\");
 out.println(\"<td>\"); [Page]
 out.println(i);
 out.println(\"</td>\");
 out.println(\"<td>\");
 out.println(i*10);
 out.println(\"</td>\");
 out.println(\"</tr>\");
 out.println(\"</table>\");
 } catch (IOException e) ...{
 e.printStackTrace();
 }
 }
 return SKIP_BODY;
 }
 }
 
 
 1. 标签处理类应该继承自TagSupport类
 2. 标签处理类应该覆盖父类的至少一个方法 doStartTag() 或 doEndTag(),如果你覆盖是doStartTag()方法应该返回 SKIP_BODY,      如果你覆盖是doEndTag()方法应该返回 SKIP_PAGE,EVAL_PAGE
 3. 充分利用标签处理类的pageContext属性,可以通过该属性获取使用自定义标签的JSP页面的各种对象:
 getOut(): 获取JSP页面的输出流               out
 getRequest: 获取JSP页面的请求对象               request
 getSession: 获取JSP页面的会话对象          session
 getServletContext: 获取JSP页面的应用对象      application [Page]
 4. 如果我们要完成一个带属性自定义标签,需要在标签处理类声明相关属性
 5.在WEB-INF下新建一个.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/j2ee/dtd/web-jsptaglibrary_1_2.dtd\">
 <taglib>
 <tlib-version>1.0</tlib-version>
 <jsp-version>1.2</jsp-version>
 <short-name>MyTagLib</short-name>
 <tag>
 <name>showDataTag</name>
 <tag-class>demo.tag.TagDemo</tag-class>
 <attribute>
 <name>pageSize</name>
 <required>true</required>
 <type>Integer</type>
 </attribute>
 </tag>
 </taglib>
 
 1. 标签库描述文件必须以 tld 为 文件的后缀名
 2. 标签库描述文件应该遵守 xml 语法要求
 3. 标签库描述文件的根元素 必须是 <taglib>
 4. taglib根元素下必须完成以下四个子元素
 tlib-version :  jsp-version:       short-name: 标签库描述文件的简要说明,且只能出现一次
 tag: 能出现一到多次 , 描述标签库中的标签名及你要对应的标签处理类
 5. tag元素下出现的子元素:
 name子元素:标签名
 tag-class子元素:对应的标签处理类
 attribute子元素:该标签应包含的属性
 6. attribute元素下出现的子元素:
 name:属性名
 required:该属性名可不可省略
 type:标签处理类中相关属性的类型
 5.在web.xml引入标签库描述文件
 
 <?xml version=\"1.0\" encoding=\"UTF-8\"?> [Page]
 <web-app version=\"2.4\"
 xmlns=\"http://java.sun.com/xml/ns/j2ee\"
 xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"
 xsi:schemaLocation=\"http://java.sun.com/xml/ns/j2ee
 http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd\">
 <welcome-file-list>
 <welcome-file>index.jsp</welcome-file>
 </welcome-file-list>
 <jsp-config>
 <taglib>
 <taglib-uri>MyFirstTag</taglib-uri>
 <taglib-location>/WEB-INF/MyTagLib.tld</taglib-location>
 </taglib>
 </jsp-config>
 </web-app>
 
 1. 在web.xml中实现taglib元素的子元素:
 taglib-location: 标签库描述文件在Web应用中的相对路径
 <taglib-location>/WEB-INF/MyTagLib.tld</taglib-location>
 taglib-uri:该标签库在JSP中用什么名字来调用
 <taglib-uri>abc</taglib-uri>
 2. 在要调用标签库的JSP中声明
 声明:<%@ taglib uri=\"MyFirstTag\" prefix=\"suibian\" %>
 调用:<suibian:showDataTag pageSize=\"10\"></suibian:showDataTag>
 | 
 |