JavaWeb学习心得之自定义简单标签(一)

本文介绍如何使用简单标签(SimpleTag)控制JSP页面的内容显示、重复执行、输出修改及页面执行流程。通过实现SimpleTag接口并重写doTag方法,可以灵活地管理JSP页面的行为。

一、简单标签简介

含义:实现SimpleTag接口的标签称为简单标签。

方法:

  • setJspContext:用于把JSP页面的pageContext对象传递给标签处理器对象
  • setParent:用于把父标签处理器对象传递给当前标签处理器对象
  • getParent:用于获取当前标签的父标签对象
  • setJspBody:用于把标签体的JspFragment对象传递给标签处理器对象
  • doTag:用于完成所有标签逻辑,包括输出、迭代、修改标签体内容等
方法执行顺序:
  1. 调用setJspContext方法,将代表JSP页面的pageContext对象传递给标签处理器
  2. 调用setParent方法,将父标签传递给当前标签处理器对象,只有父标签存在时,才会调用该方法
  3. 调用setJspBody方法:把标签体JspFragment对象传进来
  4. 调用doTag方法,通过对JspFragment对象的操作,实现页面逻辑

二、简单标签页面逻辑
1.控制部分内容是否执行
SimpleTag
import java.io.IOException;

import javax.servlet.jsp.JspException;
import javax.servlet.jsp.PageContext;
import javax.servlet.jsp.tagext.JspFragment;
import javax.servlet.jsp.tagext.SimpleTagSupport;
/**
 * SimpleTagSupport类实现了SimpleTag接口
 * SampleTagDemo01类继承SimpleTagSupport
 * @author hanxin
 *
 */
public class SimpleTagDemo01 extends SimpleTagSupport{
	/*
	 *  简单标签使用这个方法就可以完成所有的业务逻辑
	 *  重写doTag方法,控制标签体是否执行
	 * @see javax.servlet.jsp.tagext.SimpleTagSupport#doTag()
	 */
	@Override
	public void doTag() throws JspException, IOException {
		//得到代表jsp标签体的JspFragment
		JspFragment jspFragment = this.getJspBody();
		//得到jsp页面的的PageContext对象
		//PageContext pageContext = (PageContext)jspFragment.getJspContext();
		//调用JspWriter将标签体的内容输出到浏览器
		//jspFragment.invoke(pageContext.getOut());
		//调用invoke方法,表示输出内容,否则将不输出方法体内容
		jspFragment.invoke(null);
	}
	
}

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用来添加对taglib(标签库)的描述 -->
    <description>简单标签库</description>
     <!--taglib(标签库)的版本号 -->
    <tlib-version>1.0</tlib-version>
    <short-name>SimpleTagLib</short-name>
       <!-- 
		        为自定义标签库设置一个uri,uri以/开头,/后面的内容随便写 ,
		        在Jsp页面中引用标签库时,需要通过uri找到标签库
		        在Jsp页面中就要这样引入标签库:<%@taglib uri="/mySimpleTagLib" prefix="m"%>
		    -->
    <uri>/mySimpleTagLib</uri>
     <!--一个taglib(标签库)中包含多个自定义标签,每一个自定义标签使用一个tag标记来描述  -->
     <!-- 一个tag标记对应一个自定义标签 -->
    <tag>
    	<description>SimpleTagDemo01</description>
    	<name>SimpleTagDemo01</name>
    	 <!-- 标签对应的处理器类-->
    	<tag-class>com.hanxin.SimpleTagDemo01</tag-class>
    	  <!-- 
		        tld文件中有四种标签体类型 :empty  JSP  scriptless  tagdepentend  
			            在简单标签(SampleTag)中标签体body-content的值只允许是empty和scriptless,不允许设置成JSP,如果设置成JSP就会出现异常
			            在传统标签中标签体body-content的值只允许是empty和JSP
			            如果标签体body-content的值设置成tagdepentend,那么就表示标签体里面的内容是给标签处理器类使用的,
			            例如:开发一个查询用户的sql标签,此时标签体重的SQL语句就是给SQL标签的标签处理器来使用的
			            <gacl:sql>SELECT * FROM USER</gacl:sql>
			            在这种情况下,sql标签的<body-content>就要设置成tagdepentend,tagdepentend用得比较少,了解一下即可
	        -->
    	<body-content>scriptless</body-content>
    </tag>
</taglib>

jsp文件
<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>
<%@taglib uri="/mySimpleTagLib"  prefix="m"%>
<!DOCTYPE html>
<html lang="en">


<!-- Mirrored from www.zi-han.net/theme/hplus/login_v2.html by HTTrack Website Copier/3.x [XR&CO'2014], Wed, 20 Jan 2016 14:19:49 GMT -->
<head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0">

    <title>控制jsp页面某一部分内容是否执行</title>
</head>

<body>
	<m:SimpleTagDemo01>控制jsp页面某一部分内容是否执行</m:SimpleTagDemo01>
</body>
</html>

2.控制JSP页面内容重复执行
SimpleTag类
import java.io.IOException;

import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.JspFragment;
import javax.servlet.jsp.tagext.SimpleTagSupport;
/**
 * SimpleTagSupport类实现了SimpleTag接口
 * SampleTagDemo02类继承SimpleTagSupport
 * @author hanxin
 *
 */
public class SimpleTagDemo02 extends SimpleTagSupport{
	/*
	 *  简单标签使用这个方法就可以完成所有的业务逻辑
	 *  重写doTag方法,控制标签体是否执行
	 * @see javax.servlet.jsp.tagext.SimpleTagSupport#doTag()
	 */
	@Override
	public void doTag() throws JspException, IOException {
		JspFragment jspFragment = this.getJspBody();
		/*
		 * 重复执行,只需要重复调用invoke方法
		 */
		for(int i=0;i<10;i++){
			jspFragment.invoke(null);
		}
	}
	
}

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用来添加对taglib(标签库)的描述 -->
    <description>简单标签库</description>
     <!--taglib(标签库)的版本号 -->
    <tlib-version>1.0</tlib-version>
    <short-name>SimpleTagLib</short-name>
       <!-- 
		        为自定义标签库设置一个uri,uri以/开头,/后面的内容随便写 ,
		        在Jsp页面中引用标签库时,需要通过uri找到标签库
		        在Jsp页面中就要这样引入标签库:<%@taglib uri="/mySimpleTagLib" prefix="m"%>
		    -->
    <uri>/mySimpleTagLib</uri>
     <!--一个taglib(标签库)中包含多个自定义标签,每一个自定义标签使用一个tag标记来描述  -->
     <!-- 一个tag标记对应一个自定义标签 -->
    <tag>
    	<description>SimpleTagDemo02</description>
    	<name>SimpleTagDemo02</name>
    	 <!-- 标签对应的处理器类-->
    	<tag-class>com.hanxin.SimpleTagDemo02</tag-class>
    	  <!-- 
		        tld文件中有四种标签体类型 :empty  JSP  scriptless  tagdepentend  
			            在简单标签(SampleTag)中标签体body-content的值只允许是empty和scriptless,不允许设置成JSP,如果设置成JSP就会出现异常
			            在传统标签中标签体body-content的值只允许是empty和JSP
			            如果标签体body-content的值设置成tagdepentend,那么就表示标签体里面的内容是给标签处理器类使用的,
			            例如:开发一个查询用户的sql标签,此时标签体重的SQL语句就是给SQL标签的标签处理器来使用的
			            <gacl:sql>SELECT * FROM USER</gacl:sql>
			            在这种情况下,sql标签的<body-content>就要设置成tagdepentend,tagdepentend用得比较少,了解一下即可
	        -->
    	<body-content>scriptless</body-content>
    </tag>
</taglib>

jsp文件
<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>
<%@taglib uri="/mySimpleTagLib"  prefix="m"%>
<!DOCTYPE html>
<html lang="en">


<!-- Mirrored from www.zi-han.net/theme/hplus/login_v2.html by HTTrack Website Copier/3.x [XR&CO'2014], Wed, 20 Jan 2016 14:19:49 GMT -->
<head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0">

    <title>用简单标签控制标签体执行</title>
</head>

<body>
	<m:SimpleTagDemo02>用简单标签控制标签体执行<br></m:SimpleTagDemo02>
</body>
</html>

3.修改JSP页面输出
SimpleTag类
import java.io.IOException;
import java.io.StringWriter;

import javax.servlet.jsp.JspException;
import javax.servlet.jsp.PageContext;
import javax.servlet.jsp.tagext.JspFragment;
import javax.servlet.jsp.tagext.SimpleTagSupport;
/**
 * SimpleTagSupport类实现了SimpleTag接口
 * SampleTagDemo03类继承SimpleTagSupport
 * @author hanxin
 *
 */
public class SimpleTagDemo03 extends SimpleTagSupport{
	/*
	 *  简单标签使用这个方法就可以完成所有的业务逻辑
	 *  重写doTag方法
	 * @see javax.servlet.jsp.tagext.SimpleTagSupport#doTag()
	 */
	@Override
	public void doTag() throws JspException, IOException {
		JspFragment jspFragment = this.getJspBody();
		StringWriter sw = new StringWriter();
		//将标签体的内容写入到sw流中
		jspFragment.invoke(sw);
		//获取sw流缓冲区的内容
		String content = sw.getBuffer().toString();
		content = content.toUpperCase();
		PageContext pageContext = (PageContext)jspFragment.getJspContext();
		//将修改后的content输出到浏览器中
		pageContext.getOut().write(content);
		
	}
	
}

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用来添加对taglib(标签库)的描述 -->
    <description>简单标签库</description>
     <!--taglib(标签库)的版本号 -->
    <tlib-version>1.0</tlib-version>
    <short-name>SimpleTagLib</short-name>
       <!-- 
		        为自定义标签库设置一个uri,uri以/开头,/后面的内容随便写 ,
		        在Jsp页面中引用标签库时,需要通过uri找到标签库
		        在Jsp页面中就要这样引入标签库:<%@taglib uri="/mySimpleTagLib" prefix="m"%>
		    -->
    <uri>/mySimpleTagLib</uri>
     <!--一个taglib(标签库)中包含多个自定义标签,每一个自定义标签使用一个tag标记来描述  -->
     <!-- 一个tag标记对应一个自定义标签 -->
    <tag>
    	<description>SimpleTagDemo03</description>
    	<name>SimpleTagDemo03</name>
    	 <!-- 标签对应的处理器类-->
    	<tag-class>com.hanxin.SimpleTagDemo03</tag-class>
    	  <!-- 
		        tld文件中有四种标签体类型 :empty  JSP  scriptless  tagdepentend  
			            在简单标签(SampleTag)中标签体body-content的值只允许是empty和scriptless,不允许设置成JSP,如果设置成JSP就会出现异常
			            在传统标签中标签体body-content的值只允许是empty和JSP
			            如果标签体body-content的值设置成tagdepentend,那么就表示标签体里面的内容是给标签处理器类使用的,
			            例如:开发一个查询用户的sql标签,此时标签体重的SQL语句就是给SQL标签的标签处理器来使用的
			            <gacl:sql>SELECT * FROM USER</gacl:sql>
			            在这种情况下,sql标签的<body-content>就要设置成tagdepentend,tagdepentend用得比较少,了解一下即可
	        -->
    	<body-content>scriptless</body-content>
    </tag>
</taglib>

jsp文件
<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>
<%@taglib uri="/mySimpleTagLib"  prefix="m"%>
<!DOCTYPE html>
<html lang="en">


<!-- Mirrored from www.zi-han.net/theme/hplus/login_v2.html by HTTrack Website Copier/3.x [XR&CO'2014], Wed, 20 Jan 2016 14:19:49 GMT -->
<head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0">

    <title>修改jsp页面内容输出</title>
</head>

<body>
	<m:SimpleTagDemo03>thing in java</m:SimpleTagDemo03>
</body>
</html>

4.控制JSP页面是否执行
SimpleTag类
import java.io.IOException;

import javax.servlet.jsp.JspException;
import javax.servlet.jsp.SkipPageException;
import javax.servlet.jsp.tagext.SimpleTagSupport;
/**
 * SimpleTagSupport类实现了SimpleTag接口
 * SampleTagDemo04类继承SimpleTagSupport
 * @author hanxin
 *
 */
public class SimpleTagDemo04 extends SimpleTagSupport{
	/*
	 *  简单标签使用这个方法就可以完成所有的业务逻辑
	 *  重写doTag方法
	 * @see javax.servlet.jsp.tagext.SimpleTagSupport#doTag()
	 */
	@Override
	public void doTag() throws JspException, IOException {
		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用来添加对taglib(标签库)的描述 -->
    <description>简单标签库</description>
     <!--taglib(标签库)的版本号 -->
    <tlib-version>1.0</tlib-version>
    <short-name>SimpleTagLib</short-name>
       <!-- 
		        为自定义标签库设置一个uri,uri以/开头,/后面的内容随便写 ,
		        在Jsp页面中引用标签库时,需要通过uri找到标签库
		        在Jsp页面中就要这样引入标签库:<%@taglib uri="/mySimpleTagLib" prefix="m"%>
		    -->
    <uri>/mySimpleTagLib</uri>
     <!--一个taglib(标签库)中包含多个自定义标签,每一个自定义标签使用一个tag标记来描述  -->
     <!-- 一个tag标记对应一个自定义标签 -->
    <tag>
    	<description>SimpleTagDemo04</description>
    	<name>SimpleTagDemo04</name>
    	 <!-- 标签对应的处理器类-->
    	<tag-class>com.hanxin.SimpleTagDemo04</tag-class>
    	  <!-- 
		        tld文件中有四种标签体类型 :empty  JSP  scriptless  tagdepentend  
			            在简单标签(SampleTag)中标签体body-content的值只允许是empty和scriptless,不允许设置成JSP,如果设置成JSP就会出现异常
			            在传统标签中标签体body-content的值只允许是empty和JSP
			            如果标签体body-content的值设置成tagdepentend,那么就表示标签体里面的内容是给标签处理器类使用的,
			            例如:开发一个查询用户的sql标签,此时标签体重的SQL语句就是给SQL标签的标签处理器来使用的
			            <gacl:sql>SELECT * FROM USER</gacl:sql>
			            在这种情况下,sql标签的<body-content>就要设置成tagdepentend,tagdepentend用得比较少,了解一下即可
	        -->
    	<body-content>empty</body-content>
    </tag>
</taglib>

jsp文件
<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>
<%@taglib uri="/mySimpleTagLib"  prefix="m"%>
<!DOCTYPE html>
<html lang="en">


<!-- Mirrored from www.zi-han.net/theme/hplus/login_v2.html by HTTrack Website Copier/3.x [XR&CO'2014], Wed, 20 Jan 2016 14:19:49 GMT -->
<head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0">

    <title>控制JSP是否继续向下执行</title>
</head>

<body>
	<p>开始</p>
	<m:SimpleTagDemo04/>
	<p>结束</p>
</body>
</html>



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值