实现simpleTag接口的标签通常称为是简单标签,简单标签一共定义了5个方法

setJspContext方法
setParent方法
getParent方法
setJspBody方法
doTag方法,简单标签就是使用这个方法可以完成所有的业务逻辑

SimpleTag方法介绍

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

SimpleTag接口的执行顺序

当WEB容器调用标签处理器对象的setJspContext方法,将代表JSP页面的pageContext对象传递给标签处理器对象。
WEB容器调用标签处理器对象的setParent方法,将父标签处理器对象传递给这个标签处理器对象。注意,只有在标签存在父标签的情况下web容器才会调用这个方法
如果调用标签时,设置了属性,容器将调用每个属性对应的setter方法把属性值传递给标签处理器对象,如果标签的属性值是EL表达式或者脚本表达式,则WEB容器首先计算表达式的值,然后再把值传给标签处理器对象。
如果简单的标签标签体,web容器将调用setJspBody方法把代表标签体的JspFragment对象传递进来
执行标签时,web容器调用标签处理器的doTag()方法,开发人员在方法体内部同步操作jspFragment对象,就可以实现是否执行,迭代,修改标签体的目的。

简单标签开发

SUN公司针对SimpleTag接口提供了一个实现类,SimpleTagSupport,SimpleTagSupport类中实现了SimpleTag接口的所有方法,因此我们可以编写一个类继承SimpleTagSupport类然后,根据业务需要
在重写doTag方法。

控制JSP页面某一部分是否执行

    编写一个类继承SimpleTagSupport,然后再重写doTag方法,在doTag方法里面不调用jspFrament.invoke方法即可
    

/**
* simpleTagSupport实现了SimpleTag接口
* SimpleTagOne继承了SimpleTagSupport
* @author ssgao
*
*/
public class SimpleTagOne extends SimpleTagSupport{
/**
* 简单标签使用这个方法就可以完成所有业务逻辑
* javax.servlet.jsp.tagext.SimpleTagSupport#doTag()
* 重写doTag方法,控制标签体是否执行
*/
@Override
public void doTag() throws JspException, IOException {

//得到代表JSp标签提的JspFragment
JspFragment jspFragment=this.getJspBody(); //得到Jsp页面的PageContext对象
PageContext pageContext= (PageContext) this.getJspContext();
//调用JspWriter将 标签体内容输出到浏览器
JspWriter jspWriter=pageContext.getOut();
jspWriter.write("自定义标签提"); //将标签体的内容输出到浏览器
jspFragment.invoke(jspWriter);
//如果不需要输出
//jspFragment.invoke(null); 在WEB-INF目录下新建xxtld文件添加标签处理类描述
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE taglib PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.2//EN" "http://java.sun.com/dtd/web-jsptaglibrary_1_2.dtd" >
<taglib>
  <!-- taglib标签库的版本号 -->
 <tlib-version>1.0</tlib-version>
 <jsp-version>jsp-version</jsp-version>
 <short-name>short-name</short-name>
 
 <!--  
              为自定义标签库设置一个uri,uri以/开头,/后面的内容随便写,如这里的/simpletag ,
             在Jsp页面中引用标签库时,需要通过uri找到标签库
在Jsp页面中就要这样引入标签库:<%@taglib uri="/simpletag" prefix="gacl"%>
  -->
 <uri>/simpletag</uri>
 <!--
一个标签库 中包含多个自定义标签,每个自定义标签使用一个tag标记来描述
一个tag标记对应一个自定义标签
 -->
 <tag>
<!--
为标签处理器类配一个标签名,在Jsp页面中使用标签时是通过标签名来找到要调用的标签处理器类的
  通过demo1就能找到对应的me.gacl.web.simpletag.SimpleTagDemo1类
  -->
   <name>simple</name>
   <!-- 标签对应的处理器类-->
   <tag-class>simple.tag.SimpleTagOne</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="/simpletag" prefix="gs" %>
<!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>Insert title here</title>
</head>
<body>

  <gs:simple>
我的宝贝是笑笑!
</gs:simple>

</body>
</html>

控制JSP页面内容重复执行

编写一个类继承SimpleTagSupport,然后在重写doTag方法,在doTag方法里面重复调用jspFrament.invoke方法即可
package simple.tag;

import java.io.IOException;

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

/**
* simpleTagSupport实现了SimpleTag接口
* SimpleTagOne继承了SimpleTagSupport
* @author ssgao
*
*/
public class SimpleTagOne extends SimpleTagSupport{

/**
* 简单标签使用这个方法就可以完成所有业务逻辑
* javax.servlet.jsp.tagext.SimpleTagSupport#doTag()
* 重写doTag方法,控制标签体是否执行
*/
@Override
public void doTag() throws JspException, IOException {

//得到jsp标签体的JspFragment
JspFragment jspFragment = this.getJspBody();
for(int i=0;i<5;i++){
//将标签体的内容输出到浏览器
jspFragment.invoke(null);
}
}
}
在WEB-INF目录下添加tld文件对标签处理类的表述
<tag>
   <name>simple</name>
   <tag-class>simple.tag.SimpleTagOne</tag-class>
   <body-content>scriptless</body-content>
 </tag>
在JSP页面中导入并使用自定义标签   
<%@ page language="java" contentType="text/html; charset=UTF-8"
   pageEncoding="UTF-8"%>
<%@ taglib uri="/simpletag" prefix="gs" %>
<!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>Insert title here</title>
</head>
<body>

<gs:simple>
<div style="height:10px; background-color:red;">ssgao</div>
</gs:simple>

</body>
</html>
修改JSP页面内容输出
编写一个类继承SimpleTagSupport,然后在重写doTag方法,在doTag方法里面重复调用jspFrament.invoke方法时,让执行结果写到一个自定义的缓冲中即可,然后开发人员可以取出缓冲的数据进行修改。
package simple.tag;

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接口
* SimpleTagOne继承了SimpleTagSupport
* @author ssgao
*
*/
public class SimpleTagOne extends SimpleTagSupport{

/**
* 简单标签使用这个方法就可以完成所有业务逻辑
* javax.servlet.jsp.tagext.SimpleTagSupport#doTag()
* 重写doTag方法,控制标签体里面的内容,将标签体的内容转换为大写
*/
@Override
public void doTag() throws JspException, IOException {

//得到jsp标签体的JspFragment
JspFragment jspFragment = this.getJspBody();
StringWriter sw = new StringWriter();
//将标签体的内容写入到sw流中
jspFragment.invoke(sw);
//获取sw缓冲区的内容
String content = sw.getBuffer().toString();
content=content.toUpperCase();
PageContext pageContext=(PageContext) this.getJspContext();
pageContext.getOut().write(content);
}
}
在WEB-INF目录下添加tld文件对标签处理类的表述
 <tag>
   <name>simple</name>
   <tag-class>simple.tag.SimpleTagOne</tag-class>
   <!-- 标签体允许的内容: scriptless表示标签体内容不允许java脚步代码 -->
   <body-content>scriptless</body-content>
 </tag>
在JSP页面中导入并使用自定义标签   
<%@ page language="java" contentType="text/html; charset=UTF-8"
   pageEncoding="UTF-8"%>
<%@ taglib uri="/simpletag" prefix="gs" %>
<!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>Insert title here</title>
</head>
<body>

<gs:simple>
<div style="height:10px; background-color:red;">ssgao</div>
</gs:simple>

</body>
</html>

控制整个JSP页面是否执行

编写一个类继承SimpleTagSupport,然后在重写doTag方法,在doTag方法里面抛出SkipPageException异常即可,jsp收到整个异常,将忽略标签余下jsp页面的执行
package simple.tag;

import java.io.IOException;

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

/**
* simpleTagSupport实现了SimpleTag接口
* SimpleTagOne继承了SimpleTagSupport
* @author ssgao
*
*/
public class SimpleTagOne extends SimpleTagSupport{

/**
* 简单标签使用这个方法就可以完成所有业务逻辑
* javax.servlet.jsp.tagext.SimpleTagSupport#doTag()
* 重写doTag方法,控制标签余下的JSP页面不执行
*/
@Override
public void doTag() throws JspException, IOException {

//抛出一个SkipPageException异常就可以控制标签余下的Jsp不执行
throw new SkipPageException(); }
}
在WEB-INF目录下添加tld文件对标签处理类的表述
 <tag>
   <name>simple</name>
   <tag-class>simple.tag.SimpleTagOne</tag-class>
   <!-- 标签体允许的内容: scriptless表示标签体内容不允许java脚步代码 -->
   <body-content>scriptless</body-content>
 </tag>
在JSP页面中导入并使用自定义标签   
<%@ page language="java" contentType="text/html; charset=UTF-8"
   pageEncoding="UTF-8"%>
<%@ taglib uri="/simpletag" prefix="gs" %>
<!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>Insert title here</title>
</head>
<body>
自定义标签:
<gs:simple>
<div style="height:10px; background-color:red;">ssgao</div>
</gs:simple>
ssgao
ssgao
</body>
</html>

简单标签开发的一些细节

标签类编写
    开发标签的时候,不要直接去实现SimpleTag接口,而是继承SimpleTagSupport类,SimpleTagSupport类是SimpleTag接口的一个模拟实现类,通过继承SimpleTagSupport类,就可以
直接使用SimpleTagSupport类已经实现的那些方法,如果SimpleTagSupport类的方法实现不满足业务需要,那么就可以根据具体的业务情况将相应的方法进行重写。
TLD文件标签体的设置
我们开发好一个标签后,需要在tld文件中添加对该标签的描述
<tag>
<!--
为标签处理器类配一个标签名,在Jsp页面中使用标签时是通过标签名来找到要调用的标签处理器类的
  通过demo1就能找到对应的me.gacl.web.simpletag.SimpleTagDemo1类
  -->
   <name>simple</name>
   <!-- 标签对应的处理器类-->
   <tag-class>simple.tag.SimpleTagOne</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>
开发好一个标签后,在tld文件中使用<tag>来描述一个标签,描述的内容包括标签名(name),标签处理器类(tag-class),标签体的内容(bodycontent)
tld文件中有4种标签体<body-content>类型:empty,jsp.scriptless.tagdependent
简单的标签的中body-content,不可以设置为JSP,否则会出现异常
The TLD for the class me.gacl.web.simpletag.SimpleTagDemo1 specifies an invalid body-content (JSP) for a SimpleTag
body-content的值如果设置为empty,那么就表示该标签没有标签体,如果是设置成scriptless,那么该标签是有标签体,但是标签体的内容不可以是<%java代码%>
<gs:tag>
  <%
     //嵌套在标签体中的java代码
     int i=0;
   %>
</gs:tag>

运行出错:
Scripting elements ( &lt;%!, &lt;jsp:declaration, &lt;%=, &lt;jsp:expression, &lt;%, &lt;jsp:scriptlet ) are disallowed here

原因:
JSP标签技术的目的就是为了移除在jsp页面中编写的java代码的,如果在JSP标签中运行出现java代码,那么就违背了jsp标签设计时的初衷了。

传统标签的标签体

     在传统标签的标签体中body-content的值允许是empty,jsp,scriptless,tagdependent,body-content的值如果是设置成JSP,那么表示该标签是有标签体的。并且标签体的内容可以是任意的
包括java代码,如果是设置成scriptless,那么表示该标签是有标签体,但是标签体的内容不能是java代码。
     如果传统标签和简单标签的标签体body-content的值设置成tagdependent,那么就表示标签体里面的内容是给标签处理器类使用的,tagdependdent用得比较少,了解即可。

TLD文件中标签库的URI设置细节

 一般标签库中的uri不要设置成相同,否则在JSP页面通过uri引用标签库时,就不知道引用哪一个标签库了。
如果两个标签库的uri刚好一致,解决方法,换一种引用方式:
   <%@ taglib uri="要引用的标签库的TLD文件目录" prefix="gs"%> 
taglib指令的uri属性指定为标签库的tld文件目录,这样就区分开了。
引用simple.tld标签库 <%@ taglib uri="/WEB-INF/simple.tld" prefix="gs"%>

jsp 简单标签开发的更多相关文章

  1. jsp简单标签开发(一)

    孤傲苍狼 @Override22 public void doTag() throws JspException, IOException {23 //得到代表jsp标签体的JspFragment24 ...

  2. javaweb学习总结(二十五)——jsp简单标签开发(一)

    一.简单标签(SimpleTag) 由于传统标签使用三个标签接口来完成不同的功能,显得过于繁琐,不利于标签技术的推广, SUN公司为降低标签技术的学习难度,在JSP 2.0中定义了一个更为简单.便于编 ...

  3. JSP简单标签开发

    一.继承自SimpleTag接口的自定义标签实现类称为简单标签,接口中5个方法 1.setJspContext方法 用于把JSP页面的PageContext对象传递给标签处理器对象 2.setPare ...

  4. javaweb学习总结(二十七)——jsp简单标签开发案例和打包

    一.开发标签库 1.1.开发防盗链标签 1.编写标签处理器类:RefererTag.java 1 package me.gacl.web.simpletag; 2 3 import java.io.I ...

  5. javaweb学习总结(二十四)——jsp传统标签开发

    一.标签技术的API 1.1.标签技术的API类继承关系 二.标签API简单介绍 2.1.JspTag接口 JspTag接口是所有自定义标签的父接口,它是JSP2.0中新定义的一个标记接口,没有任何属 ...

  6. JSP自定义标签开发入门《转》

    JSP自定义标签开发入门 一般情况下开发jsp自定义标签需要引用以下两个包 import javax.servlet.jsp.*; import javax.servlet.jsp.tagext.*; ...

  7. javaweb(二十四)——jsp传统标签开发

    一.标签技术的API 1.1.标签技术的API类继承关系 二.标签API简单介绍 2.1.JspTag接口 JspTag接口是所有自定义标签的父接口,它是JSP2.0中新定义的一个标记接口,没有任何属 ...

  8. javaweb学习总结(二十六)——jsp简单标签标签库开发(二)

    一.JspFragment类介绍 javax.servlet.jsp.tagext.JspFragment类是在JSP2.0中定义的,它的实例对象代表JSP页面中的一段符合JSP语法规范的JSP片段, ...

  9. JSP简单标签标签库开发

    1.定制标签的实现类称为标签处理器,简单标签处理器指实现SimpleTag接口的类,如下图的SimpleTagSupport类,该类为SimpleTag接口的默认实现类. 注:不要直接实现Simple ...

随机推荐

  1. 20145310《网络对抗》逆向及Bof基础

    实践目标 本次实践的对象是一个名为pwn1的linux可执行文件. 该程序正常执行流程是:main调用foo函数,foo函数会简单回显任何用户输入的字符串. 该程序同时包含另一个代码片段,getShe ...

  2. 20145332卢鑫 WEB基础

    20145332卢鑫 WEB基础 实验过程 1.环境配置 2.简单的网页编写 3.javascript相关 1.相关概念:JavaScript是一种广泛用于客户端Web开发的脚本语言,常用来给HTML ...

  3. 20165310_Exp2实验三《敏捷开发与XP实践》

    20165310 java_exp3 敏捷开发与XP实践 一.编码标准 编程标准包含:具有说明性的名字.清晰的表达式.直截了当的控制流.可读的代码和注释,以及在追求这些内容时一致地使用某些规则和惯用法 ...

  4. cogs 2223. [SDOI2016 Round1] 生成魔咒

    ★★☆ 输入文件:menci_incantation.in 输出文件:menci_incantation.out 简单对比 时间限制:1 s 内存限制:128 MB [题目描述]魔咒串由许多魔咒字符组 ...

  5. 自定义redis序列化工具

    redis一个优点就是可以将数据写入到磁盘中. 我们知道写入磁盘的数据实际上都是以字节(0101这样的二进制数据)的形式写入的. 这意味着如果我们要将一个对象写入磁盘,就必须将这个对象序列化. jav ...

  6. [BZOJ4027][HEOI2015]兔子与樱花 树形dp

    Description 很久很久之前,森林里住着一群兔子.有一天,兔子们突然决定要去看樱花.兔子们所在森林里的樱花树很特殊.樱花树由n个树枝分叉点组成,编号从0到n-1,这n个分叉点由n-1个树枝连接 ...

  7. .NET MVC请求流程

    ASP.NET MVC 请求流程:Controller MvcHandler Action Action参数赋值 .NET MVC权限设计思考之切入点

  8. MVC ---- IEnumerable<T>、List<T> 前台遍历展示

    突然做前台数据展示,发现IEnumerable 对一个列表的展示还是可以,但要是多个类型放在一个表中如何处理呢,如下: 一个类IEnumerable遍历 后台 public IEnumerable&l ...

  9. Codeforces Beta Round #94 div 1 D Numbers map+思路

    D. Numbers time limit per test 2 seconds memory limit per test 256 megabytes input standard input ou ...

  10. Vim简本

    参考链接:http://yannesposito.com/Scratch/en/blog/Learn-Vim-Progressively/ 本文将更简化,只保留其中的精华部分. Level One — ...