jsp

位置:IT落伍者 >> jsp >> 浏览文章

详细讲解JSP自定义标签


发布日期:2023年11月19日
 
详细讲解JSP自定义标签
基本概念

标签(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中的属性保持一致

上一篇:JSP和BEAN详细剖析

下一篇:JSP中文编码问题解决方法详解