`

JSP总结二------tablig指令与自定义标签

阅读更多

                                   Tiglib指令与自定义标签

<!--[if !supportLists]-->1.       <!--[endif]-->taglib指令

JSP页面中,可以直接使用JSP提供的一些动作元素标记来完成特定功能,如使用<jsp:include>包含一个文件。通过使用taglib指令,开发者就可以在页面中使用这些基本标记或自定义的标记来完成特殊的功能。

taglib指令的使用格式如下:

<%@ taglib uri="tagURI" prefix="tagPrefix" %>

 

参数说明

 

uri属性:该属性指定了JSP要在web.xml文件中查找的标签库描述符,该描述符是一个标签描述文件(*.tld)的映射。在tld标签描述文件中定义了该标签库中的各个标签名称,并为每个标签指定一个标签处理类。另外,通过uri属性直接指定标签描述文件的路径,而无需在web.xml文件中进性配置,同样可以使用指定的标记。

 

prefix属性:该属性指定一个在页面中使用由uri属性指定的标签库的前缀。但是前缀命名不能为:jspjspxjavajavaxsunservletsunw开发者可以通过前缀来引用标签库中的标签。

一个简单的使用JSTL的代码:

<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>

<c:set var="name" value="hello"/>
上述代码通过<c:set>标签将“hello”值赋给了变量“name”

 

引入strut2的标签:

 <%@ tablig=”/struts-tag”  prefix=”s”%>

 

2. 自定义标签

步骤如下

1) 实现自己的处理类,一般是从TagSupportBodyTagSupport继承

2) 写自定义Tagtld文件

3) web.xml中指定你的tld文件(现在的服务器可以不需要此步骤)

4) JSP页面使用自定义标签

 

Tag属性

 Tag.EVAL_BODY_INCLUDE 包含主体内容
                Tag.SKIP_BODY    
不包含主体内容
                Tag.EVAL_PAGE     
包含后面的页面内容 
                Tag.SKIP_PAGE    
不包含主体的内容

 

Tag的生命周期:

 

tag的生命周期

 

3 通过继承TagSupport来实现自定义标签

 

示例,一个简单的标签:

1)自定义类:

 

package mytag;

 

import java.io.IOException;

 

import javax.servlet.jsp.JspException;

import javax.servlet.jsp.JspWriter;

import javax.servlet.jsp.tagext.TagSupport;

 

public class OutputTag extends TagSupport {

    private static final long serialVersionUID = -1696650192224172611L;

 

    @Override

    public int doStartTag() throws JspException {

       // TODO Auto-generated method stub

       JspWriter out = this.pageContext.getOut();

       try {

           out.println("Hello World!");

       } catch (IOException e) {

           // TODO Auto-generated catch block

           e.printStackTrace();

       }

       return super.doStartTag();

    }

    }

 

2自定义Tagtld

 

<?xml version="1.0" encoding="UTF-8"?> 

<!DOCTYPE taglib PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.2//EN" "web-jsptaglibrary_1_2.dtd" > 

<taglib> 

  <tlibversion>1.0</tlibversion>  <!-- 你自定义标签的版本数 --> 

  <jsp-version>1.2</jsp-version>  <!-- 指定你的JSP版本,扩张签是在JSP1.2之后兼容的 --> 

  <shortname>out</shortname> <!-- 标签的简写 --> 

  <tag> 

    <name>tags</name>  <!-- 标签名字 --> 

    <tagclass>mytag.OutputTag</tagclass>  <!-- 指定你的标签的类 --> 

  </tag> 

</taglib>

 

其中,标签库元素<taglib>属性:表格如下

<taglib>属性表格</taglib>

属性

描述

tlib-version

本标签库实现版本

jsp-version

标签库依赖的JSP版本

short-name

JSP创作工具使用的一个短的默认名词

uri

指定这个标签库的uri信息

display-name

被工具使用的显示用的名字

small-icon

被工具使用的小图标

large-icon

被工具使用的大图标

description

本标签的描述

validator

TLD验证信息

listener

实践监听器规范

        tag标签相关属性:

tag标签相关属性表

属性

描述

name

tag标签唯一的名称

tag-class

tag标签的处理类

tei-class

tag标签的TagExtraInfo

body-content

标签主体的内容

display-name

显示的名称

small-icon

被工具使用的小图标

large-icon

被工具使用的大图标

description

本标签的描述

variable

脚本变量的信息

attribute

标签属性的信息

 

 

3web.xml中指定你的tld文件

    <jsp-config>

       <taglib>

           <!--设置自定义标签的uri(不一定存在,但是一定要唯一),为页面的部署做好准备 -->

           <taglib-uri>http://test.com/mytag.tld</taglib-uri>

           <!--定位你的tld文件的相对路径   -->

           <taglib-location>/WEB-INF/mytag.tld</taglib-location>

       </taglib>

    </jsp-config>

 

4)在JSP页面中使用

 

<%@ page language="java" import="java.util.*" pageEncoding="ISO-8859-1"%>

<%-- <%@ taglib uri="/WEB-INF/mytag.tld" prefix="out" %> --%>

<%@ taglib uri="http://test.com/mytag.tld" prefix="out" %>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">

<html>

  <head>

    <base href="<%=basePath%>">

   

    <title>My JSP 'index.jsp' starting page</title>

    <meta http-equiv="pragma" content="no-cache">

    <meta http-equiv="cache-control" content="no-cache">

    <meta http-equiv="expires" content="0">   

    <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">

    <meta http-equiv="description" content="This is my page">

    <!--

    <link rel="stylesheet" type="text/css" href="styles.css">

    -->

  </head>

 

  <body>

    <out:tags/>

  </body>

</html>

 

4.通过继承BodyTagSupport来实现自定义标签

 

BodyTagSupport的生命周期

BodyTag的生命周期 <!--[endif]-->

 

BodyTagSupport的处理流程: 
1)
当容器创建一个新的标签实例后,通过setPageContext来设置标签的页面上下文.

2) 使用setParent方法设置这个标签的上一级标签,如果没有上一级嵌套,设置为null. 

3) 设置标签的属性,这个属性在标签库描述文件中定义,如果没有定义属性,就不调用此类方法. 

4) 调用doStartTag方法,这个方法可以返回EVAL_BODY_INCLUDESKIP_BODY,当返回EVAL_BODY_INCLUDE时,就计算标签的body,如果返回SKIP_BODY,就不再计算标签的body. 

5) 调用setBodyContent设置当前的BodyContent. 

6) 调用doInitBody,如果计算BodyContent时需要进行一些初始化,就在这个方法中进行. 

7) 每次计算完Body后调用doAfterBody,如果返回EVAL_BODY_AGAIN,表示继续计算一次Body,直到返回SKIP_BODY才继续往下执行. 

8) 调用doEndTag方法,这个方法可以返回EVAL_PAGE或者SKIP_PAGE,当返回EVAL_PAGE时,容器将在标签结束时继续计算JSP页面其他的部分;如果返回SKIP_PAGE,容器将在标签结束时停止计算JSP页面其他的部分. 

9) 调用release()方法释放标签程序占用的任何资源。

 

一个简单的示例

 

1)自定义类:

 

 

package mytag;

 

 

import javax.servlet.jsp.JspTagException;

import javax.servlet.jsp.tagext.BodyContent;

import javax.servlet.jsp.tagext.BodyTagSupport;

 

public class PrintBodyTag extends BodyTagSupport { 

    private int counts; 

     

    public PrintBodyTag() { 

        super(); 

    } 

 

    public void setCounts(int counts) {  

        this.counts = counts; 

    } 

 

    public int doStartTag() throws JspTagException { 

        System.out.println("doStartTag..."); 

        if (counts > 0) { 

            return EVAL_BODY_AGAIN; 

        } else { 

            return SKIP_BODY; 

        } 

    } 

 

    public void setBodyContent(BodyContent bodyContent) { 

        System.out.println("setBodyContent..."); 

        this.bodyContent = bodyContent; 

    } 

 

    public void doInitBody() throws JspTagException { 

        System.out.println("doInitBody...."); 

    } 

 

    public int doAfterBody() throws JspTagException { 

        System.out.println("do After body..." + counts); 

        if (counts > 1) { 

            counts--; 

            return EVAL_BODY_AGAIN; 

        } else { 

            return SKIP_BODY; 

        } 

    } 

 

    public int doEndTag() throws JspTagException { 

        System.out.println("do end Tag..."); 

        try { 

            if (bodyContent != null) { 

                bodyContent.writeOut(bodyContent.getEnclosingWriter()); 

            } 

        } catch (java.io.IOException e) { 

            throw new JspTagException("IO Error: " + e.getMessage()); 

        } 

        return EVAL_PAGE; 

    }  

}

 

 

2自定义Tagtld

 

<?xml version="1.0" encoding="UTF-8"?> 

<!DOCTYPE taglib PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.2//EN" "web-jsptaglibrary_1_2.dtd" > 

<taglib> 

  <tlibversion>1.0</tlibversion>  <!-- 你自定义标签的版本数 --> 

  <jsp-version>1.2</jsp-version>  <!-- 指定你的JSP版本,扩张标签是在JSP1.2之后兼容的 --> 

  <shortname>out</shortname> <!-- 标签的简写 --> 

  <tag> 

    <name>tags</name>  <!-- 标签名字 --> 

    <tagclass>mytag.OutputTag</tagclass>  <!-- 指定你的标签的类 --> 

  </tag>

  <tag> 

    <name>bodytags</name>  <!-- 标签名字 --> 

    <tagclass>mytag.PrintBodyTag</tagclass>  <!-- 指定你的标签的类 --> 

    <attribute> 

    <name>counts</name> 

    <required>true</required> 

    <rtexprvalue>true</rtexprvalue> 

    </attribute>

  </tag> 

</taglib>

 

 

3)在JSP页面中使用

 

    <out:bodytags counts="5">HHHHHHHHHHH

    <br/>

    </out:bodytags>

 

4)执行效果

JSP页面的效果

 

HHHHHHHHHHH

HHHHHHHHHHH

HHHHHHHHHHH

HHHHHHHHHHH

HHHHHHHHHHH

 


<!--[endif]-->

控制打印的效果:

doStartTag...

setBodyContent...

doInitBody....

do After body...5

do After body...4

do After body...3

do After body...2

do After body...1

do end Tag...

 

  • 大小: 25 KB
  • 大小: 28.8 KB
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics