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

转载自  javaweb学习总结(二十四)——jsp传统标签开发

一、标签技术的API

1.1、标签技术的API类继承关系

  

二、标签API简单介绍

2.1、JspTag接口

  JspTag接口是所有自定义标签的父接口,它是JSP2.0中新定义的一个标记接口,没有任何属性和方法。JspTag接口有Tag和SimpleTag两个直接子接口,JSP2.0以前的版本中只有Tag接口,所以把实现Tag接口的自定义标签也叫做传统标签,把实现SimpleTag接口的自定义标签叫做简单标签

2.2、Tag接口

  Tag接口是所有传统标签的父接口,其中定义了两个重要方法(doStartTag、doEndTag)方法和四个常量(EVAL_BODY_INCLUDE、SKIP_BODY、EVAL_PAGE、SKIP_PAGE),这两个方法和四个常量的作用如下:

  (1)WEB容器在解释执行JSP页面的过程中,遇到自定义标签的开始标记就会去调用标签处理器的doStartTag方法,doStartTag方法执行完后可以向WEB容器返回常量EVAL_BODY_INCLUDE或SKIP_BODY。如果doStartTag方法返回EVAL_BODY_INCLUDE,WEB容器就会接着执行自定义标签的标签体;如果doStartTag方法返回SKIP_BODY,WEB容器就会忽略自定义标签的标签体,直接解释执行自定义标签的结束标记。

  (2)WEB容器解释执行到自定义标签的结束标记时,就会调用标签处理器的doEndTag方法,doEndTag方法执行完后可以向WEB容器返回常量EVAL_PAGE或SKIP_PAGE。如果doEndTag方法返回常量EVAL_PAGE,WEB容器就会接着执行JSP页面中位于结束标记后面的JSP代码;如果doEndTag方法返回SKIP_PAGE,WEB容器就会忽略JSP页面中位于结束标记后面的所有内容。

  从doStartTag和doEndTag方法的作用和返回值的作用可以看出,开发自定义标签时可以在doStartTag方法和doEndTag方法体内编写合适的Java程序代码来实现具体的功能,通过控制doStartTag方法和doEndTag方法的返回值,还可以告诉WEB容器是否执行自定义标签中的标签体内容和JSP页面中位于自定义标签的结束标记后面的内容。

2.3、IterationTag接口

  IterationTag接口继承了Tag接口,并在Tag接口的基础上增加了一个doAfterBody方法和一个EVAL_BODY_AGAIN常量。实现IterationTag接口的标签除了可以完成Tag接口所能完成的功能外,还能够通知WEB容器是否重复执行标签体内容。对于实现了IterationTag接口的自定义标签,WEB容器在执行完自定义标签的标签体后,将调用标签处理器的doAfterBody方法,doAfterBody方法可以向WEB容器返回常量EVAL_BODY_AGAIN或SKIP_BODY。如果doAfterBody方法返回EVAL_BODY_AGAIN,WEB容器就会把标签体内容再重复执行一次,执行完后接着再调用doAfterBody方法,如此往复,直到doAfterBody方法返回常量SKIP_BODY,WEB容器才会开始处理标签的结束标记和调用doEndTag方法。

  可见,开发自定义标签时,可以通过控制doAfterBody方法的返回值来告诉WEB容器是否重复执行标签体内容,从而达到循环处理标签体内容的效果。例如,可以通过一个实现IterationTag接口的标签来迭代输出一个集合中的所有元素,在标签体部分指定元素的输出格式。

  在JSP API中也提供了IterationTag接口的默认实现类TagSupport,我们在编写自定义标签的标签处理器类时,可以继承和扩展TagSupport类,这相比实现IterationTag接口将简化开发工作。

2.4、BodyTag接口

  BodyTag接口继承了IterationTag接口,并在IterationTag接口的基础上增加了两个方法(setBodyContent、doInitBody)和一个EVAL_BODY_BUFFERED常量。实现BodyTag接口的标签除了可以完成IterationTag接口所能完成的功能,还可以对标签体内容进行修改。对于实现了BodyTag接口的自定义标签,标签处理器的doStartTag方法不仅可以返回前面讲解的常量EVAL_BODY_INCLUDE或SKIP_BODY,还可以返回常量EVAL_BODY_BUFFERED。如果doStartTag方法返回EVAL_BODY_BUFFERED,WEB容器就会创建一个专用于捕获标签体运行结果的BodyContent对象,然后调用标签处理器的setBodyContent方法将BodyContent对象的引用传递给标签处理器,WEB容器接着将标签体的执行结果写入到BodyContent对象中。在标签处理器的后续事件方法中,可以通过先前保存的BodyContent对象的引用来获取标签体的执行结果,然后调用BodyContent对象特有的方法对BodyContent对象中的内容(即标签体的执行结果)进行修改和控制其输出。

  在JSP API中也提供了BodyTag接口的实现类BodyTagSupport,我们在编写能够修改标签体内容的自定义标签的标签处理器类时,可以继承和扩展BodyTagSupport类,这相比实现BodyTag接口将简化开发工作。

2.5、 SimpleTag接口

  SimpleTag接口是JSP2.0中新增的一个标签接口。由于传统标签使用三个标签接口来完成不同的功能,显得过于繁琐,不利于标签技术的推广,因此,SUN公司为降低标签技术的学习难度,在JSP 2.0中定义了一个更为简单、便于编写和调用的SimpleTag接口。SimpleTag接口与传统标签接口最大的区别在于,SimpleTag接口只定义了一个用于处理标签逻辑的doTag方法,该方法在WEB容器执行自定义标签时调用,并且只被调用一次。那些使用传统标签接口所完成的功能,例如是否执行标签体、迭代标签体、对标签体内容进行修改等功能都可以在doTag方法中完成。

  在JSP API中也提供了SimpleTag接口的实现类SimpleTagSupport,我们在编写简单标签时,可以继承和扩展SimpleTagSupport类,这相比实现SimpleTag接口将简化开发工作。

2.6、传统标签接口中的各个方法可以返回的返回值说明

  下图列举了Tag接口、IterationTag接口和BodyTag接口中的主要方法及它们分别可以返回的返回值的说明。

  

三、开发传统标签实现页面逻辑

  开发人员在编写Jsp页面时,经常还需要在页面中引入一些逻辑,例如:

  • 控制jsp页面某一部分内容是否执行。
  • 控制整个jsp页面是否执行。
  • 控制jsp页面内容重复执行。
  • 修改jsp页面内容输出。

  自定义标签除了可以移除jsp页面java代码外,它也可以实现以上功能。

3.1、控制jsp页面某一部分内容是否执行  

  编写一个类实现tag接口,控制doStartTag()方法的返回值,如果这个方法返回EVAL_BODY_INCLUDE,则执行标签体,如果返回SKIP_BODY,则不执行标签体。

  SUN公司针对tag接口提供了一个默认的实现类TagSupport,TagSupport类中实现了tag接口的所有方法,因此我们可以编写一个类继承TagSupport类,然后再重写doStartTag方法。

示例代码如下:

TagDemo1.java

package me.gacl.web.tag;import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.Tag;
import javax.servlet.jsp.tagext.TagSupport;/*** @author gacl* TagSupport类实现了Tag接口,TagDemo1继承TagSupport类* */
public class TagDemo1 extends TagSupport {/* 重写doStartTag方法,控制标签体是否执行* @see javax.servlet.jsp.tagext.TagSupport#doStartTag()*/@Overridepublic int doStartTag() throws JspException {//如果这个方法返回EVAL_BODY_INCLUDE,则执行标签体,如果返回SKIP_BODY,则不执行标签体//return Tag.EVAL_BODY_INCLUDE;return Tag.SKIP_BODY;}
}

  在WEB-INF目录下的tld文件中添加对该标签处理类的描述,如下:

<tag><name>demo1</name><tag-class>me.gacl.web.tag.TagDemo1</tag-class><!--demo1标签有标签体,所以这里的body-content设置为JSP--><body-content>JSP</body-content>
</tag>

  在jsp页面中导入并使用自定义标签,如下:

<%@ page language="java" pageEncoding="UTF-8"%>
<%--在jsp页面中导入自定义标签库 --%>
<%@taglib uri="/gacl" prefix="gacl" %>
<!DOCTYPE HTML>
<html><head><title>控制标签体是否执行</title></head><body><%--在jsp页面中使用自定义标签 demo1标签是带有标签体的,标签体的内容是"孤傲苍狼"这几个字符串--%><gacl:demo1>孤傲苍狼</gacl:demo1></body>
</html>

 运行效果如下:

 

3.2、控制整个jsp页面是否执行

  编写一个类实现tag接口,控制doEndTag()方法的返回值,如果这个方法返回EVAL_PAGE,则执行标签余下的jsp页面,如果返回SKIP_PAGE,则不执行余下的jsp。

示例代码如下:

TagDemo2.java

package me.gacl.web.tag;import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.Tag;
import javax.servlet.jsp.tagext.TagSupport;/*** @author gacl* TagSupport类实现了Tag接口,TagDemo2继承TagSupport类*/
public class TagDemo2 extends TagSupport{/* 重写doEndTag方法,控制jsp页面是否执行* @see javax.servlet.jsp.tagext.TagSupport#doEndTag()*/@Overridepublic int doEndTag() throws JspException {//如果这个方法返回EVAL_PAGE,则执行标签余下的jsp页面,如果返回SKIP_PAGE,则不执行余下的jspreturn Tag.SKIP_PAGE;//return Tag.EVAL_PAGE;}}

  在WEB-INF目录下的tld文件中添加对该标签处理类的描述,如下:

<tag><name>demo2</name><tag-class>me.gacl.web.tag.TagDemo2</tag-class><!--demo2标签没有标签体,所以这里的body-content设置为empty--><body-content>empty</body-content>
</tag>

 在jsp页面中导入并使用自定义标签,如下:

<%@ page language="java" pageEncoding="UTF-8"%>
<%--在jsp页面中导入自定义标签库 --%>
<%@taglib uri="/gacl" prefix="gacl" %>
<!DOCTYPE HTML>
<html><head><title>控制jsp页面是否执行</title></head><body><h1>jsp页面的内容1</h1><%--在jsp页面中使用自定义标签 demo2标签是不带标签体的--%><gacl:demo2/><h1>jsp页面的内容2</h1></body>
</html>

  运行效果如下:

3.3、控制jsp页面内容重复执行

  编写一个类实现Iterationtag接口,控制doAfterBody()方法的返回值,如果这个方法返回EVAL_BODY_AGAIN, 则web服务器又执行一次标签体,依次类推,一直执行到doAfterBody方法返回SKIP_BODY,则标签体才不会重复执行。

示例代码如下:

TagDemo3.java

package me.gacl.web.tag;import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.IterationTag;
import javax.servlet.jsp.tagext.Tag;
import javax.servlet.jsp.tagext.TagSupport;public class TagDemo3 extends TagSupport {int x = 5;@Overridepublic int doStartTag() throws JspException {return Tag.EVAL_BODY_INCLUDE;}/* 控制doAfterBody()方法的返回值,* 如果这个方法返回EVAL_BODY_AGAIN, 则web服务器又执行一次标签体,* 依次类推,一直执行到doAfterBody方法返回SKIP_BODY,则标签体才不会重复执行。* @see javax.servlet.jsp.tagext.TagSupport#doAfterBody()*/@Overridepublic int doAfterBody() throws JspException {x--;if(x>0){return IterationTag.EVAL_BODY_AGAIN;}else{return IterationTag.SKIP_BODY;}}}

  在WEB-INF目录下的tld文件中添加对该标签处理类的描述,如下: 

<tag><name>demo3</name><tag-class>me.gacl.web.tag.TagDemo3</tag-class><!--demo3标签有标签体,所以这里的body-content设置为JSP--><body-content>JSP</body-content>
</tag>

在jsp页面中导入并使用自定义标签,如下:

<%@ page language="java" pageEncoding="UTF-8"%>
<%--在jsp页面中导入自定义标签库 --%>
<%@taglib uri="/gacl" prefix="gacl" %>
<!DOCTYPE HTML>
<html><head><title>控制页面内容重复执行5次</title></head><body><%--在jsp页面中使用自定义标签 demo3标签--%><gacl:demo3><h3>jsp页面的内容</h3></gacl:demo3></body>
</html>

  运行效果如下:

  

3.4、修改jsp页面内容输出

  编写一个类实现BodyTag接口,控制doStartTag()方法返回EVAL_BODY_BUFFERED,则web服务器会创建BodyContent对象捕获标签体,然后在doEndTag()方法体内,得到代表标签体的bodyContent对象,从而就可以对标签体进行修改操作。

  SUN公司针对BodyTag接口提供了一个默认的实现类BodyTagSupport,BodyTagSupport类中实现了BodyTag接口的所有方法,因此我们可以编写一个类继承BodyTagSupport类,然后再根据需要重写doStartTag方法和doEndTag()方法。

示例代码如下:

TagDemo4.java

package me.gacl.web.tag;import java.io.IOException;import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.BodyContent;
import javax.servlet.jsp.tagext.BodyTag;
import javax.servlet.jsp.tagext.BodyTagSupport;
import javax.servlet.jsp.tagext.Tag;/*** @author gacl* BodyTagSupport类实现了BodyTag接口接口,TagDemo4继承 BodyTagSupport类*/
public class TagDemo4 extends BodyTagSupport {/* 控制doStartTag()方法返回EVAL_BODY_BUFFERED* @see javax.servlet.jsp.tagext.BodyTagSupport#doStartTag()*/@Overridepublic int doStartTag() throws JspException {return BodyTag.EVAL_BODY_BUFFERED;}@Overridepublic int doEndTag() throws JspException {//this.getBodyContent()得到代表标签体的bodyContent对象BodyContent bodyContent = this.getBodyContent();//拿到标签体String content = bodyContent.getString();//修改标签体里面的内容,将标签体的内容转换成大写String result = content.toUpperCase();try {//输出修改后的内容this.pageContext.getOut().write(result);} catch (IOException e) {throw new RuntimeException(e);}return Tag.EVAL_PAGE;}
}

  在jsp页面中导入并使用自定义标签,如下:

<tag><name>demo4</name><tag-class>me.gacl.web.tag.TagDemo4</tag-class><!--demo4标签有标签体,所以这里的body-content设置为JSP--><body-content>JSP</body-content>
</tag>

  运行效果如下:

  

四、jsp传统标签开发总结

  在现在的jsp标签开发中,很少直接使用传统标签来开发了,目前用得较多的都是简单标签,所以Jsp的传统标签开发了解一下即可,下一篇重点介绍jsp简单标签的开发


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/328374.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

二级导航 sql php,帝国cms栏目导航调用之SQL语句调用一级栏目和二级栏目的方法...

帝国cms调用一级栏目及下面的二级栏目调用方法如下&#xff1a;SQL语句<?php $ecms_bq_sqlsys_ReturnEcmsLoopBq("select * from [!db.pre!]enewsclass where bclassid0 order by myorder limit 6",14,24,0);$bqno0;while($bqr$empire->fetch($ecms_bq_sql)){…

Java开发利器:IntelliJ IDEA的安装、配置与使用

1.尚硅谷-IDEA-IntelliJ IDEA的介绍和优势 2.尚硅谷-IDEA-版本介绍与安装前的准备 3.尚硅谷-IDEA-IDEA的卸载 4.尚硅谷-IDEA-IDEA的安装 5.尚硅谷-IDEA-安装目录和设置目录结构的说明 6.尚硅谷-IDEA-启动IDEA并执行HelloWorld 7.尚硅谷-IDEA-Module的使用 8.尚硅谷-IDEA…

开发者的利器:Docker 理解与使用

困扰写代码的机器难免会被我们安装上各种各样的开发工具、语言运行环境和引用库等一大堆的东西&#xff0c;长久以来不仅机器乱七八糟&#xff0c;而且有些相同的软件还有可能会安装不同的版本&#xff0c;这样又会导致一个项目正常运行了&#xff0c;却不小心破坏了另一个项目…

php环境搭建sqlserver,ThinkPHP5.0/5.1对接SQLServer数据库(宝塔环境)

SQLServer实际上是mssql&#xff0c;想要使用thinkphp的Db对象操作数据库前必须要在服务器上安装对应的扩展。宝塔面板的PHP安装路径为/www/server/php/ 且支持多个PHP版本共存&#xff0c;所以安装PHP扩展的方法与网上那些示例略有不同。下面是 PHP7.2 安装 pdo_sqlsrv5.6.0 扩…

<c:set>标签

转载自 <c:set> 标签 JSP 标准标签库 <c:set>标签用于设置变量值和对象属性。 <c:set>标签就是<jsp:setProperty>行为标签的孪生兄弟。 这个标签之所以很有用呢&#xff0c;是因为它会计算表达式的值&#xff0c;然后使用计算结果来设置 JavaBean 对…

layUI 日期组件单独使用 并且放大

日期类型 选择 layuI 的date 类型单独使用 <!DOCTYPE html> <html> <head><meta charset"utf-8"><title>layDate快速使用</title><link rel"stylesheet" href"/layui/css/layui.css" media"all…

Opserver开源的服务器监控系统(ASP.NET)

Opserver是Stack Exchange下的一个开源监控系统,系统本身由C#语言开发的ASP.NET&#xff08;MVC&#xff09;应用程序&#xff0c;无需任何复杂的应用配置&#xff0c;入门很快。下载地址&#xff1a;https://github.com/opserver/Opserver。据说&#xff0c;国内腾讯公司内部也…

jsp页面中JSTL/EL标签引用java后台静态static字段的方法总结

转载自 jsp页面中JSTL/EL标签引用java后台静态static字段的方法总结为什么使用该功能&#xff1f;项目中的每个页面都包含产品名称、Logo、版本等信息&#xff0c;我希望修改一处&#xff0c;其它所有的全部跟着变。 有同学会说那就都引用一个页面“”就Ok了&#xff1b;但是…

c 管理信息系统mysql,输入数据并输出信息的系统都称为()。A、信息系统B、数据库系统C、事务处理系统D、管理信息系统...

关于葡萄糖重吸收的叙述&#xff0c;错误的是()。A.只有近球小管可以重吸收B.与Na&#xff0b;的重吸收相耦联C.是一种主肌力评定时错误的做法是A、应使患者配合B、患者应适当去除衣物C、应检查涉及的所有关节D、应增加协同当使用竹笆脚手板时&#xff0c;纵向水平杆与横向水平…

一位跨平台开发者的自白

Andreia Gaita[1] 在 OSCON 开源大会上发表了一个题为跨平台开发者的自白[2]的演讲。她长期从事于开源工作&#xff0c;并且为Mono[3] 工程&#xff08;LCTT 译注&#xff1a;一个致力于开创 .NET 在 Linux 上使用的开源工程&#xff09;做着贡献&#xff0c;主要以 C#/C 开发。…

JS (intermediate value).Format is not a function问题解决

JS (intermediate value).Format is not a function问题解决 前言 最近项目遇到一个问题&#xff0c;就是在javascript中使用new Date().Format("YYYY-mm-dd")的时候&#xff0c;会出现报错现象&#xff0c;直接导致界面无法正常显示。下面为大家解答一下。 问题详情…

java程序大笨钟怎么打,L1-018.大笨鍾(Java)PAT團體程序設計天梯賽-練習集

微博上有個自稱“大笨鍾V”的家伙&#xff0c;每天敲鍾催促碼農們愛惜身體早點睡覺。不過由於笨鍾自己作息也不是很規律&#xff0c;所以敲鍾並不定時。一般敲鍾的點數是根據敲鍾時間而定的&#xff0c;如果正好在某個整點敲&#xff0c;那么“當”數就等於那個整點數&#xff…

JSP JavaBean

转载自 JSP JavaBeanJSP JavaBean JavaBean是特殊的Java类&#xff0c;使用J ava语言书写&#xff0c;并且遵守JavaBean API规范。 接下来给出的是JavaBean与其它Java类相比而言独一无二的特征&#xff1a; 提供一个默认的无参构造函数。需要被序列化并且实现了Serializable接…

layui 单独使用日期组件

<!DOCTYPE html> <html> <head><meta charset"utf-8"><title>layDate快速使用</title><link rel"stylesheet" href"/layui/css/layui.css" media"all"><style type"text/css"…

JSP中的EL表达式详细介绍

转载自 JSP中的EL表达式详细介绍一、JSP EL语言定义EL 提供了在 JSP 脚本编制元素范围外使用运行时表达式的功能。脚本编制元素是指页面中能够用于在 JSP 文件中嵌入 Java 代码的元素。它们通常用于对象操作以及执行那些影响所生成内容的计算。JSP 2.0 将 EL 表达式添加为一种…

php如何直接使用iview,iview安装使用

iView 是一套基于 Vue.js 的开源 UI 组件库&#xff0c;主要服务于 PC 界面的中后台产品。安装cd 项目cnpm install iview -S在项目中引入iview 在入口文件main.js中配置import iView from iviewimport iview/dist/styles/iview.cssVue.use(iView)官网示例{{ message }}export …

想获得腾讯发行机会?来“腾讯GAD•游戏创新大赛”

世界上最快乐的事&#xff0c;莫过于为理想而奋斗。正是源于心中对游戏的情怀和梦想&#xff0c;无数游戏人走上了游戏开发的道路。这条路&#xff0c;或迷茫、或坚定、或痛苦、或喜悦&#xff0c;但只要拥有理想与热情&#xff0c;便是航行的舵和帆。 腾讯GAD游戏开发者平台&a…

oxyen eclipse 启动 报错 se启动提示javaw.exe in your current PATH、No java virtual machine

eclipse启动提示javaw.exe in your current PATH、No java virtual machine 另外&#xff0c;也可修改eclipse.ini 文件&#xff0c;在最前面加上下面两行内容&#xff1a; -vm D:/java/jdk1.6.0_10/bin/javaw.exe *******************************************************…

JSTL常用标签6

转载自 JSTL常用标签6JSTL常用标签&#xff1a; 1、EL表达式可以取出Java Bean以及单个属性的值&#xff0c;在页面中使用${..},但是不能遍历集合。 使用JSTL可以遍历集合&#xff0c;因此使用EL和JSTL配合使用&#xff0c;基本上可以实现所有的功能。 2、在使用标签的页面中&…

matlab eval 不显示,matlab中 eval(command); 运算符无效的问题

下面这个程序是haar-like特征提取-->haar-like关键点显示-->haar-like特征人脸检测代码&#xff0c;该段代码在运行时出现了如图片所示的bug&#xff0c;本人看不懂这个bug出错的根源&#xff1a;(各行代码已有注释&#xff0c;出错的那一行代码已经用黄色底纹标出&#…