技术教程 | 经验技巧 | 网络专区 | 安全防线 更多 >>
J2EE自定义标签的详细介绍
2008-5-14 22:12:27  (人气:)
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>
评论 】 【 打印 】 【 关闭