JSP自定义标签之简单标签入门-阿里云开发者社区

开发者社区> 郭璞> 正文

JSP自定义标签之简单标签入门

简介: 在sun官方文档上有下面这样一段话。 官方文档声明 public interface SimpleTag extends JspTag Interface for defining Simple Tag Handlers.
+关注继续查看

在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自定义标签之简单标签入门
在sun官方文档上有下面这样一段话。 官方文档声明 public interface SimpleTag extends JspTag Interface for defining Simple Tag Handlers.
705 0
Android 自定义Toast,并且勘误Android工具类里面的ToastUtils
前言 相信大部分仁兄在使用系统Toast的时候,都感觉不太尽如人意,因为系统Toast显示的位置比较固定,并且字体颜色等会跟随系统版本变化,那么能不能自己写一个呢,答案是当然的。
933 0
[JSP]自定义标签库taglib
自定义标签的步骤 自定义标签的步骤大概有三步: 1.继承javax.servlet.jsp.tagext.*下提供的几个标签类,如Tag、TagSupport、BodyTagSupport、SimpleTagSupport(JSP2.0)。
734 0
QuickPager asp.net 分页控件、表单控件等自定义控件下载 和介绍 【2009.09.07更新】
  最新下载地址: 自然框架的源代码、Demo、数据库、配置信息管理程序下载(2010.01.25更新)     QuickControl web控件集包含的控件 QuickControl web控件集——基本控件: 控件名称 说明 详细介绍 MyTextBox ...
960 0
AngularJS 自定义服务
angular中的service叫做服务,用来封装常用的函数。就像java中的Util类一样。 定义 以PathUtil服务为例,定义见下: 'use strict'; /** * url的前缀固定,后缀会变,所以封装成服务,减少代码量 */ angular.module('myApp') .service('PathUtil', function PathUtil() {
1086 0
WPF一步步实现完全无边框自定义Window(附源码)
原文:WPF一步步实现完全无边框自定义Window(附源码)    在我们设计一个软件的时候,有很多时候我们需要按照美工的设计来重新设计整个版面,这当然包括主窗体,因为WPF为我们提供了强大的模板的特性,这就为我们自定义各种空间提供了可能性,这篇博客主要用来介绍如何自定义自己的Window,在介绍整个写作思路之前,我们来看看最终的效果。
1017 0
+关注
郭璞
一切就交给时间,它会给我答案。
369
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
《2021云上架构与运维峰会演讲合集》
立即下载
《零基础CSS入门教程》
立即下载
《零基础HTML入门教程》
立即下载