转载自:http://www.blogjava.net/haizhige/archive/2008/10/26/236783.html,个人进行了一些修改。

前言:写一个taglib一般可以继承SimpleTagSupport或TagSupport,但是后者比较复杂如:在“<”处触发 doStartTag 事件,在“>”时触发 doEndTag 事件,通常在 doStartTag 里进行逻辑操作,在 doEndTag 里控制输出;而前者只需实现自己的doTag方法即可。

而功能性而言前者自定义标签的content里不能有scriptlet语言(Java语言),而后者可以设置有,但是一来不建议在jsp里有scriptlet,二来前者的功能也足够了。

1、简单标签
    实现自定义标签的三个步骤:
    1)编写标签处理程序(java类)。
    2)编写标签库描述符(提供有关标签和库文件的元信息的XML文件)。
    3)JSP实现(包含自定义标签的JSP文件)。
2、开发简单的自定义标签
    1)标签处理程序wz.java的源代码如下:

package www.zzz;
import javax.servlet.jsp.tagext.*;
import java.io.*;
import java.util.*;
import javax.servlet.jsp.*;
public class wz extends SimpleTagSupport{
    private String name;
    private int age;
  // name即为此标签的属性之一,如<c:out name="aaa" />,然后解析到此处时会调用此Tag的setName(..),并调用doTag()方法
    public void setName(String name) {
        this.name = name;
    }
    public void setAge(int age) {
        this.age = age;
    }
  /*

  HttpSession session=((PageContext)this.getJspContext()).getSession();

  HttpServletRequest request=(HttpServletRequest) ((PageContext)this.getJspContext()).getRequest();

  */
    public void doTag() throws JspException, IOException {
        JspWriter out = this.getJspContext().getOut();
        out.println("<h3>"+name+"的个人信息:</h3><br>");
        getJspContext().setAttribute("name","姓名:"+name+"<br>");
        getJspContext().setAttribute("age", "年龄:"+age+"<br>");
        getJspBody().invoke(null);  // 如果没有这一句则不会输出标签的content到jsp页面,且输出content的位置也跟调用invoke(null)的位置有关,现在的情况content会在<h3>....的个人信息...</h3><br>后面输出
    }
}

2)标签描述文件wz.tld的内容如下:

<?xml version="1.0" encoding="UTF-8" ?>
<taglib 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-jsptaglibrary_2_0.xsd"
    version="2.0">
    <description>
        A tag library exercising SimpleTag handlers.
    </description>
    <tlib-version>1.0</tlib-version>
    <short-name>SimpleTagLibrary</short-name>
    <uri>/SimpleTagLibrary</uri>
    <tag>
        <description>Outputs Hello, World</description>
        <name>wz</name>
        <tag-class>www.zzz.wz</tag-class>
        <body-content>scriptless</body-content><!-- 可以有HTML、EL表达式但可以有内部的tag吗,经过测试可以有内部的自定义tag,且Tomcat处理Tag的顺序是先处理外部的Tag,再处理内部嵌套的Tag,内部的Tag的EL表达式里可以引用外部Tag设置的attribute,Tag不能处理Tag只能由Tomcat处理,Tomcat处理完外部Tag后外部Tag返出内容,包括未处理的内部Tag(位置就是相对于外部Tag的content的位置),然后Tomcat再处理内部Tag;内部Tag的输出位置就是外部Tag的content的输出位置; -->
        <attribute>
            <name>name</name>
            <required>true</required>
            <rtexprvalue>true</rtexprvalue>
        </attribute>    
        <attribute>
            <name>age</name>
            <required>true</required>
            <rtexprvalue>true</rtexprvalue>
        </attribute>    
    </tag>
</taglib>

3)引入标签的JSP页面的源码:

<%@ page contentType="text/html; charset=GBK"%>
<!-- 还可以用tld中声明的uri -->
<%@ taglib uri="/WEB-INF/tld/wz.tld" prefix="mytag"%>
<html>
    <body>
        <mytag:wz name="张三" age="15">
            ${name}
            ${age}
        </mytag:wz>        
    </body>
</html> 

注:编译后的类文件放到WEB-INF/classes目录下,描述文件tld放到WEB-INF/tld目录下(放在WEB-INF目录下即可(包括N级子目录),因为有uri引用吧),tag文件保存到web应用的WEB-INF/tags目录下。
    4)对wz.tld文件的解释:
    tlib-version:是必须的元素,指定标记库函数的版本号。
    short-name:为标记库指定一个缩略名称,用它可以作为标记库的默认名字空间。
    info:用来描述标记的文档信息,默认值为空。
    uri:用来指定连接到标记的附加源文件,即tld的公共可用副本。
    tag:是标记描述文件中最重要的一个元素,有6个子元素:name、tagclass、teiclass、bodycontent、info、attribute。
            name:用户指定的标记名称。
            tag-class:指定标记处理类,写全名,即带包的类。
            bodycontent:说明标记体的类型,分为4种:empty、jsp、scriptless、tagdependent。
                        empty:表示没有标记体(即不能有content内容)。 
                        jsp:表示标记体可以为jsp代码(<% int a=3; %>之类的还是<jsp:..之类的??)。
                        scriptless:表示标记中的content里不能用scriptlet脚本or<jsp:??(但是可以有其它标记/标签??)。
                        tagdependent:表示标签中的内容交给标记处理程序去进行处理(比如content是${name}也会看成是普通字符串??)。
            info:记录标记的描述信息。
            attribute:用来指定零个或者多个标记属性,有三个子元素:name、required、rtextprvalue(设置为true则属性值可以是动态的如name="${nameValue}")。
                        name:必须设定,用来表示大小写敏感属性名称。
                        required:必须设定,标示属性是否一定要存在,默认为flase,即在标记处理程序中不会自动调用属性
                                                    的setAttribue方法。
                        rtextprvalue:用来说明属性是否可以是动态生成的,但设定为true时,属性即可以是一个常量值,也可
                                                    以由表达式生成。
 3、标签文件,是JSP2.0新增的功能,目的是让JSP网页开发人员能够直接使用JSP语法来制作标签,而无须了解java语言。其扩展名都是.tag或.tagx。假如Tag File包含其他完整的或片段的Tag File,JSP2.0规范建议扩展名为.tagf。
    1)Tag File的7个隐式对象:request、response、out、jspContext、session、application、config。
    2)Tag File的指令:
                tag        如同JSP网页的page指令。
                taglib    如同JSP网页的taglib指令。
                include  如同JSP网页的include指令。
                attribute 用来设定自定义标签的属性。
                variable 用来设TagFile的变量,此变量可回传至JSP网页。
    3)新增的几个动作:
                <jsp:attribute>标签:用来指定自定义标签属性块,必要时可以作为代码段输出。
                <jsp:doBody>标签:告诉容器去处理body,并且将处理结果添加到response中,可以有选择地使用"var"属性,捕获处理的结果,并在下一步进行处理。
                <jsp:invoke>标签:对作为属性传递的特定参数进行操作。
    4)开发并使用一个日期标签:datetag.tag与datetag.jsp
    datetag.tag的代码如下:

<%@tag pageEncoding="GBK"%>
<%@tag import="java.util.*,java.text.*"%>
<%@variable name-given="fulldate" scope="AT_BEGIN"%>
<%
  DateFormat fullformate = DateFormat.getDateInstance(DateFormat.FULL);
  Date now = new Date();
  jspContext.setAttribute("fulldate", fullformate.format(now));
%>
<jsp:doBody/>  

datetag.jsp的代码如下:

<%@ page contentType="text/html; charset=GBK"%>
<%@ taglib prefix="mytag" tagdir="/WEB-INF/tags/"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>

<html>
    <body>
        <h1>
            日期tag标签文件演示
        </h1>
        <mytag:datetag>
              标签体的输出:${fulldate}<br>
        </mytag:datetag>
        页面的输出:${fulldate}
    </body>
</html>

5)开发并使用一个求和标签:sumtag.tag与sumtag.jsp
    sumtag.tag的代码如下:

<%@tag pageEncoding="GBK"%>
<%@attribute name="items" required="true" rtexprvalue="true"%>
<%@attribute name="great" fragment="true"%>
<%@attribute name="less" fragment="true"%>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%@variable name-given="sum" variable-class="java.lang.Object"%>
<c:if test="${not empty items}">
    <c:forEach items="${items}" var="item">
        <c:set var="sum" value="${item+sum}" />
    </c:forEach>

    <c:if test="${sum>=1000}">
        <jsp:invoke fragment="great" />
    </c:if>

    <c:if test="${sum<1000}">
        <jsp:invoke fragment="less" />
    </c:if>
</c:if>

sumtag.jsp的代码如下:

<%@ page contentType="text/html; charset=GBK"%>
<%@ taglib prefix="mytag" tagdir="/WEB-INF/tags/"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<html>
    <body>
        <mytag:sumtag items="111,222,333">
            <jsp:attribute name="great">
                <font color="red"> SUM: ${sum}</font>
            </jsp:attribute>
            <jsp:attribute name="less">
                <font color="blue"> SUM: ${sum}</font>
            </jsp:attribute>
        </mytag:sumtag>
    </body>
</html>

注:tag文件保存到web应用的WEB-INF/tags目录下。
4、JSP标记与JavaBean有何区别?
    答:JavaBean存在先天的不足,它只是可复用组件,独立于运行环境而包装了一些数据和业务逻辑功能,无法获得运行环境信息,无法与JSP页面进行更加深层次的交互。自定义标记机制解决了它的这种的缺陷,标记库的处理类不但具有JavaBean的功能,而且可以把JSP的环境住处传到类中间,不但能得到JSP传递过来的属性,还能与JSP共用页面环境,JSP页面中可以通过session、page与标记处理程序进行数据通信,这一点是javaBean所不能实现的。

jsp程序设计:jstl之JSTL标签库的更多相关文章

  1. JSTL之迭代标签库

    JSTL之迭代标签库 JSTL的全称是 Java Server Pages Standard Tag Library,翻译过来就是JSP标准标签库,它包含了在开发JSP页面时经常用到的一组标准标签.这 ...

  2. Java_jsp.jstl.Function函数标签库.记录

    JSTL Functions标签库 本书第12章的12.3节(定义和使用EL函数)介绍了EL函数的创建和使用方法.在JSTL Functions标签库中提供了一组常用的EL函数,主要用于处理字符串,在 ...

  3. (5)JSTL的xml标签库

    Jstl的XML标签库 JSTL提供了操作xml文件的标签库,使用xml标签库可以省去使用Dom和SAX标签库的繁琐,能轻松的读取xml文件的内容. <%@ taglib uri="h ...

  4. (4)JSTL的SQL标签库

    jstl的SQL标签库 SQL tag Library中的标签用来提供在 JSP 页面中可以与数据库进行交互的功能Database access标签库有以下6组标签来进行工作: <sql:set ...

  5. JSTL I18N 格式标签库

    <%@ page language="java" pageEncoding="gbk"%> <%@ taglib prefix="c ...

  6. JSTL (标准标签库)

    JSTL(标准标签库) 作用: Web程序员能够利用JSTL和EL来开发Web程序,取代传统直接在页面上嵌入Java程序(Scripting)的做法,以提高程序的阅读性.维护性和方便性. 使用方法:J ...

  7. java攻城师之路--复习java web之jsp入门_El表达式_JSTL标签库

    JSP 技术掌握:JSP语法 + EL + JSTL 为什么sun推出 JSP技术 ? Servlet 生成网页比较复杂,本身不支持HTML语法,html代码需要通过response输出流输出,JSP ...

  8. 复习java web之jsp入门_El表达式_JSTL标签库

    JSP 技术掌握:JSP语法 + EL + JSTL 为什么sun推出 JSP技术 ? Servlet 生成网页比较复杂,本身不支持HTML语法,html代码需要通过response输出流输出,JSP ...

  9. 关于在jsp页面中使用/struts-tags标签库的迭代器时,从ValueStack获取参数使用EL的问题

    情况复原下: 通过valuestack存了个user,然后页面里可以${user.sex}拿到男.${user.sex=='男'}拿到ture 但是在使用 <s:if text="${ ...

  10. jsp如何自定义tag的标签库?

    虽然和上一次的使用自定义的tld标签简化jsp的繁琐操作的有点不同,但是目的也是一致的.自定义tag比较简单. 1.新建tag标签 在WEB-INF目录下新建一个tags的文件夹,是自定义tag标签的 ...

随机推荐

  1. [DP]P2890 [USACO07OPEN]便宜的回文Cheapest Palindrome

    题目翻译(借鉴自@ 神犇的蒟蒻) [问题描述] 追踪每头奶牛的去向是一件棘手的任务,为此农夫约翰安装了一套自动系统.他在每头牛身 上安装了一个电子身份标签,当奶牛通过扫描器的时候,系统可以读取奶牛的身 ...

  2. CSS-笔记1-选择器与文本元素

    知识点一: CSS概念:CSS 指层叠样式表 (Cascading Style Sheets)(级联样式表) Css是用来美化html标签的,相当于页面化妆. 知识点二: 选择器格式与部分属性: 写法 ...

  3. OC面向对象的三大特性

    一.面向对象的三大特性:封装(成员变量).继承和多态 1. set方法和get方法 1. set方法和get方法的使用场合 @public的成员可以被随意赋值,应该使用set方法和get方法来管理成员 ...

  4. debug断点调试

    debug断点调试  1,虫子启动2,F6   执行断点的下一步,下一个语句     F5    进入方法     F8   执行到结束    查看表达式的值:选中查看的表达式,接着按   ctrl ...

  5. Less的转义字符

    Less的转义字符 有时候,当需要引入无效的CSS语法或Less不能识别的字符,就需要使用转义字符.此时,就可以在字符串前面加一个 ~,并将需要转义的字符串放在 "" 中.格式为: ...

  6. [阿里云部署] Ubuntu+Flask+Nginx+uWSGI+Mysql搭建阿里云Web服务器

    部署地址:123.56.7.181 Ubuntu+Flask+Nginx+uWSGI+Mysql搭建阿里云Web服务器 这个标题就比之前的"ECS服务器配置Web环境的全过程及参考资料&qu ...

  7. java并发包下的并发工具类

    1.Exchanger 功能:用于线程间数据的交换 应用场景:1)遗传算法,目前还不是特别理解  2)校对工作,假设A,B线程做同一件任务,可以通过数据校验判断两线程是否正确的工作 例子:是一个简单的 ...

  8. 一道JS 连续赋值运算的问题

    原文链接:https://www.cnblogs.com/joesbell/p/6229423.html <script> var a = {n:1}; var b = a; a.x = ...

  9. Just for 面试

    ZOJ题目分类 初学者题: 1001 1037 1048 1049 1051 1067 1115 1151 1201 1205 1216 1240 1241 1242 1251 1292 1331 1 ...

  10. 揭秘 HashMap 实现原理(Java 8)

    HashMap 作为一种容器类型,无论你是否了解过其内部的实现原理,它的大名已经频频出现在各种互联网面试中了.从基本的使用角度来说,它很简单,但从其内部的实现来看(尤其是 Java 8 的改进以来), ...