在sun官方文档上有下面这样一段话。

官方文档声明

public interface SimpleTag
extends JspTag
Interface for defining Simple Tag Handlers.
Simple Tag Handlers differ from Classic Tag Handlers in that instead of supporting doStartTag() and doEndTag(), the SimpleTag interface provides a simple doTag() method, which is called once and only once for any given tag invocation. All tag logic, iteration, body evaluations, etc. are to be performed in this single method. Thus, simple tag handlers have the equivalent power of BodyTag, but with a much simpler lifecycle and interface.

To support body content, the setJspBody() method is provided. The container invokes the setJspBody() method with a JspFragment object encapsulating the body of the tag. The tag handler implementation can call invoke() on that fragment to evaluate the body as many times as it needs.

A SimpleTag handler must have a public no-args constructor. Most SimpleTag handlers should extend SimpleTagSupport.

生存周期及调用流程

The following is a non-normative, brief overview of the SimpleTag lifecycle. Refer to the JSP Specification for details.

  • A new tag handler instance is created each time by the container by calling the provided zero-args constructor. Unlike classic tag handlers, simple tag handlers are never cached and reused by the JSP container.
  • The setJspContext() and setParent() methods are called by the container. The setParent() method is only called if the element is nested within another tag invocation.

    The setters for each attribute defined for this tag are called by the container.
  • If a body exists, the setJspBody() method is called by the container to set the body of this tag, as a JspFragment. If the action element is empty in the page, this method is not called at all.
  • The doTag() method is called by the container. All tag logic, iteration, body evaluations, etc. occur in this method.
  • The doTag() method returns and all variables are synchronized.

简单标签使用小案例

必知必会:简单标签也是一个标签,所以声明的过程也Tag的一样,同样是三步。

  • 创建继承SimpleTag类的实现类,重写doTag方法
  • 在tld文件中进行严格的声明
  • 在jsp页面中taglib的命名空间及标签前缀的声明,然后进行调用自定义的简单标签

  • 第一步:创建实现类:
package web.simpletag;

import java.io.IOException;
import java.io.StringWriter;

import javax.servlet.jsp.JspException;
import javax.servlet.jsp.PageContext;
import javax.servlet.jsp.SkipPageException;
import javax.servlet.jsp.tagext.JspFragment;
import javax.servlet.jsp.tagext.SimpleTagSupport;

/**
 * 控制标签体是否执行
 * @author Summer
 *
 */
public class BodyController extends SimpleTagSupport {
    static{
        /*
         * 简单标签整体的执行流程如下:
         * 1.浏览器向web服务器发送请求,然后web服务器调用servlet(jsp)
         * 2.complier解释器进行初始化工作,先是调用setJspContext方法,将pageContext对象传递进去
         * 3.然后是看看此标签的父标签,即setParent方法
         * 4.再就是调用doTag方法了吧?但是要知道doTag内部会使用JspFragment对象,所以就必须先得到它,因此应该是调用setJspBody(JspFragment jspBody)方法
         * 5.最后是调用doTag 方法,执行相关的代码逻辑
         */
    }

    /**
     * 简单标签可以使用这一个方法实现所有的业务逻辑
     */
    @Override
    public void doTag() throws JspException, IOException {
        //代表标签体的对象
        JspFragment fragment = this.getJspBody();
        //fragment.invoke(null);是指将标签中的内容写给谁,null代表浏览器

        //1.修改标签体的内容
//      fragment.invoke(null);

        //2.控制标签体内容的重复输出
//      for(int i=1;i<=5;i++){
//          fragment.invoke(null);//设置为null,默认为向浏览器输出
//      }

        //3.修改标签体的内容
        PageContext context = (PageContext) fragment.getJspContext();
        StringWriter writer = new StringWriter();
        fragment.invoke(writer);
        String content = writer.getBuffer().toString();

        this.getJspContext().getOut().write(content.toUpperCase());

        //4.控制jsp页面的执行与否,只需要掌握一个原理即可
        /*
         * SkipPageException - If the page that (either directly or indirectly) invoked this
         * tag is to cease evaluation. A Simple Tag Handler generated from a tag
         *  file must throw this exception if an invoked Classic Tag Handler
         *   returned SKIP_PAGE or if an invoked Simple Tag Handler threw
         *    SkipPageException or if an invoked Jsp Fragment threw a
         *    SkipPageException.
         */
//      throw new SkipPageException();
    }

}

  • 在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>JSTL 1.1 XML library</description>
    <display-name>JSTL XML</display-name>
    <tlib-version>1.1</tlib-version>
    <short-name>x</short-name>
    <uri>/simplesummer</uri>

    <!-- 控制标签体内容的的简单标签的自定义标签 -->
    <tag>
        <name>BodyController</name>
        <tag-class>web.simpletag.BodyController</tag-class>
        <body-content>scriptless</body-content>
    </tag>
</taglib>

  • 第三步:在jsp页面中进行声明然后调用:
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@taglib uri="/simplesummer" prefix="summer"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>用SimpleTag接口实现的控制标签体内容是否执行的测试页面</title>
</head>
<body>
    <summer:BodyController>Summer</summer:BodyController>

</body>
</html>

  • 总结:

  • 简单标签可以替代BodyTag接口完成同样的操作,但是有更加的简单和轻便
  • 简单标签lifeCycle逻辑清晰,调用规则明确
  • 使用相关流对象就可以完成对标签体的操控maniplate

JSP自定义标签之简单标签入门的更多相关文章

  1. 传智播客JavaWeb day07、day08-自定义标签(传统标签和简单标签)、mvc设计模式、用户注册登录注销

    第七天的课程主要是讲了自定义标签.简单介绍了mvc设计模式.然后做了案例 1. 自定义标签 1.1 为什么要有自定义标签 前面所说的EL.JSTL等技术都是为了提高jsp的可读性.可维护性.方便性而取 ...

  2. JSP自定义tag控件标签

    JSP支持自定tag的方法,那就是直接讲JSP代码保存成*.tag或者*.tagx的标签定义文件.tag和tagx文件不仅支持经典jsp代码,各种标签模版代码,还支持xml样式的jsp指令代码. 按照 ...

  3. JavaWeb学习记录(十九)——jstl自定义标签之简单标签

    一.简单标签共定义了5个方法: setJspContext方法 setParent和getParent方法 setJspBody方法 doTag方法 二.方法介绍 osetJspContext方法 用 ...

  4. JSP标签编程--简单标签

    javax.servlet.jsp.tagext里的类SimpleTagSupport 使用SimpleTagSupport类一网打尽以往复杂的标签开发,直接使用doTag()方法 java文件: p ...

  5. 3_Jsp标签_简单标签_防盗链和转义标签的实现

    一概念 1防盗链 在HTTP协议中,有一个表头字段叫referer,采用URL的格式来表示从哪儿链接到当前的网页或文件,通过referer,网站可以检测目标网页访问的来源网页.有了referer跟踪来 ...

  6. struts2 标签为简单标签

    <s:form method="post" action="" theme="simple"> <s:textfield ...

  7. JSP自定义标签就是如此简单

    tags: JSP 为什么要用到简单标签? 上一篇博客中我已经讲解了传统标签,想要开发自定义标签,大多数情况下都要重写doStartTag(),doAfterBody()和doEndTag()方法,并 ...

  8. JSP自定义标签——简单标签(1)

    前面一篇博客介绍了自定义标签的传统标签使用方式,但是我们会发现,使用传统标签非常的麻烦,而且接口还多,现在传统标签基本都没用了,除了一些比较久的框架.Sun公司之后推出了一个新的标签使用方式,称之为简 ...

  9. JSP第七篇【简单标签、应用、DynamicAttribute接口】

    为什么要用到简单标签? 上一篇博客中我已经讲解了传统标签,想要开发自定义标签,大多数情况下都要重写doStartTag(),doAfterBody()和doEndTag()方法,并且还要知道SKIP_ ...

随机推荐

  1. python 2week

    本节内容 列表.元组操作 字符串操作 字典操作 集合操作 文件操作 字符编码与转码 列表是我们最以后最常用的数据类型之一,通过列表可以对数据实现最方便的存储.修改等操作 定义列表 1 names =  ...

  2. python map filter reduce的优化使用

    这篇讲下python中map.filter.reduce三个内置函数的使用方式,以及优化方法. map()函数 map()函数会根据提供的函数对指定序列做映射. 语法: map(function,it ...

  3. NModBus的使用

    前言:最近在做一个项目,需要使用ModBus RTU与PLC进行通讯,现在将使用过程记录,以便备查. 一.什么是ModBus通讯协议 Modbus协议是应用于电子控制器上的一种通用语言,此协议支持传统 ...

  4. 初识RabbitMQ系列之三:.net 如何使用RabbitMQ

    话不多说,直接上代码! 一:搭建一个解决方案框架:RabbitMQ_Demo 其中包含4个部分: 1:RabbitMQ 公用类库项目 2:一个生产者控制台项目 3:两个消费者控制台项目 项目结构如图: ...

  5. Firebird数据库相关操作

    Firebird常用SQL 一.分页写法小例: 1 select first 10 templateid,code,name from template ; 2 select first 10 ski ...

  6. Matlab中数据的存储方式

    简介 MATLAB提供了丰富的算法以及一个易于操作的语言,给算法研发工作者提供了很多便利.然而MATLAB在执行某些任务的时候,执行效率偏低,测试较大任务量时可能会引起较长时间的等待.未解决这个问题, ...

  7. miracl去除某些特殊信息

    只需要在mirdef.h中增加定义 #define MR_STRIPPED_DOWN  即可在编译的时候,去掉错误信息 #define MIRACL 32 #define MR_LITTLE_ENDI ...

  8. OC基础之推荐一个旋转木马(跑马灯)效果的图片展示Demo

    这个旋转木马(跑马灯)效果的图片展示Demo,包括设定旋转方向,图片倒影,背景设置,旋转速度,开始结束,点击显示选中的图片,彩色的块展示等等功能 效果图:(源码下载:https://github.co ...

  9. Dynamics CRM2013 导入解决方案(快速视图窗体)SystemForm With Id Does Not Exist的解决方法

    在CRM2013的环境下导入解决方案报错,具体报错截图如下 根据id去数据库中查找这个id的systemform,确认是存在的,而且通过第二条记录我们也可以看到这个systemform属于哪个实体,我 ...

  10. JavaScript DOM详解

    欢迎转载,转载请标明出处: http://blog.csdn.net/johnny901114/article/details/52727448 本文出自:[余志强的博客] 一.DOM概述 D: Do ...