自定义标签库开发(简单标签开发)

实现Tag接口,BodyTag接口,IterationTag接口的标签开发技术一般称为传统标签开发技术。

实现SimpleTag接口的标签开发技术,一般称为简单标签开发技术。

JSP2.0里新增了SimpleTag。

由于传统标签使用三个标签接口来完成不同的功能,显得过于繁琐,不利于标签技术的推广, SUN公司为降低标签技术的学习难度,在JSP 2.0中定义了一个更为简单、便于编写和调用的SimpleTag接口来实现标签的功能。实现SimpleTag接口的标签通常称为简单标签。简单标签共定义了5个方法:

setJspContext方法

  用于把JSP页面的pageContext对象传递给标签处理器对象
setParent方法
  用于把父标签处理器对象传递给当前标签处理器对象
getParent方法
  用于获得当前标签的父标签处理器对象
setJspBody方法
  用于把代表标签体的JspFragment对象传递给标签处理器对象
doTag方法
  用于完成所有的标签逻辑,包括输出、迭代、修改标签体内容等。在doTag方法中可以抛出javax.servlet.jsp.SkipPageException异常,用于通知WEB容器不再执行JSP页面中位于结束标记后面的内容,这等效于在传统标签的doEndTag方法中返回Tag.SKIP_PAGE常量的情况。

简单标签相关的控制输出逻辑都在doTag里实现

//控制标签体是否执行
public class SimpleTagDemo1 extends SimpleTagSupport {
    @Override
    public void doTag() throws JspException, IOException {
        JspFragment  jf = this.getJspBody();
        //jf.invoke(this.getJspContext().getOut());//invoke是执行标签体,如果不输出标签体,不调用invoke方法即可
    }
}
<?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>itcast</short-name>
    <uri>/simpletag</uri>

    <tag>
        <name>demo1</name>
        <tag-class>cn.itcast.web.simpletag.SimpleTagDemo1</tag-class>
        <body-content>scriptless</body-content>简单标签的标签体不能再写jsp,要写scriptless
    </tag>
</taglib>
//迭代标签体
public class SimpleTagDemo2 extends SimpleTagSupport {
    @Override
    public void doTag() throws JspException, IOException {
        JspFragment  jf = this.getJspBody();
        for(int i=0;i<5;i++){
            jf.invoke(null);  //null默认就是jf.invoke(this.getJspContext().getOut());写给浏览器
        }
    }
}
//修改标签体
public class SimpleTagDemo3 extends SimpleTagSupport {

    @Override
    public void doTag() throws JspException, IOException {
        JspFragment  jf = this.getJspBody();
        StringWriter sw = new StringWriter();带缓冲的writer
        jf.invoke(sw);写到缓冲里

        String content = sw.toString();
        content = content.toUpperCase();

        this.getJspContext().getOut().write(content);
    }
}
//控制标签余下的jsp不执行
public class SimpleTagDemo4 extends SimpleTagSupport {
    @Override
    public void doTag() throws JspException, IOException {

        throw new SkipPageException();
    }
}

invoke方法

JspFragment.invoke方法是JspFragment最重要的方法,利用这个方法可以控制是否执行和输出标签体的内容、是否迭代执行标签体的内容或对标签体的执行结果进行修改后再输出。例如:
  1. 在标签处理器中如果没有调用JspFragment.invoke方法,其结果就相当于忽略标签体内容;
  2. 在标签处理器中重复调用JspFragment.invoke方法,则标签体内容将会被重复执行;
  3. 若想在标签处理器中修改标签体内容,只需在调用invoke方法时指定一个可取出结果数据的输出流对象(例如StringWriter),让标签体的执行结果输出到该输出流对象中,然后从该输出流对象中取出数据进行修改后再输出到目标设备,即可达到修改标签体的目的。

开发带属性的标签:

自定义标签可以定义一个或多个属性,这样,在JSP页面中应用自定义标签时就可以设置这些属性的值,

通过这些属性为标签处理器传递参数信息,从而提高标签的灵活性和复用性。

要想让一个自定义标签具有属性,通常需要完成两个任务:

  1. 在标签处理器中编写每个属性对应的setter方法
  2. 在TLD文件中描术标签的属性

例子:开发带属性的标签

public class SimpleTagDemo5 extends SimpleTagSupport {

    private int count;
    private Date date;

    public void setCount(int count) {
        this.count = count;
    }

    public void setDate(Date date) {
        this.date = date;
    }

    @Override
    public void doTag() throws JspException, IOException {
        JspFragment  jf = this.getJspBody();
        this.getJspContext().getOut().write(date.toLocaleString() + "<br/>");
        for(int i=0;i<count;i++){
            jf.invoke(null);
        }
    }
}

simpletag.tld

<tag>
        <name>demo5</name>
        <tag-class>cn.itcast.web.simpletag.SimpleTagDemo5</tag-class>
        <body-content>scriptless</body-content>

        <attribute>
            <name>count</name>
            <required>true</required>
            <rtexprvalue>true</rtexprvalue>运行时表达式的值,如果为true,则可以运行时赋值,如果是false,值只能写个固定值
        </attribute>

        <attribute>
            <name>date</name>
            <required>true</required>
            <rtexprvalue>true</rtexprvalue>
        </attribute>
    </tag>
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@taglib uri="/simpletag" prefix="sitcast" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <title>开发带属性的标签</title>
  </head>

  <body>
     <sitcast:demo5 count="3" date="<%=new Date() %>">
         aaaaaa
     </sitcast:demo5>
  </body>
</html>
时间: 2024-10-24 14:59:00

自定义标签库开发(简单标签开发)的相关文章

javaweb学习总结(二十八)——JSTL标签库之核心标签

一.JSTL标签库介绍 JSTL标签库的使用是为弥补html标签的不足,规范自定义标签的使用而诞生的.使用JSLT标签的目的就是不希望在jsp页面中出现java逻辑代码 二.JSTL标签库的分类 核心标签(用得最多) 国际化标签(I18N格式化标签) 数据库标签(SQL标签,很少使用) XML标签(几乎不用) JSTL函数(EL函数) 三.核心标签库使用说明 JSTL的核心标签库标签共13个,使用这些标签能够完成JSP页面的基本功能,减少编码工作. 从功能上可以分为4类:表达式控制标签.流程控制

JSTL标签库之核心标签

一.JSTL标签库介绍 JSTL标签库的使用是为弥补html标签的不足,规范自定义标签的使用而诞生的.使用JSLT标签的目的就是不希望在jsp页面中出现java逻辑代码 二.JSTL标签库的分类 核心标签(用得最多) 国际化标签(I18N格式化标签) 数据库标签(SQL标签,很少使用) XML标签(几乎不用) JSTL函数(EL函数) 三.核心标签库使用说明 JSTL的核心标签库标签共13个,使用这些标签能够完成JSP页面的基本功能,减少编码工作. 从功能上可以分为4类:表达式控制标签.流程控制

javaweb学习总结(二十八)——JSTL标签库之核心标签【转】

原文地址:javaweb学习总结(二十八)——JSTL标签库之核心标签 一.JSTL标签库介绍 JSTL标签库的使用是为弥补html标签的不足,规范自定义标签的使用而诞生的.使用JSLT标签的目的就是不希望在jsp页面中出现java逻辑代码 二.JSTL标签库的分类 核心标签(用得最多) 国际化标签(I18N格式化标签) 数据库标签(SQL标签,很少使用) XML标签(几乎不用) JSTL函数(EL函数) 三.核心标签库使用说明 JSTL的核心标签库标签共13个,使用这些标签能够完成JSP页面的

javaWeb学习总结(9)- JSTL标签库之核心标签

一.JSTL标签库介绍 JSTL标签库的使用是为弥补html标签的不足,规范自定义标签的使用而诞生的.使用JSLT标签的目的就是不希望在jsp页面中出现java逻辑代码 二.JSTL标签库的分类 核心标签(用得最多) 国际化标签(I18N格式化标签) 数据库标签(SQL标签,很少使用) XML标签(几乎不用) JSTL函数(EL函数) 三.核心标签库使用说明 JSTL的核心标签库标签共13个,使用这些标签能够完成JSP页面的基本功能,减少编码工作. 从功能上可以分为4类:表达式控制标签.流程控制

Web---JSTL(Java标准标签库)-Core核心标签库、I18N国际化、函数库

前面为JSTL中的常用EL函数,后面的为具体演示实例! JSTL简介: JSTL(Java Standard Tag Library) –Java标准标签库. SUN公司制定的一套标准标签库的规范. JSTL标签库,是由一些Java类组成的. JSTL组成: JSTL –Core 核心标签库. 重点 JSTL – I18N - 国际化标签库.Internationalization- I18N JSTL – SQL – 数据库操作标签(有悖于MVC设计模式),现在都不用这个. JSTL - Fu

JSP标准标签库(JSTL)--XML标签库 x

³在开发中XML解析的操作是非常烦琐的,幸运的是在JSTL中专门提供了用于XML解析的操作,这样用户就可以不用费力的去研究SAX或DOM等操作的使用,就可以轻松的进行XML文件的解析处理. XML标签: No. 功能分类 标签名称 描述 1 核心操作 <x:out> 输出XPath指定的内容 2 <x:parse> 进行XML解析 3 <x:set> 将内容保存在属性范围之中 4 流程控制 <x:if> 判断XPath指定的内容是否满足条件 5 <x:

JSP标准标签库(JSTL)--国际化标签库 fmt

JSTL中使用fmt.tld作为格式化标签库的定义文件 No. 功能分类 标签名称 描述 1 国际化标签 <fmt:setLocale> 设置一个全局的地区代码 2 <fmt:requestEncoding> 设置统一的请求编码   信息显示标签 <fmt:bundle> 设置临时的要读取资源文件的名称   <fmt:message> 通过key取得value,通过<fmt:param>向动态文本中设置内容   <fmt:setBundle

JSTL标签库中fmt标签,日期,数字的格式化

首先介绍日期的格式化:(不要嫌多哦) JSTL格式化日期(本地化) 类似于数字和货币格式化,本地化环境还会影响生成日期和时间的方式. <%@ page pageEncoding="UTF-8" %><%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %><%@ taglib prefix="fmt" uri="htt

Jstl之核心标签库与格式标签库使用

JSTL(JSP Standard Tag Library.JSP标准标签库)是一个不断完好的开放源码的JSP标签库.是由apache的jakarta小组来维护的.JSTL仅仅能运行在支持JSP1.2和Servlet2.3规范的容器上,如tomcat 4.x.在JSP 2.0中也是作为标准支持的. JSTL 1.0 公布于 2002 年 6 月,由四个定制标记库(core.format.xml 和 sql)和一对通用标记库验证器(ScriptFreeTLV 和 PermittedTaglibsT

nginx自定义站点目录及简单编写开发网页内容讲解

[[email protected] conf]# egrep -v "^$|#" nginx.conf.default >nginx.conf[[email protected] conf]# pwd/application/nginx/conf [[email protected] conf]# vim nginx.conf   1 worker_processes  1;   2 events {   3     worker_connections  1024;   4