用户名: 密码: 免费注册 忘记密码? 加入收藏 | 设为首页
JSP/Servlet/JSF:标签库的深入研究
学院首页 | 资讯中心 | 服务器软件 | 系统工具 | 系统软件 | 办公软件 | 聊天软件 | 多 媒 体 | 网页制作 | 网站运营 | 平面设计
艺术欣赏 | 数据库软件 | 程序开发 | 网络组建 | 源码下载 | 驱动下载 | 软件下载 | 电脑安全 | IT创业 | IT博客 | IT社区
硬件数码导航 | 硬件频道 | 本本频道 | MP3频道 | 相机频道 | 手机频道 | 显卡频道 | LCD 频道 | 音箱音频 | 行情 | 评测 | 导购
学院专题 软件 - 系统 - 办公 - 聊天 - 多媒体 - 网页制作 - IT创业 - 运营 - 平面 - 设计欣赏 - 数据库 - 程序 - 服务器 - 组网

 当前位置: 首页>>技术频道>>程序>>JSP教程>>正文

JSP/Servlet/JSF:标签库的深入研究

日期:2006-9-15 4:26:13     来源:javajia   编辑:   

标签库Taglib

标签被定义和分布在一个称为标签库的结构中,一个标签库是由元信息和类组成的集合:

1.标签处理器:实现定制标签功能的Java类 。

2.标签附加信息(TEI):向JSP容器提供边辑以确认标签属性和创建变量的类 。

3.标签库描述器(TLD):描述单个标签和整个标签库属性的XML文档 。

标签处理器和标签附加信息需要定位在JSP容器类载入器可以找到的地方 。 标签库描述器可在URL指定的符意位置 。 JSP1.1规范要求JSP容器接受一个打包成因定结构的JAR文件的标签库 。 TLD必须是/META-INF目录中名为taglib.tld的文件,JAR文件则复制到/WEB-INF/lib目录下 。

一、标签实现

1.开发步骤

a.定义标签的名字、属性、声明的变量和标签体的内容 。

b.编写标签库描述器TLD 。

c.编写标签处理器 。

d.在JSP页面中使用标签 。

2.JSP页面在JSP容器中的转换步骤:

JSP页面存在三种形式:jsp文件、java文件和class文件 。

a.指令元素<%@page%>、<%@include%>和<%@taglib%>向JSP容器提供转换时信息 。

b.HTML行在_jspService()方法中依顺序转换到out.print()语名中 。

c.脚本元素的声明被原封不动地复制到_jspService()方法外的源码中 。

d.脚本元素的表达式在_jspService()方法中依顺序转换到out.print()语名中 。

e.脚本元素的Scriptlet被原封不动地复制到_jspService()方法中 。

f.行为元素被转换为执行其功能的运行时逻辑代码 。

g.定制标签被扩展到调用其相应标签处理器中方法的Java语句中 。

3.标签在JSP容器中的转换步骤:

a.JSP容器使用taglib指令元素定位标签库描述器,将页面中用到的定制标签和TLD相匹配 。

b.读取标签库描述器的标签列表和每一标签相关的类名字 。

c.在页面中遇到一个标签时,查找与具有指定名字的标签前缀相关的一个标签库 。

d.容器使用在TLD中找到的标签结构信息生成一系列完成标签功能的Java语句 。

二、标签库描述器(TLD)

标签库描述器是一个描述整个标签库标记信息和库中每个标签处理器及其属性的XML文档 。

标签库描述器的DTD由一个简单的元素组成,此元素包含下列一些子元素 。

整个标签库标记信息

tlibversion标签库版本号 。 是一个点式十进制数,最多为4组小数点分隔的数字组成 。

jspversion标签库所需的JSP规范最低版本 。 例如JSP1.1

shortname标签库的缩写名 。 JSP可以使用该名字作为库中标签的缺省前缀 。

uri标签库唯一URI的元素 。 典型URL位置来自可下载taglib的位置 。

info标签库描述信息 。

每个标签处理器及其属性

tag在TLD中加入标签,描述组成库的每个标签 。

name与标签库的名字前缀一起使用的标签的名字,是JSP容器唯一的标签标识 。

tagclass实现标签的标签处理器类的全名 。

teiclass标签附加信息(TEI)类的全名 。 TEI类给出关于标签处理器创建变量及对标签司性执行的任意有效性验证的信息 。

bodycontent描述标签处理器如何使用标签体的内容 。 有三种取值:

empty:表示标签体必须为空;

JSP:表示脚本元素和模板及其它标签一样被评估 。

tagdependent:体内容被原封不动写入BodyContent,其它脚本元素以源码形式出现,而不被JSP容器解释 。

info标签的人工可读描述性信息 。

attribute使用标签时被编码的属性信息 。 用于定义标签的属性 。

属性名:属性的名字 。

true|false:属性在标签用到的位置是否要被编码 。

true|false:属性值能否用表达式指定 。

三、标签处理器

标签处理器是通过实现JSP容器调用的一系列预定义方法执行定制标签行为的一个Java类 。

标签处理器实现了标签的行为,标签处理器是Java类 。

1.标签处理器的工作方式

a.导入javax.servlet.jsp和javax.servlet.jsp.tagext包 。

b.实现javax.servlet.jsp.tagext包中的Tag接口或BodyTag接口 。 BodyTag是Tag的子接口 。

c.继承TagSupport类或BodyTagSuppoert类 。 它们是上述接口的缺省实现 。

d.重载publicintdoStartTag()throwsJspException方法 。

2.标签处理器的接口与实现

javax.servlet.jsp.tagext.Tag是实现标签的最基本的接口 。

javax.servlet.jsp.tagext.TagSupport是实现Tag接口的具体类 。

通常情况下继承tagSupport类而不直接实现Tag接口通常是有益的 。 除了对所有必需方法提供了缺省实现外、还保存了pageContext对象及对嵌套标签的支持 。

Tag接口包含4个常量,表示doStartTag()和doEndTag()方法可能的返回码 。

EVAL_BODY_INCLUDE当doStartTag()返回时,指明servlet应对标签体进行评估 。

SKIP_BODY当doStartTag()返回时,指明servlet应忽视标签体 。

EVAL_PAGE当doEndTag()返回时,指明页面其余部分应被评估 。

SKIP_PAGE当doEndTag()返回时,指明页面其余部分就被跳过 。

Tag接口的方法

publicvoidsetPageContext(PageContextctx)生成的servlet在请求处理器执行其它任务前首先调用此方法,实现类应保存上下文对象以便它可以在标签生命期中使用 。 从页面上下文中标签处理器可以访问所有JSP隐含对象 。

publicvoidsetParent(Tagp)使用一个标答可以找到操作栈中它上面的标签 。 在setPageContext后立即调用 。

publicTaggetParent()返回父标签 。

publicintdoStartTag()throwsJsp在设置了页面上下文、父标签和开始标记中编码的属性后调用 。 返回码表明JSP实现servlet是否就评估标签体 。

publicintdoEndTag()throwsJspException当遇到结否标记时调用 。 返回码表明JSP是否就继纽页面的其余部份 。

publicvoidrelease()确保在页面退出前被调用 。 释放资源并重置标签处理器状态 。

TagSupport类的方法

publicstaticTagfinAncestorWithClass(TagthisTag,Classcls)为所需的父标签处理器查找运行时标签栈 。 一个标签处理器可以提供其范围内子标签调用的方法 。

publicvoidsetId(Stringid)保存和检索在id属性中指定的名字 。

publicvoidsetValue(Stringname,Objecto)在本地哈希表中设置指定名字的值 。

publicObjectgetValue(Stringname)从本地哈希表中获取指定名称的值 。

publicvoidremoveValue(Stringname)从本地哈希表中删除指定名称的值 。

publicEnumerationgetValues()返回哈希表中关键字的一个枚举 。

3.标签处理器的生命期

a.生成servlet需要创建标签处理器类的一个实例 。 实现方式通常是调用JSP容器的工厂类的一个方法,工厂类包含一个标签处理器实例池以使其可重用不再处于激活状态的对象 。

b.初始化标签处理器,使servlet获知其存在性 。 servlet通过调用标签处理器的两个方法实现此过程:setPageContext(PageContextctx)和setParent(Tagparent) 。

c.如果标签具有属性,属性的取值通过处理器提供setter方法传入到对象 。 属性setter方法是一个标签支持属性所需的唯一方法 。

d.页面的上下文和父标签已被调置,并已具备属性 。 此时调用标签处理器的doStartTag()方法,该方法可以读取这些变量并执行实现标答功能所需的计算和操作 。 doStartTag()方法必须返回一个整型数 。 返回EVAL_BODY_INCLUDE则正常处理标签体,返回SKIP_BODY则从初始JSP页面中直到此标签结束标记处的内容均被忽略 。

e.标签体被评估或忽视后调用标签处理器的doEndTag()方法,返回EVAL_PAGE则页面的其余部分被评估,返回SKIP_PAGE则servlet代码立即从_jspService()中返回 。

4.体标签处理器的接口与实现

javax.servlet.jsp.tagext.BodyTag是Tag的子接口 。

javax.servlet.jsp.tagext.BodyTagSupport是实现BodyTag类 。

BodyContent是javax.servlet.jsp.JspWriter的子类,但与其父类有所区别 。

BodyContent对象的内容不自动写了入servlet的输出流,而是积累在一字符串缓存中 。 当标签体完成后其对象仍可在doEndTag()方法中可以应用,由getString()或getReader()方法操作 。 并在必要时修改及写入恢复的JspWriter输出流 。

BodyContent类的方法

publicvoidflush()throwsIOException复写JspWrite.flush()方法以便它总是产生溢出 。 刷新写入已失效,因为它没有连接到将被写入的实际输出流中 。

publicvoidclearBody()重置BodyContent缓存为空 。

publicReadergetReader()返回Reader读取体内容 。

publicStringgetString()返回包含体内容的一个字符串 。

publicvoidwriteOut(Writew)将体内容写入指定输出 。

publicJspWritegetEnclosingWrite()返回栈中下一个更高的写入者对象(可能是另一个BodyContent对象) 。

gigi_miao
  ▼ 下一篇新闻 JSP程序员成长之路
  ▲ 上一篇新闻 jsp连接数据库大全(java)        网友发表观点请进入=>



我要纠错】【进入论坛交流】【关闭此页

文章搜索
   
最新文章

 
·千名爱好者参与首届PHP调查
·腾讯称QQ通讯信息密钥加密 不会被
·雅虎反超Google排名搜索第二
·中搜等十余家IT企业因流氓软件被
·盛大前员工克隆网游装备获暴利被
·凤凰网将向迅雷提供娱乐及宽带内
·信产部出手规范 新浪式企业法律架
·雅虎中国称旗下软件早已没有流氓
·中搜停止划词搜索与流氓软件决裂

广告赞助
相关文章 相关教程下载
焦点信息
·腾讯称QQ通讯信息密钥加密 不会被监听
·信产部出手规范 新浪式企业法律架构不得不改
·盛大前员工克隆网游装备获暴利被追刑责
·凤凰网将向迅雷提供娱乐及宽带内容
·雅虎中国称旗下软件早已没有流氓问题
·雅虎反超Google排名搜索第二
网友评论:(评论内容只代表网友观点,与本站立场无关!)
发表评论     Hard168社区推荐帖子
姓 名: *
* 请网友遵纪守法并注意语言文明。
IT人物推荐

王江民
马云
柳传志



关于本站    联络方式    广告服务    意见信箱    加入收藏   设为首页    -
本站部分内容来自网上,如有侵权部分,敬请告知,我们会在24小时内给予处理
版权所有:Hard168.Com,如需转载文章请与我们取得联系
京ICP备05063857号 Designed by Hard168.Com
JSP/Servlet/JSF:标签库的深入研究