一、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 gacl
 9  * 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. javaweb学习总结(二十五)——jsp简单标签开发(一)

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

  2. JavaWeb学习记录(十六)——防止表单重复提交

    产生随机字符串进行验证,如果产生的和Session存储的相同则可以提交,提交后删除session对应的属性值:否则表单提交不成功 一.产生随机字符串的工具类 package web10.util; i ...

  3. JavaWeb学习记录(十九)——jstl自定义标签库之传统标签

    一.传统标签 (1)JSP引擎将遇到自定义标签时,首先创建标签处理器类的实例对象,然后按照JSP规范定义的通信规则依次调用它的方法. public void setPageContext(PageCo ...

  4. java web学习总结(二十六) -------------------JSP属性范围

    所谓的属性范围就是一个属性设置之后,可以经过多少个其他页面后仍然可以访问的保存范围. 一.JSP属性范围 JSP中提供了四种属性范围,四种属性范围分别指以下四种: 当前页:一个属性只能在一个页面中取得 ...

  5. JavaWeb学习记录(十九)——jstl自定义标签之简单标签

    一.简单标签共定义了5个方法: setJspContext方法 setParent和getParent方法 setJspBody方法 doTag方法 二.方法介绍 osetJspContext方法 用 ...

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

    一.统一全站字符编码 通过配置参数charset指明使用何种字符编码,以处理Html Form请求参数的中文问题 1 package me.gacl.web.filter; 2 3 import ja ...

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

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

  8. 我的MYSQL学习心得(十六) 优化

    我的MYSQL学习心得(十六) 优化 我的MYSQL学习心得(一) 简单语法 我的MYSQL学习心得(二) 数据类型宽度 我的MYSQL学习心得(三) 查看字段长度 我的MYSQL学习心得(四) 数据 ...

  9. Web 前端开发人员和设计师必读精华文章【系列二十六】

    <Web 前端开发精华文章推荐>2014年第5期(总第26期)和大家见面了.梦想天空博客关注 前端开发 技术,分享各类能够提升网站用户体验的优秀 jQuery 插件,展示前沿的 HTML5 ...

随机推荐

  1. jvm--3.内存管理

    5.JVM内存管理 JAVA虚拟机在执行java程序的过程中,会把它管理的内存分成若干个不同的数据区域. ----------------------------------------------- ...

  2. css只显示两行 超过显示点点点

    .p1{ text-align: center; color:#C8CFD6; height:34px; text-overflow:-o-ellipsis-lastline; overflow:hi ...

  3. ADB简单基础命令

    1.查看设备 adb devices 这个命令是查看当前连接的设备, 连接到计算机的android设备或者模拟器将会列出显示 2.安装软件 adb install adb install :这个命令将 ...

  4. Gradle 使用本地的Jar包(gradle oracle ojdbc14 )

    Gradle 使用本地的Jar包(gradle oracle ojdbc14 ) 因为Oracle的驱动包在Maven上是没办法直接下载到的,所以在使用Gradle的使用,会导致无法加载Oracle, ...

  5. Laravel框架 mysql 数据库 —— 基本使用

    增删改查 配置完数据库连接,就可以使用DB类进行查询了. 查询 $results = DB::select('select * from users where id = ?', array(1)); ...

  6. 20145210 20145226 《信息安全系统设计基础》实验五 简单嵌入式WEB服务器实验

    20145210 20145226 <信息安全系统设计基础>实验五 简单嵌入式WEB服务器实验 结对伙伴:20145226 夏艺华 实验报告封面 实验目的与要求 · 掌握在ARM开发板实现 ...

  7. CentOS_7 OpenWrt Eclipse 环境搭建与 Dr.com 开发笔记

    一:内核的编译. 1,linux 编译环境的搭建与源码的准备工作 2,常用软件的安装 (make menuconfig) 3,  针对TP-Link WR740N 一些软件的openwrt 的移植 4 ...

  8. js高阶函数

    我是一个对js还不是很精通的选手: 关于高阶函数详细的解释 一个高阶函数需要满足的条件(任选其一即可) 1:函数可以作为参数被传递 2:函数可以作为返回值输出 吧函数作为参数传递,这代表我们可以抽离一 ...

  9. 如何很好的使用Linq的Distinct方法

    Person1: Id=1, Name="Test1" Person2: Id=1, Name="Test1" Person3: Id=2, Name=&quo ...

  10. Qt *.pro编写一般规则

    qmake 之 CONFIG 与 QT 乱谈 看qtcn论坛中经常有人忘记 QT+=network 等语句.随便写写吧,或许对他人有帮助. 写来写去,发现越写越乱,就这样吧,反正主要的内容很简单. d ...