一
基本概念
标签(Tag)
标签是一种XML元素通过标签可以使JSP网页变得简洁并且易于维护还可以方便地实现同一个JSP文件支持多种语言版本由于标签是XML元素所以它的名称和属性都是大小写敏感的
标签库(Tag library)
由一系列功能相似逻辑上互相联系的标签构成的集合称为标签库
标签库描述文件(Tag Library Descriptor)
标签库描述文件是一个XML文件这个文件提供了标签库中类和JSP中对标签引用的映射关系它是一个配置文件和webxml是类似的
标签处理类(Tag Handle Class)
标签处理类是一个Java类这个类继承了TagSupport或者扩展了SimpleTag接口通过这个类可以实现自定义JSP标签的具体功能
二自定义JSP标签的格式
为了使到JSP容器能够使用标签库中的自定义行为必须满足以下两个条件
)从一个指定的标签库中识别出代表这种自定义行为的标签
)找到实现这些自定义行为的具体类
第一个必需条件找出一个自定义行为属于那个标签库是由标签指令的前缀(Taglib Directives Prefix)属性完成所以在同一个页面中使用相同前缀的元素都属于这个标签库每个标签库都定义了一个默认的前缀用在标签库的文档中或者页面中插入自定义标签所以你可以使用除了诸如jspjspxjavaservletsunsunw(它们都是在JSP白皮书中指定的保留字)之类的前缀
uri属性满足了以上的第二个要求为每个自定义行为找到对应的类这个uri包含了一个字符串容器用它来定位TLD文件在TLD文件中可以找到标签库中所有标签处理类的名称
当web应用程序启动时容器从WEBINF文件夹的目录结构的METAINF搜索所有以tld结尾的文件也就是说它们会定位所有的TLD文件对于每个TLD文件容器会先获取标签库的URI然后为每个TLD文件和对应的URI创建映射关系
在JSP页面中我们仅需通过使用带有URI属性值的标签库指令来和具体的标签库匹配
三自定义JSP标签的处理过程
在JSP中引入标签库
在JSP中使用标签库标签
Web容器根据第二个步骤中的prefix获得第一个步骤中声明的taglib的uri属性值
Web容器根据uri属性在webxml找到对应的元素 从元素中获得对应的元素的值 Web容器根据元素的值从WEBINF/目录下找到对应的tld文件 从tld文件中找到与tagname对应的元素 凑元素中获得对应的元素的值 Web容器根据元素的值创建相应的tag handle class的实例 Web容器调用这个实例的doStartTag/doEndTag方法完成相应的处理
四创建和使用一个Tag Library的基本步骤
创建标签的处理类(Tag Handler Class)
创建标签库描述文件(Tag Library Descrptor File)
在webxml文件中配置元素 在JSP文件中引人标签库
五TagSupport类简介
处理标签的类必须扩展javaxservletjspTagSupport
TagSupport类的主要属性
Aparent属性代表嵌套了当前标签的上层标签的处理类
BpageContex属性代表Web应用中的javaxservletjspPageContext对象
JSP容器在调用doStartTag或者doEndTag方法前会先调用setPageContext和setParent方法设置pageContext和parent因此在标签处理类中可以直接访问pageContext变量
在TagSupport的构造方法中不能访问pageContext成员变量因为此时JSP容器还没有调用setPageContext方法对pageContext进行初始化
六TagSupport处理标签的方法
TagSupport类提供了两个处理标签的方法
public int doStartTag() throws JspException
public int doEndTag() throws JspException
doStartTag:但JSP容器遇到自定义标签的起始标志就会调用doStartTag()方法
doStartTag()方法返回一个整数值用来决定程序的后续流程
ATagSKIP_BODY:表示?>…之间的内容被忽略
BTagEVAL_BODY_INCLUDE:表示标签之间的内容被正常执行
doEndTag:但JSP容器遇到自定义标签的结束标志就会调用doEndTag()方法doEndTag()方法也返回一个整数值用来决定程序后续流程
ATagSKIP_PAGE:表示立刻停止执行网页网页上未处理的静态内容和JSP程序均被忽略任何已有的输出内容立刻返回到客户的浏览器上
BTag_EVAL_PAGE:表示按照正常的流程继续执行JSP网页
七用户自定义的标签属性
如果在标签中还包含了自定义的属性那么在标签处理类中应该将这个属性作为成员变量并且分别提供设置和读取属性的方法
八创建标签处理类的步骤
创建包含JSP网页静态文本的文件(即是要替换自定义JSP标签的文本)
在Web应用启动时装载静态文本
创建标签处理类
九如何创建包含JSP网页静态文本的文件
使用javautilProperties类来存放要替换网页中自定义JSP标签的静态文本
Properties类代表了一系列属性的集合其实例既可以被保存到流中也可以从流中加载这些文本以key/value的形式存放在WEBINF目录下例如key=value在属性列表中这些key/value都是String类型的
十Properties类的常用API
setProperty(String key String value)调用Hashtable类的put方法添加属性
getProperty(String key)获取属性列表中key对应的属性值
load(InputStream in)从输入流对象InputStream中读取属性列表(Properties list)
store(OutputStream outString coMMent)使用适当的格式将属性列表的属性对写入输出流对象中默认使用ISO编码格式以行的方式处理输入属性的key/value之间以=配对以回车换行分隔key/value配对
十一ServletContext类的常用API
getContext(String uripath)返回服务器中uripath所代表的ServletContext对象
getInitParameter(String name)返回ServletConfig对象中name参数的值
getMineType(String file)返回file参数代表的文件的MIME类型
getRequestDispatcher(String path)返回path代表的RequestDispacher对象
getResourceAsStream(String path)以输入流的形式返回path对应的资源在输入留中对象可以为任意形式的数据path参数必须以/开始且相对于Context Root
十二如何使用ServletContxt读取并保存属性文件
创建javautilProperties类对象
获取ServletContext对象
将属性文件以输入流的形式读入到某个输入流对象中
将输入流对象加载到Properties对象中
将Properties对象保存到ServletContext对象中
十三如何在Web应用启动时装载静态文本
创建继承了HttpServlet类的子类在webxml中配置这Servlet时设置loadonstartup属性
someclass
somepackageSomeClass
在这个Servlet的init()方法中创建javautilProperties类
获取当前Web应用的ServletContext对象
将WEBINF目录下的属性文件读入到输入流InputStream中
InputStream in = contextgetResourceAsString(WEBINF/somepropertiesproperties)
将输入流加载到属性对象中
psload(in)
将属性对象保存到上
contextsetAttribute(attributeNameps)
十四如何创建标签处理类
引入必需的资源
import javaxservletjsp*; import javaxservlethttp*; import javautil*; import javaio*;
继承TagSupport类并覆盖doStartTag()/doEndTag()方法
从ServletContext对象中获取javautilProperties对象
从Properties对象中获取key对应的属性值
对获取的属性进行相应的处理并输出结果
十五创建标签库描述文件(Tag Library Descriptor)
标签库描述文件简称TLD采用XML文件格式定义了用户的标签库TLD文件中的元素可以分成类
A标签库元素
B标签元素
C标签属性元素
标签库元素用来设定标签库的相关信息它的常用属性有
Ashortname:指定Tag Library默认的前缀名(prefix)
Buri:设定Tag Library的惟一访问表示符
标签元素用来定义一个标签它的常见属性有
Aname:设定Tag的名字
Btagclass:设定Tag的处理类
Cbodycontent:设定标签的主体(body)内容
)empty:表示标签中没有body;
)JSP:表示标签的body中可以加入JSP程序代码
)tagdependent:表示标签中的内容由标签自己去处理
标签属性元素用来定义标签的属性它的常见属性有
Aname:属性名称
Brequired:属性是否必需的默认为false;
Crtexprvalue:属性值是否可以为requesttime表达式也就是类似于< %=…% >的表达式
十六在Web应用中使用标签
如果Web应用中用到了自定义JSP标签则必须在webxml文件中加入元素它用于声明所引用的标签所在的标签库
/sometaglib
/WEBINF/someTLDtld
设定Tag Library的惟一标示符在Web应用中将根据它来引用Tag Libray;
指定和Tag Library对应的TLD文件的位置
在JSP文件中需要加入
prefix表示在JSP网页中引用这个标签库的标签时的前缀uri用来指定Tag Library的标识符它必须和webxml中的属性保持一致