【自定义标签开发】04-简单标签库功能详解

我们回顾一下jsp的Tag自定义标签技术

我们的SimpleTag接口可以实现左边3种接口的功能。

这个接口的默认实现类是SimpleSupport。

接口中的方法有:

doTag()//标签开始和结束都是在这个方法中定义,标签体是setJspBody方法中的JspFragment对象。

可以抛出SkipPageException,就相当于返回了“SKIP_PAGE”,余下的jsp内容就不再执行了。

getParent()//得到父标签对象

setJspBody(JspFragment jspBody)//服务器在调用你的标签前,会将标签作为一个JspFragment对象传送过来。

setJspContext(JspContext pc)//获得JspContext(JspContext继承了PageContext)

setParent()//设置父标签对象

我们下面举一些例子来测试。

1.隐藏页面信息

我们仍然要借助标签来隐藏我们的页面信息:

<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%@taglib uri="/simpleTag" prefix="zyg2" %>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <title>用简单标签控制是否执行标签体</title>
  </head>

  <body>

     <zyg2:heddin>
         Helloworld!
     </zyg2:heddin>
  </body>

</html>

着手使用SimpleTag来实现这个<zyg2:heddin>标签,首先创建该标签类,继承了SimpleTagSupport:

接下来实现doTag()方法:

package org.zyg.web.simpletag;

import java.io.IOException;

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

//控制标签体是否执行
public class HeddinSimpleTag extends SimpleTagSupport {

	@Override
	public void doTag() throws JspException, IOException {
		JspFragment jf=this.getJspBody();//拿到标签体对象
		jf.invoke(this.getJspContext().getOut());//控制标签体执行:输出标签体

	}
}

我们这里选择了先输出标签体。

然后在WEB-INF下的lib文件夹中创建zygSimple.tld文件,并注册标签:

<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>2.0</tlib-version>
    <short-name>zyg2</short-name>
    <uri>h/simpleTag</uri><!-- 标签绑定的uri,用于引入 -->

    <tag>
        <name>heddin</name><!-- 标签名 -->
		<tag-class>org.zyg.web.simpletag.HeddinSimpleTag</tag-class>
		<body-content>scriptless</body-content><!-- 有无标签体(单标签还是成对标签) -->
    </tag>

</taglib>

我们重启Web工程,测试页面:

这是可以看到标签体内容的。

如果不想显示的话,更简单,获得标签体的时候什么也不做就行了:

package org.zyg.web.simpletag;

import java.io.IOException;

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

//控制标签体是否执行
public class HeddinSimpleTag extends SimpleTagSupport {

	@Override
	public void doTag() throws JspException, IOException {
		JspFragment jf=this.getJspBody();//拿到标签体对象
	}
}

重启Web项目测试,访问后发现信息不见了:

简单Tag就是那么简单o(^▽^)o

2.用简单标签迭代标签体

我们让“嘻嘻嘻,好犀利(*^__^*)”执行5遍

<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%@taglib uri="/simpleTag" prefix="zyg2" %>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <title>用简单标签循环标签体</title>
  </head>

  <body>

     <zyg2:repeat>
        嘻嘻嘻,好犀利(*^__^*) <br/>
     </zyg2:repeat>
  </body>

</html>

然后创建并标签类:

package org.zyg.web.simpletag;

import java.io.IOException;

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

public class RepeatSimpleTag extends SimpleTagSupport {

	@Override
	public void doTag() throws JspException, IOException {
		JspFragment jf=this.getJspBody();//拿到标签体对象
		for (int i = 0; i < 5; i++) {
			jf.invoke(this.getJspContext().getOut());
		}
	}
}

然后在zygSimple.tld中注册这个标签:

<tag>
    <name>repeat</name><!-- 标签名 -->
	<tag-class>org.zyg.web.simpletag.RepeatSimpleTag</tag-class>
	<body-content>scriptless</body-content><!-- 有无标签体(单标签还是成对标签) -->
</tag>

重启Web工程测试:

测试成功!

3.用简单标签修改标签体

让标签体文字变大写:

<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%@taglib uri="/simpleTag" prefix="zyg2" %>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <title>用简单标签循环标签体</title>
  </head>

  <body>

     <zyg2:upper>
       	   abcdefg <br/>
     </zyg2:upper>
  </body>

</html>

下面来实现<zyg2:upper>标签。

创建并编辑标签处理类:

package org.zyg.web.simpletag;

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

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

//修改标签体
public class UpperSimpleTag extends SimpleTagSupport {

	@Override
	public void doTag() throws JspException, IOException {
		JspFragment jf=this.getJspBody();//拿到标签体对象
		StringWriter sw=new StringWriter();
		jf.invoke(sw);//执行一个带缓冲的Writer

		String content=sw.toString();//获得标签体的内容
		content = content.toUpperCase();//将内容变为大写

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

}

然后在zygSimple.tld中注册这个标签:

<tag>
    <name>upper</name><!-- 标签名 -->
    <tag-class>org.zyg.web.simpletag.UpperSimpleTag</tag-class>
    <body-content>scriptless</body-content><!-- 有无标签体(单标签还是成对标签) -->
</tag>

重启Web工程测试:

测试成功!

4.用简单标签控制jsp页面的显示

前端标签效果:

<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%@taglib uri="/simpleTag" prefix="zyg2" %>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <title>用简单标签控制jsp页面的显示</title>
  </head>

  <zyg2:heddinPage/>

  <body> 

  	  Hello ! 

  </body>

</html>

下面来实现<zyg2:heddinPage/>标签。

创建并编辑标签处理类:

package org.zyg.web.simpletag;

import java.io.IOException;

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

//控制标签余下的jsp不执行
public class HeddinPageSimpleTag extends SimpleTagSupport {

	@Override
	public void doTag() throws JspException, IOException {
		//只要这个异常抛给jsp,该标签下面的jsp代码就不会执行
		throw new SkipPageException();
	}

}

然后在zygSimple.tld中注册这个标签:

<tag>
    <name>heddinPage</name><!-- 标签名 -->
    <tag-class>org.zyg.web.simpletag.HeddinPageSimpleTag</tag-class>
    <body-content>empty</body-content><!-- 有无标签体(单标签还是成对标签) -->
</tag>

重启Web工程测试:

可以看到</head>之后的代码没有显示,测试成功!

最后总结一下简单标签的执行流程:

转载请注明出处:http://blog.csdn.net/acmman/article/details/51093287

时间: 2024-10-14 01:21:52

【自定义标签开发】04-简单标签库功能详解的相关文章

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

实现Tag接口,BodyTag接口,IterationTag接口的标签开发技术一般称为传统标签开发技术. 实现SimpleTag接口的标签开发技术,一般称为简单标签开发技术. JSP2.0里新增了SimpleTag. 由于传统标签使用三个标签接口来完成不同的功能,显得过于繁琐,不利于标签技术的推广, SUN公司为降低标签技术的学习难度,在JSP 2.0中定义了一个更为简单.便于编写和调用的SimpleTag接口来实现标签的功能.实现SimpleTag接口的标签通常称为简单标签.简单标签共定义了5

html5开发手机打电话发短信功能,html5的高级开发,html5开发大全,html手机电话短信功能详解

在很多的手机网站上,有打电话和发短信的功能,对于这些功能是如何实现的呢.其实不难,今天我们就用html5来实现他们.简单的让你大开眼界. HTML5 很容易写,但创建网页时,您经常需要重复做同样的任务,如创建表单.在这...有 HTML5 启动模板.空白图片.打电话和发短信.自动完成等等,帮助你提高开发效率的同时,还带来了更炫的功能.好了,我们今天就来做一做看看效果吧!! 看代码: <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitio

SVN功能详解

SVN功能详解 TortoiseSVN是windows下其中一个非常优秀的SVN客户端工具.通过使用它,我们可以可视化的管理我们的版本库.不过由于它只是一个客户端,所以它不能对版本库进行权限管理. TortoiseSVN不是一个独立的窗口程序,而是集成在windows右键菜单中,使用起来比较方便. TortoiseSVN每个菜单项都表示什么意思 01.SVN Checkout(SVN取出)点击SVN Checkout,弹出检出提示框,在URL of repository输入框中输入服务器仓库地址

PHP5.2至5.6的新增功能详解

截至目前(2014.2), PHP 的最新稳定版本是 PHP5.5, 但有差不多一半的用户仍在使用已经不在维护 [注] 的 PHP5.2, 其余的一半用户在使用 PHP5.3 [注].因为 PHP 那"集百家之长"的蛋疼语法,加上社区氛围不好,很多人对新版本,新特征并无兴趣.本文将会介绍自 PHP5.2 起,直至 PHP5.6 中增加的新特征. PHP5.2 以前:autoload, PDO 和 MySQLi, 类型约束 PHP5.2:JSON 支持 PHP5.3:弃用的功能,匿名函数

PHP 5.2、5.3、5.4、5.5、5.6 对比以及功能详解

PHP 5.2.5.3.5.4.5.5.5.6 对比以及功能详解 截至目前(2014.2), PHP 的最新稳定版本是 PHP5.5, 但有差不多一半的用户仍在使用已经不在维护 [注] 的 PHP5.2, 其余的一半用户在使用 PHP5.3 [注]. 因为 PHP 那"集百家之长"的蛋疼语法,加上社区氛围不好,很多人对新版本,新特征并无兴趣. 本文将会介绍自 PHP5.2 起,直至 PHP5.6 中增加的新特征. PHP5.2 以前:autoload, PDO 和 MySQLi, 类型

【转】 /etc/fstab功能详解

[转] /etc/fstab功能详解 最近去客户现场时,遇到 了一个关于挂载文件/etc/fstab文件的问题,就写了一下/etc/fstab文件的作用一个文件中各个参数的含义.供大家参考有不正确的地方敬请指正. 一./etc/fstab文件的作用 磁盘被手动挂载之后都必须把挂载信息写入/etc/fstab这个文件中,否则下次开机启动时仍然需要重新挂载. 系统开机时会主动读取/etc/fstab这个文件中的内容,根据文件里面的配置挂载磁盘.这样我们只需要将磁盘的挂载信息写入这个文件中我们就不需要

Python学习教程(Python学习路线):Pandas库基础分析-详解时间序列的处理

Python学习教程(Python学习路线):Pandas库基础分析-详解时间序列的处理 在使用Python进行数据分析时,经常会遇到时间日期格式处理和转换,特别是分析和挖掘与时间相关的数据,比如量化交易就是从历史数据中寻找股价的变化规律.Python中自带的处理时间的模块有datetime,NumPy库也提供了相应的方法,Pandas作为Python环境下的数据分析库,更是提供了强大的日期数据处理的功能,是处理时间序列的利器. 1.生成日期序列 主要提供pd.data_range()和pd.p

.NET源码保护控件VMProtect免费下载及使用教程脱壳等功能详解

原文来自VMProtect龙博方案网www.fanganwang.com VMProtect是一款全新的软件保护工具.与其它大部分的保护程序不同,VMProtect可修改程序的源代码.VMProtect可将被保护文件中的部分代码转化到在虚拟机(以下称作VM)上运行的程序(以下称作bytecode)中.您同样可把VM想象为具备命令系统的虚拟处理器,该命令系统与Intel 8086处理器所使用的完全不同.例如,VM没有负责比较2个操作数的命令,也没有有条件与无条件的移转等.就象您现在看到的,黑客必须

使用 jQuery Mobile 与 HTML5 开发 Web App —— jQuery Mobile 事件详解

在前文<使用 jQuery Mobile 与 HTML5 开发 Web App —— jQuery Mobile 默认配置与事件基础>中,Kayo 对 jQuery Mobile 事件的基础作出了一些说明,建议在阅读本文前首先阅读前文,这里 Kayo 再引用前文的重要内容. “jQuery Mobile 在基于本地事件上,创建了一系列的自定义事件,大部分事件是基于触摸设备的使用情况开发的,当然这些事件对于桌面环境也会有适当的处理,开发者可以使用 bind() 函数绑定到需要的页面对象中. 值得