一、JspFragment类介绍

  javax.servlet.jsp.tagext.JspFragment类是在JSP2.0中定义的,它的实例对象代表JSP页面中的一段符合JSP语法规范的JSP片段,这段JSP片段中不能包含JSP脚本元素。WEB容器在处理简单标签的标签体时,会把标签体内容用一个JspFragment对象表示,并调用标签处理器对象的setJspBody方法把JspFragment对象传递给标签处理器对象。JspFragment类中只定义了两个方法,如下所示:

  getJspContext方法

    用于返回代表调用页面的JspContext对象.
  public abstract void invoke(java.io.Writer out)

    用于执行JspFragment对象所代表的JSP代码片段,参数out用于指定将JspFragment对象的执行结果写入到哪个输出流对象中,如果 传递给参数out的值为null,则将执行结果写入到JspContext.getOut()方法返回的输出流对象中。(简而言之,可以理解为写给浏览器)

1.1、invoke方法详解

  JspFragment.invoke方法是JspFragment最重要的方法,利用这个方法可以控制是否执行和输出标签体的内容、是否迭代执行标签体的内容或对标签体的执行结果进行修改后再输出。例如:
  在标签处理器中如果没有调用JspFragment.invoke方法,其结果就相当于忽略标签体内容;
  在标签处理器中重复调用JspFragment.invoke方法,则标签体内容将会被重复执行;
  若想在标签处理器中修改标签体内容,只需在调用invoke方法时指定一个可取出结果数据的输出流对象(例如StringWriter),让标签体的执行结果输出到该输出流对象中,然后从该输出流对象中取出数据进行修改后再输出到目标设备,即可达到修改标签体的目的。

二、开发带属性的标签

  自定义标签可以定义一个或多个属性,这样,在JSP页面中应用自定义标签时就可以设置这些属性的值,通过这些属性为标签处理器传递参数信息,从而提高标签的灵活性和复用性。要想让一个自定义标签具有属性,通常需要完成两个任务

  1. 在标签处理器中编写每个属性对应的setter方法
  2. 在TLD文件中描术标签的属性

  为自定义标签定义属性时,每个属性都必须按照JavaBean的属性命名方式,在标签处理器中定义属性名对应的setter方法,用来接收 JSP页面调用自定义标签时传递进来的属性值。 例如属性url,在标签处理器类中就要定义相应的setUrl(String url)方法。
  在标签处理器中定义相应的set方法后,JSP引擎在解析执行开始标签前,也就是调用doStartTag方法前,会调用set属性方法,为标签设置属性。

2.1、开发带属性的标签范例

范例1:通过标签的属性控制标签体的执行次数

示例代码如下:

SimpleTagDemo5.java

 1 package me.gacl.web.simpletag;2 3 import java.io.IOException;4 import javax.servlet.jsp.JspException;5 import javax.servlet.jsp.tagext.SimpleTagSupport;6 7 /**8  * @author gacl9  * SimpleTagSupport类实现了SimpleTag接口,
10  * SampleTagDemo5类继承SimpleTagSupport
11  * 通过标签的属性控制标签体的执行次数
12  */
13 public class SimpleTagDemo5 extends SimpleTagSupport {
14
15     /**
16      * 定义标签的属性
17      */
18     private int count;
19
20     /**count属性对应的set方法
21      * @param count
22      */
23     public void setCount(int count) {
24         this.count = count;
25     }
26
27     /* 简单标签使用这个方法就可以完成所有的业务逻辑
28      * @see javax.servlet.jsp.tagext.SimpleTagSupport#doTag()
29      * 重写doTag方法,通过标签的属性控制标签体的执行次数
30      */
31     @Override
32     public void doTag() throws JspException, IOException {
33         for (int i = 0; i < count; i++) {
34             this.getJspBody().invoke(null);
35         }
36     }
37
38 }

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

 1 <tag>2         <!-- 标签名 -->3         <name>demo5</name>4         <!-- 标签处理器类-->5         <tag-class>me.gacl.web.simpletag.SimpleTagDemo5</tag-class>6         <!-- 标签体允许的内容-->7         <body-content>scriptless</body-content>8         9         <!-- 标签的属性描述 -->
10         <attribute>
11             <description>描述标签的count属性</description>
12             <!-- 标签的count属性 -->
13             <name>count</name>
14             <required>true</required>
15             <!-- rtexprvalue用来指示标签的属性值是否可以是一个表达式,
16             一般设置为true,true就表示允许标签的属性值可以是一个表达式-->
17             <rtexprvalue>true</rtexprvalue>
18         </attribute>
19 </tag>

  在jsp页面引入标签库并使用自定义标签

 1 <%@ page language="java" pageEncoding="UTF-8"%>2 <%--在jsp页面中导入自定义标签库 --%>3 <%--<%@taglib uri="/simpletag" prefix="gacl" %>--%>4 <%--在jsp页面中也可以使用这种方式导入标签库,直接把uri设置成标签库的tld文件所在目录 --%>5 <%@taglib uri="/WEB-INF/simpletag.tld" prefix="gacl"%>6 <!DOCTYPE HTML>7 <html>8   <head>9     <title>通过标签的属性控制标签体的执行次数</title>
10   </head>
11
12   <body>
13        <%--在jsp页面中使用自定义标签,标签有一个count属性 --%>
14           <gacl:demo5 count="2">
15               <h1>孤傲苍狼</h1>
16           </gacl:demo5>
17   </body>
18 </html>

  运行效果如下:

  

  如果标签的属性值是8种基本数据类型,那么在JSP页面在传递字符串时,JSP引擎会自动转换成相应的类型,但如果标签的属性值是复合数据类型,那么JSP引擎是无法自动转换的

范例2:标签接收的属性值是一个复合数据类型,该如何给标签的属性赋值

示例代码如下:

SimpleTagDemo6.java

 1 package me.gacl.web.simpletag;2 3 import java.io.IOException;4 import java.util.Date;5 6 import javax.servlet.jsp.JspException;7 import javax.servlet.jsp.tagext.SimpleTagSupport;8 9 /**
10  * @author gacl
11  * SimpleTagSupport类实现了SimpleTag接口,
12  * SampleTagDemo6类继承SimpleTagSupport
13  * 标签的属性说明
14  */
15 public class SimpleTagDemo6 extends SimpleTagSupport {
16
17     /**
18      * 定义标签的属性
19      */
20     private Date date;
21
22     /**date属性对应的set方法
23      * @param date
24      */
25     public void setDate(Date date) {
26         this.date = date;
27     }
28
29     /* 简单标签使用这个方法就可以完成所有的业务逻辑
30      * @see javax.servlet.jsp.tagext.SimpleTagSupport#doTag()
31      * 重写doTag方法,输出date属性值
32      */
33     @Override
34     public void doTag() throws JspException, IOException {
35         this.getJspContext().getOut().write(date.toLocaleString());
36     }
37 }

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

 1 <tag>2         <!-- 标签名 -->3         <name>demo6</name>4         <!-- 标签处理器类-->5         <tag-class>me.gacl.web.simpletag.SimpleTagDemo6</tag-class>6         <!-- 标签体允许的内容-->7         <body-content>empty</body-content>8         9         <!-- 标签的属性描述 -->
10         <attribute>
11             <description>描述标签的date属性</description>
12             <!-- 标签的date属性,复合数据类型 -->
13             <name>date</name>
14             <required>true</required>
15             <!-- rtexprvalue用来指示标签的属性值是否可以是一个表达式,
16             一般设置为true,true就表示允许标签的属性值可以是一个表达式-->
17             <rtexprvalue>true</rtexprvalue>
18         </attribute>
19 </tag>

  在jsp页面引入标签库并使用自定义标签

 1 <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>2 <%--在jsp页面中导入自定义标签库 --%>3 <%--<%@taglib uri="/simpletag" prefix="gacl" %>--%>4 <%--在jsp页面中也可以使用这种方式导入标签库,直接把uri设置成标签库的tld文件所在目录 --%>5 <%@taglib uri="/WEB-INF/simpletag.tld" prefix="gacl"%>6 <!DOCTYPE HTML>7 <html>8   <head>9     <title>如果标签接收的属性值是一个复合数据类型,该如何给标签的属性赋值</title>
10   </head>
11
12   <body>
13      <%--
14      在jsp页面中使用自定义标签,标签有一个date属性 ,是一个复合数据类型
15        如果标签的属性值是8种基本数据类型,那么在JSP页面在传递字符串时,JSP引擎会自动转换成相应的类型
16        但如果标签的属性值是复合数据类型,那么JSP引擎是无法自动转换的,
17        这里将一个字符串赋值给demo6标签的date属性,在运行标签时就会出现如下错误:
18      Unable to convert string "1988-05-07" to class "java.util.Date" for attribute "date":
19      Property Editor not registered with the PropertyEditorManager
20           <gacl:demo6 date="1988-05-07">
21           </gacl:demo6>
22       --%>
23       <%--如果一定要给标签的复合属性赋值,那么可以采用表达式的方式给复合属性赋值,如下所示: --%>
24
25       <%
26           Date d = new Date();
27         request.setAttribute("date", d);
28       %>
29
30       <gacl:demo6 date="${date}"/>
31       <hr/>
32       <gacl:demo6 date="<%=new Date()%>"/>
33   </body>
34 </html>

  运行效果如下:

  

2.1、tld文件中用于描述标签属性的<attribute>元素说明

  <tag>元素的<attribute>子元素用于描述自定义标签的一个属性,自定义标签所具有的每个属性都要对应一个<attribute>元素

例如:

 1 <tag>2         <!-- 标签名 -->3         <name>demo5</name>4         <!-- 标签处理器类-->5         <tag-class>me.gacl.web.simpletag.SimpleTagDemo5</tag-class>6         <!-- 标签体允许的内容-->7         <body-content>scriptless</body-content>8         9         <!-- 标签的属性描述 -->
10         <attribute>
11             <description>描述标签的count属性</description>
12             <!-- 标签的count属性 -->
13             <name>count</name>
14             <required>true</required>
15             <!-- rtexprvalue用来指示标签的属性值是否可以是一个表达式,
16             一般设置为true,true就表示允许标签的属性值可以是一个表达式-->
17             <rtexprvalue>true</rtexprvalue>
18         </attribute>
19 </tag>

<attribute>元素的子元素说明:

  

  到此,简单标签的开发技术就算是全部讲完了,在下一篇博文中会编写一些自定义标签的案例来加深自定标签技术的学习和理解。

javaweb学习总结(二十六)——jsp简单标签标签库开发(二)相关推荐

  1. 天下杂侃——《二十六妹让我信基督(二)》

    近来多有倦怠,可以说有点沉沦,太阳热情的过了火,使哥哥这原本饱受煎熬的心,更添浮躁,内心颇不宁静. 久闻东南莫干山乃避暑胜地,慕名多时了,去转了转! 常熟去德清,必走苏嘉杭高速,这让哥哥我忆起一个人来 ...

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

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

  3. javaweb学习总结(四十六)——Filter(过滤器)常见应用

    2019独角兽企业重金招聘Python工程师标准>>> 一.统一全站字符编码 通过配置参数charset指明使用何种字符编码,以处理Html Form请求参数的中文问题 1 pack ...

  4. javaweb学习总结(三十六)——使用JDBC进行批处理

    在实际的项目开发中,有时候需要向数据库发送一批SQL语句执行,这时应避免向数据库一条条的发送执行,而应采用JDBC的批处理机制,以提升执行效率. JDBC实现批处理有两种方式:statement和pr ...

  5. STM32CubeIDE开发(二十六), STM32的CAN总线开发要点

    一.CAN总线简介 1.1 CAN概述 CAN是Controller Area Network(控制区域网络) 的缩写,是ISO国际标准化的串行通信协议.由德国电气商博世公司在1986年率先提出.此后 ...

  6. JavaWeb学习笔记(十九)之自定义标签

    自定义标签 开发步骤 1.编写标签处理类 (1)传统方式(JSP1.1):实现javax.servlet.jsp.tagext.Tag接口 doSatrtTag():标签处理类的核心方法 该方法有以下 ...

  7. MFC开发IM-第二十六篇、vs2008添加库文件

    [Setting]VS2008项目怎样添加"依赖(lib)"."库目录(Libs)"."包含目录(include)"和"引用动态链 ...

  8. 如何统计二十六个英语字母(简便思想)

    如何统计二十六个英语字母(简便思想) //如何统计二十六个英语字母(简便思想)#include<stdio.h>#include<String.h>#define N 1000 ...

  9. JavaWeb学习总结(五十二)——使用JavaMail创建邮件和发送邮件

    JavaWeb学习总结(五十二)--使用JavaMail创建邮件和发送邮件 一.RFC882文档简单说明 RFC882文档规定了如何编写一封简单的邮件(纯文本邮件),一封简单的邮件包含邮件头和邮件体两 ...

最新文章

  1. 那些学校计算机招不满,那些招不满人的985院校,请留意!
  2. mongodb 安装pymongo 驱动
  3. OpenCV像素点处理 1
  4. mysql 异常处理实例
  5. Python 骚操作,微信远程控制电脑
  6. vmware Failed to initialize remote display subsystem
  7. [线性代数学习笔记] 线性递推数列及 Berlekamp-Massey 算法的详细推导过程
  8. 信号 移相 matlab,MATLAB中的SISOTOOL在数字式移相全桥中的应用
  9. CSS学习笔记(四)CSS字体属性
  10. java spring源码_spring源码分析-spring中的bean
  11. Android编译默认英语,Android 编译系统 (一)
  12. [bzoj1468][poj1741]Tree_点分治
  13. java包含某个字符串_JavaScript判断一个字符串是否包含指定子字符串的方法
  14. 2020五一建模C题:饲料混合加工问题完整论文(附录有代码)
  15. android 地图不能拖动,英雄联盟不能拖动小地图的处理方法
  16. Vue+高德地图API的使用(点击地图搜索周边信息)
  17. 服务器kvm切换器维修,服务器数字KVM切换器
  18. ValueError: No JSON object could be decoded 成功解决
  19. 使用kindlegen转换工具将电子书epub到mobi格式时遇到错误(prcgen):E24010:超链接:display:none
  20. 高校的论文查重系统有哪些?

热门文章

  1. OpenGL渲染纹理和平面反射
  2. c++虚继承和虚函数和抽象类、接口类,聚合类
  3. QT的QStorageInfo类的使用
  4. QT的QItemModelBarDataProxy类的使用
  5. C++创建一个特殊的类
  6. 「Ubuntu」ModuleNotFoundError: No module named ‘softwareproperties‘
  7. 01_关于TensorFlow、什么是数据流图(Data Flow Graph)、TensorFlow的特征、谁可以使用Tensorflow、为啥Google要开源这个神器?
  8. 本地编译Hadoop2.8.0源码总结和问题解决(转自:http://blog.csdn.net/young_kim1/article/details/50324345)
  9. solr 自定义 dismax查询方式
  10. 01_Linux系统系统语言查询,设置Xshell工具,中文显示,测试Xshell中文字符显示,Linux中文显示乱码设置