一、继承自SimpleTag接口的自定义标签实现类称为简单标签,接口中5个方法

1、setJspContext方法

  用于把JSP页面的PageContext对象传递给标签处理器对象

2、setParent方法

  把父标签处理器对象传递给当前处理器对象

3、getParent方法

  用于获取当前标签的父标签处理器对象

4、setJspBody方法

  用于把代表标签体的JspFragment对象传递给标签处理器对象

5、doTag方法

  用于完成所有标签逻辑,如输出、迭代、修改标签内容等。在方法中可以通过抛出javax.servlet.jsp.SkipPageException异常,通知WEB容器不再执行当前标签结束标记后面代码,等效于doTagEnd方法的返回值常量Tag.SKIP__PAGE

二、SimpleTag接口方法在WEB容器中执行顺序

1、调用setJspContext方法,将代表JSP页面的pageContext对象传递给标签处理器对象

2、如果当前标签有父级标签,调用setParent方法将父标签处理器对象传递给当前标签处理器对象

3、如果当前标签有属性,则调用每个属性的setter方法,将属性值传递给标签处理器对象;如果属性是EL表达式或脚本表达式,则WEB容器优先计算表达式,然后把值传递给标签处理器对象

4、简单标签有标签体,则调用setJspBody方法,把代表标签体的JspFragment对象传递给标签处理器

5、WEB容器执行doTag方法,通过操作JspFragment对象,实现标签体是否执行、迭代、修改标签体内容等操作

三、例子,开发中经常继承自SimpleTagSupport类

1、控制标签体是否执行,不调用invoke方法则不执行标签体

package TagDemo;

import javax.servlet.jsp.JspException;
import javax.servlet.jsp.PageContext;
import javax.servlet.jsp.tagext.JspFragment;
import javax.servlet.jsp.tagext.SimpleTagSupport;
import java.io.IOException; public class SimpleTagDemo extends SimpleTagSupport {
@Override
public void doTag() throws JspException, IOException {
JspFragment fragment = this.getJspBody();//获取标签体
// PageContext pageContext= (PageContext) fragment.getJspContext();
// fragment.invoke(pageContext.getOut());
fragment.invoke(null);
}
}

控制标签体是否执行

<?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>自定义标签</description> <tlib-version>1.0</tlib-version> <short-name>SDT</short-name> <uri>/sefDefineTag</uri>
<tag>
<name>tagDemo</name>
<tag-class>TagDemo.TagDemo</tag-class>
<body-content>JSP</body-content>
</tag>
<tag>
<description>测试循环</description>
<name>iteration</name>
<tag-class>TagDemo.IterationTagDemo</tag-class>
<body-content>JSP</body-content>
</tag>
<tag>
<description>测试修改标签体内容</description>
<name>bodytag</name>
<tag-class>TagDemo.BodyTagDemo</tag-class>
<body-content>JSP</body-content>
</tag>
<tag>
<name>simpleTag</name>
<tag-class>TagDemo.SimpleTagDemo</tag-class>
<!--简单标签中,body-content中一般设置成empty或scriptless,如果设置成JSP会抛异常;
传统标签中,body-content中一般设置成empty或JSP;
如果body-content设置成tagdependent,那么标签体里的内容是给标签处理类使用的,
例如:标签体里的SQL语句,就可以设置成tagdependent,标签处理器类得到SQL语句处理-->
<body-content>scriptless</body-content>
</tag>
</taglib>

tld文件

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@taglib prefix="sdt" uri="/sefDefineTag" %>
<html>
<head>
<title></title>
</head>
<body>
<h1>下面是自定义标签:</h1>
<h6>---------------------------------------------</h6> <sdt:tagDemo>标签体</sdt:tagDemo>
<br/>
<br/>
<sdt:iteration>循环标签体5次<br/></sdt:iteration>
<br/>
<br/>
<sdt:bodytag>abc</sdt:bodytag>
<br/>
<br/>
<sdt:simpleTag>简单标签体</sdt:simpleTag>
<h6>---------------------------------------------</h6>
<div>
<h1>自定义标签下面内容</h1>
</div>
</body>
</html>

JSPDemo

2、标签体循环执行,doTag中循环调用invoke方法

package TagDemo;

import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.JspFragment;
import javax.servlet.jsp.tagext.SimpleTagSupport;
import java.io.IOException; public class SimpleIterationTagDemo extends SimpleTagSupport {
@Override
public void doTag() throws JspException, IOException {
JspFragment fragment = this.getJspBody();
for (int i = 0; i < 5; i++) {
fragment.invoke(null);
}
}
}

标签体循环执行5次

<?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>自定义标签</description> <tlib-version>1.0</tlib-version> <short-name>SDT</short-name> <uri>/sefDefineTag</uri>
<tag>
<name>tagDemo</name>
<tag-class>TagDemo.TagDemo</tag-class>
<body-content>JSP</body-content>
</tag>
<tag>
<description>测试循环</description>
<name>iteration</name>
<tag-class>TagDemo.IterationTagDemo</tag-class>
<body-content>JSP</body-content>
</tag>
<tag>
<description>测试修改标签体内容</description>
<name>bodytag</name>
<tag-class>TagDemo.BodyTagDemo</tag-class>
<body-content>JSP</body-content>
</tag>
<tag>
<name>simpleTag</name>
<tag-class>TagDemo.SimpleTagDemo</tag-class>
<!--简单标签中,body-content中一般设置成empty或scriptless,如果设置成JSP会抛异常;
传统标签中,body-content中一般设置成empty或JSP;
如果body-content设置成tagdependent,那么标签体里的内容是给标签处理类使用的,
例如:标签体里的SQL语句,就可以设置成tagdependent,标签处理器类得到SQL语句处理-->
<body-content>scriptless</body-content>
</tag>
<tag>
<name>simpleIterationTag</name>
<tag-class>TagDemo.SimpleIterationTagDemo</tag-class>
<body-content>scriptless</body-content>
</tag>
</taglib>

tld配置文件

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@taglib prefix="sdt" uri="/sefDefineTag" %>
<html>
<head>
<title></title>
</head>
<body>
<h1>下面是自定义标签:</h1>
<h6>---------------------------------------------</h6> <sdt:tagDemo>标签体</sdt:tagDemo>
<br/>
<br/>
<sdt:iteration>循环标签体5次<br/></sdt:iteration>
<br/>
<br/>
<sdt:bodytag>abc</sdt:bodytag>
<br/>
<br/>
<sdt:simpleTag>简单标签体</sdt:simpleTag>
<br/>
<br/>
<sdt:simpleIterationTag>简单标签体循环5次<br/></sdt:simpleIterationTag>
<h6>---------------------------------------------</h6>
<div>
<h1>自定义标签下面内容</h1>
</div>
</body>
</html>

JSPDemo

3、修改标签体内容,通过doTag方法中invoke方法,将标签体写入StringWriter对象中

package TagDemo;

import javax.servlet.jsp.JspException;
import javax.servlet.jsp.PageContext;
import javax.servlet.jsp.tagext.JspFragment;
import javax.servlet.jsp.tagext.JspTag;
import javax.servlet.jsp.tagext.SimpleTagSupport;
import java.io.IOException;
import java.io.StringWriter; public class SimpleBodyTagDemo extends SimpleTagSupport {
@Override
public void doTag() throws JspException, IOException {
JspFragment fragment=this.getJspBody();
JspTag parentTag=this.getParent();
StringWriter stringWriter=new StringWriter();
//将标签体内容写到stringwriter流中
fragment.invoke(stringWriter);
//获取stringwriter流缓冲区内容
String content=stringWriter.getBuffer().toString();
content=content.toUpperCase();
PageContext context= (PageContext) this.getJspContext();
//将修改后的content输出到浏览器中
context.getOut().write(content);
}
}

标签体内小写字母转为大写字母

<?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>自定义标签</description> <tlib-version>1.0</tlib-version> <short-name>SDT</short-name> <uri>/sefDefineTag</uri>
<tag>
<name>tagDemo</name>
<tag-class>TagDemo.TagDemo</tag-class>
<body-content>JSP</body-content>
</tag>
<tag>
<description>测试循环</description>
<name>iteration</name>
<tag-class>TagDemo.IterationTagDemo</tag-class>
<body-content>JSP</body-content>
</tag>
<tag>
<description>测试修改标签体内容</description>
<name>bodytag</name>
<tag-class>TagDemo.BodyTagDemo</tag-class>
<body-content>JSP</body-content>
</tag>
<tag>
<name>simpleTag</name>
<tag-class>TagDemo.SimpleTagDemo</tag-class>
<!--简单标签中,body-content中一般设置成empty或scriptless,如果设置成JSP会抛异常;
传统标签中,body-content中一般设置成empty或JSP;
如果body-content设置成tagdependent,那么标签体里的内容是给标签处理类使用的,
例如:标签体里的SQL语句,就可以设置成tagdependent,标签处理器类得到SQL语句处理-->
<body-content>scriptless</body-content>
</tag>
<tag>
<name>simpleIterationTag</name>
<tag-class>TagDemo.SimpleIterationTagDemo</tag-class>
<body-content>scriptless</body-content>
</tag>
<tag>
<name>simpleBodyTag</name>
<tag-class>TagDemo.SimpleBodyTagDemo</tag-class>
<body-content>scriptless</body-content>
</tag>
</taglib>

tld文件

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@taglib prefix="sdt" uri="/sefDefineTag" %>
<html>
<head>
<title></title>
</head>
<body>
<h1>下面是自定义标签:</h1>
<h6>---------------------------------------------</h6> <sdt:tagDemo>标签体</sdt:tagDemo>
<br/>
<br/>
<sdt:iteration>循环标签体5次<br/></sdt:iteration>
<br/>
<br/>
<sdt:bodytag>abc</sdt:bodytag>
<br/>
<br/>
<sdt:simpleTag>简单标签体</sdt:simpleTag>
<br/>
<br/>
<sdt:simpleIterationTag>简单标签体循环5次<br/></sdt:simpleIterationTag>
<br/>
<br/>
<sdt:simpleBodyTag>abccde</sdt:simpleBodyTag>
<h6>---------------------------------------------</h6>
<div>
<h1>自定义标签下面内容</h1>
</div>
</body>
</html>

JSPDemo

4、阻止执行标签结束标记符后面所有代码,在doTag方法中抛出javax.servlet.jsp.SkipPageException异常

package TagDemo;

import javax.servlet.jsp.JspException;
import javax.servlet.jsp.SkipPageException;
import javax.servlet.jsp.tagext.SimpleTagSupport;
import java.io.IOException; public class SimpleEndPageTagDemo extends SimpleTagSupport {
@Override
public void doTag() throws JspException, IOException {
//抛出SkipPageException异常就可以控制标签余下的JSP不执行
throw new SkipPageException();
}
}

标签结束符后面所有代码不执行

<?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>自定义标签</description> <tlib-version>1.0</tlib-version> <short-name>SDT</short-name> <uri>/sefDefineTag</uri>
<tag>
<name>tagDemo</name>
<tag-class>TagDemo.TagDemo</tag-class>
<body-content>JSP</body-content>
</tag>
<tag>
<description>测试循环</description>
<name>iteration</name>
<tag-class>TagDemo.IterationTagDemo</tag-class>
<body-content>JSP</body-content>
</tag>
<tag>
<description>测试修改标签体内容</description>
<name>bodytag</name>
<tag-class>TagDemo.BodyTagDemo</tag-class>
<body-content>JSP</body-content>
</tag>
<tag>
<name>simpleTag</name>
<tag-class>TagDemo.SimpleTagDemo</tag-class>
<!--简单标签中,body-content中一般设置成empty或scriptless,如果设置成JSP会抛异常;
传统标签中,body-content中一般设置成empty或JSP;
如果body-content设置成tagdependent,那么标签体里的内容是给标签处理类使用的,
例如:标签体里的SQL语句,就可以设置成tagdependent,标签处理器类得到SQL语句处理-->
<body-content>scriptless</body-content>
</tag>
<tag>
<name>simpleIterationTag</name>
<tag-class>TagDemo.SimpleIterationTagDemo</tag-class>
<body-content>scriptless</body-content>
</tag>
<tag>
<name>simpleBodyTag</name>
<tag-class>TagDemo.SimpleBodyTagDemo</tag-class>
<body-content>scriptless</body-content>
</tag>
<tag>
<name>simpleEndPageTag</name>
<tag-class>TagDemo.SimpleEndPageTagDemo</tag-class>
<body-content>empty</body-content>
</tag>
</taglib>

tld文件

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@taglib prefix="sdt" uri="/sefDefineTag" %>
<html>
<head>
<title></title>
</head>
<body>
<h1>下面是自定义标签:</h1>
<h6>---------------------------------------------</h6> <sdt:tagDemo>标签体</sdt:tagDemo>
<br/>
<br/>
<sdt:iteration>循环标签体5次<br/></sdt:iteration>
<br/>
<br/>
<sdt:bodytag>abc</sdt:bodytag>
<br/>
<br/>
<sdt:simpleTag>简单标签体</sdt:simpleTag>
<br/>
<br/>
<sdt:simpleIterationTag>简单标签体循环5次<br/></sdt:simpleIterationTag>
<br/>
<br/>
<sdt:simpleBodyTag>abccde</sdt:simpleBodyTag>
<br/>
<br/>
<sdt:simpleEndPageTag></sdt:simpleEndPageTag>
<h6>---------------------------------------------</h6>
<div>
<h1>自定义标签下面内容</h1>
</div>
</body>
</html>

JSPDemo

四、tld文件中body-content四种类型简要说明

简单标签标签体body-content的值只允许是empty,scriptless,tagdependent,不允许是JSP,如果设置成JSP就会抛异常;empty表示没有标签体,scriptless表示可以有标签体,但不能是java代码(即<%java代码%>),tagdependent是给标签处理器类使用的标签体

传统标签标签体body-content的值可以是empty,scriptless,JSP,tagdependent;JSP允许有标签体,内容任意,包括java代码或EL表达式

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个方法 setJspContext方法 setParent方法 getParent方法 setJspBody方法 doTag方法 ...

  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. oracle判断字段是否存在语句

    declare v_cnt number; begin select count(*) into v_cnt from dba_tab_columns where table_name='T_IDC_ ...

  2. GDB的使用

    #list #break <行号|函数名|条件表达式> #delete  #run #continue #finish #quit #next #step #print #watch  l ...

  3. GisUtil工具类:将WKT(wellKnownText)文本转换为ElasticSearch识别的空间对象字符串形式

    ElasticSearch中的Geo Shape Type: https://www.elastic.co/guide/en/elasticsearch/reference/1.4/mapping-g ...

  4. 51nod 1422(强行YY)

    1422 沙拉酱前缀 题目来源: CodeForces 基准时间限制:1 秒 空间限制:131072 KB 分值: 40 难度:4级算法题  收藏  关注 沙拉酱非常喜欢数字序列.这正是他要弄一个关于 ...

  5. css 小三角

    span{ display: inline-block; border-top: 100px solid red; border-right: 100px solid transparent; bor ...

  6. Self Host WebApi服务传输层SSL加密(服务器端+客户端调用)

    接上篇<WebApi服务URI加密及验证的两种方式>,在实际开发中,仅对URI进行加密是不够的,在传输层采用SSL加密也是必须的. 如果服务寄宿于IIS,那对传输层加密非常简单仅需要配置一 ...

  7. 代理、通知、KVO的应用

    实现下图效果,每点击一次cell的“加号”或者“减号”,就可以让“底部view”的总价进行对应的增加或者减少. 下图是实际运行效果图: 图(1) 因为“底部UIView”需要一直显示在底部.如果把底部 ...

  8. android录音相关

    android的麦克风在现在的生活中发挥着很大的作用,打电话,视频聊天,语音识别等等. android sdk的api里提供了很方便的调用方法,下面写一个小的DEMO. 五个按钮:开始录音,停止,播放 ...

  9. editGrid自定义列自定义F7

    添加自定义列,配置控制自定义F7 自定义F7的地址为连接界面的url /dynamicPage.do?event=initialize&method=doEvent&uipk=com. ...

  10. Centos下 为Firefox安装Flash插件

    方法一: 直接到官网去下载RPM格式的安装包,下载好后直接 用 rpm -ivh XXXX.rpm 来安装即可. 方法二: 到官网下载tar.gz格式的,自己配置安装: #wget http://fp ...