您的位置:首页 > Web前端 > JavaScript

JSP自定义标签

2011-11-08 20:39 239 查看
一、基本概念
1、标签(Tag)
标签是一种XML 元素,通过标签可以使JSP 网页变得简洁并且易于维护,还可以方便地实
现同一个JSP 文件支持多种语言版本。由于标签是XML 元素,所以它的名称和属性都是大
小写敏感的。
2、标签库(Tag library)
由一系列功能相似、逻辑上互相联系的标签构成的集合称为标签库。
3、标签库描述文件(Tag Library Descriptor)
标签库描述文件是一个XML 文件,这个文件提供了标签库中类和JSP 中对标签引用的映射
关系。它是一个配置文件,和web.xml 是类似的。
4、标签处理类(Tag Handle Class)
标签处理类是一个Java 类,这个类继承了TagSupport 或者扩展了SimpleTag 接口,通过这个
类可以实现自定义JSP 标签的具体功能。
二、自定义JSP标签的格式
1、为了使到JSP 容器能够使用标签库中的自定义行为,必须满足以下两个条件:
<% @ taglib prefix=”someprefix” uri=”/sometaglib” %>
1)从一个指定的标签库中识别出代表这种自定义行为的标签;
2)找到实现这些自定义行为的具体类。
第一个必需条件-找出一个自定义行为属于那个标签库-是由标签指令的前缀(Taglib
Directive's Prefix)属性完成,所以在同一个页面中使用相同前缀的元素都属于这个标签库。每
个标签库都定义了一个默认的前缀,用在标签库的文档中或者页面中插入自定义标签。所以,
你可以使用除了诸如jsp,jspx,java,servlet,sun,sunw(它们都是在JSP 白皮书中指定的保留字)之
类的前缀。
uri 属性满足了以上的第二个要求。为每个自定义行为找到对应的类。这个uri 包含了一个字
符串,容器用它来定位TLD 文件。在TLD 文件中可以找到标签库中所有标签处理类的名称。
2、当web 应用程序启动时,容器从WEB-INF 文件夹的目录结构的META-INF 搜索所有以.tld
结尾的文件。也就是说它们会定位所有的TLD 文件。对于每个TLD 文件,容器会先获取标
签库的URI,然后为每个TLD 文件和对应的URI 创建映射关系。
在JSP 页面中,我们仅需通过使用带有URI 属性值的标签库指令来和具体的标签库匹配。
三、自定义JSP标签的处理过程
1、在JSP 中引入标签库
<% @ taglib prefix=”taglibprefix” uri=”tagliburi” %>
2、在JSP 中使用标签库标签
3、Web 容器根据第二个步骤中的prefix,获得第一个步骤中声明的taglib 的uri 属性值
4、Web 容器根据uri 属性在web.xml 找到对应的元素5.从元素中获得对应的元素的值6.
Web 容器根据元素的值从WEB-INF/目录下找到对应的.tld 文件7.从.tld 文件中找到与
tagname 对应的元素8.凑元素中获得对应的元素的值9.Web 容器根据元素的值创建相应
的tag handle class 的实例10. Web 容器调用这个实例的doStartTag/doEndTag 方法完成相应的
处理。
四、创建和使用一个Tag Library的基本步骤
1、创建标签的处理类(Tag Handler Class)
2、创建标签库描述文件(Tag Library Descrptor File)
3、在web.xml 文件中配置元素4.在JSP 文件中引人标签库
五、TagSupport类简介
1、处理标签的类必须扩展javax.servlet.jsp.TagSupport。
2、TagSupport 类的主要属性:
A.parent 属性:代表嵌套了当前标签的上层标签的处理类;
B.pageContex 属性:代表Web 应用中的javax.servlet.jsp.PageContext 对象;
3、JSP 容器在调用doStartTag 或者doEndTag 方法前,会先调用setPageContext 和setParent
方法,设置pageContext 和parent。因此在标签处理类中可以直接访问pageContext 变量;
4、在TagSupport 的构造方法中不能访问pageContext 成员变量,因为此时JSP 容器还没有调
用setPageContext 方法对pageContext 进行初始化。
#p#
六、TagSupport处理标签的方法
1、TagSupport 类提供了两个处理标签的方法:
public int doStartTag() throws JspException
public int doEndTag() throws JspException
2、doStartTag:但JSP 容器遇到自定义标签的起始标志,就会调用doStartTag()方法。
doStartTag()方法返回一个整数值,用来决定程序的后续流程。
A.Tag.SKIP_BODY:表示?>…之间的内容被忽略;
B.Tag.EVAL_BODY_INCLUDE:表示标签之间的内容被正常执行。
3、doEndTag:但JSP 容器遇到自定义标签的结束标志,就会调用doEndTag()方法。doEndTag()
方法也返回一个整数值,用来决定程序后续流程。
A.Tag.SKIP_PAGE:表示立刻停止执行网页,网页上未处理的静态内容和JSP 程序均被忽略
任何已有的输出内容立刻返回到客户的浏览器上。
B.Tag_EVAL_PAGE:表示按照正常的流程继续执行JSP 网页。
七、用户自定义的标签属性
如果在标签中还包含了自定义的属性,那么在标签处理类中应该将这个属性作为成员变量,
并且分别提供设置和读取属性的方法。
八、创建标签处理类的步骤
1、创建包含JSP 网页静态文本的文件(即是要替换自定义JSP 标签的文本);
2、在Web 应用启动时装载静态文本;
3、创建标签处理类。
九、如何创建包含JSP网页静态文本的文件
1、使用java.util.Properties 类来存放要替换网页中自定义JSP 标签的静态文本;
2、Properties 类代表了一系列属性的集合,其实例既可以被保存到流中,也可以从流中加载。
这些文本以key/value 的形式存放在WEB-INF 目录下,例如key=value,在属性列表中这些
key/value 都是String 类型的。
十、Properties类的常用API
1、setProperty(String key, String value):调用Hashtable 类的put 方法添加属性;
2、getProperty(String key):获取属性列表中key 对应的属性值;
3、load(InputStream in):从输入流对象InputStream 中读取属性列表(Properties list);
4、store(OutputStream out,String coMMent):使用适当的格式将属性列表的属性对写入输出流
对象中,默认使用ISO-88590-1编码格式,以行的方式处理输入。属性的key/value 之间以”=、:”
配对,以回车、换行分隔key/value 配对。
十一、ServletContext类的常用API
1、getContext(String uripath):返回服务器中uripath 所代表的ServletContext 对象;
2、getInitParameter(String name):返回ServletConfig 对象中name 参数的值;
3、getMineType(String file):返回file 参数代表的文件的MIME 类型;
4、getRequestDispatcher(String path):返回path 代表的RequestDispacher 对象;
5、getResourceAsStream(String path):以输入流的形式返回path 对应的资源,在输入留中对
象可以为任意形式的数据,path 参数必须以“/”开始且相对于Context Root。
十二、如何使用ServletContxt读取并保存属性文件
1、创建java.util.Properties 类对象;
2、获取ServletContext 对象;
3、将属性文件以输入流的形式读入到某个输入流对象中;
4、将输入流对象加载到Properties 对象中;
5、将Properties 对象保存到ServletContext 对象中。
十三、如何在Web应用启动时装载静态文本
1、创建继承了HttpServlet 类的子类,在web.xml 中配置这Servlet 时设置load-on-startup 属性:
someclass
somepackage.SomeClass1
2、在这个Servlet 的init()方法中创建java.util.Properties 类
3、获取当前Web 应用的ServletContext 对象
4、将WEB-INF 目录下的属性文件读入到输入流InputStream 中:
InputStream in = context.getResourceAsString("WEB-INF/someproperties.properties");
5、将输入流加载到属性对象中
ps.load(in);
6、将属性对象保存到上
context.setAttribute("attributeName",ps);
#p#
十四、如何创建标签处理类
1、引入必需的资源
import javax.servlet.jsp.*;
import javax.servlet.http.*;
import java.util.*;
import java.io.*;
2、继承TagSupport 类并覆盖doStartTag()/doEndTag()方法
3、从ServletContext 对象中获取java.util.Properties 对象
4、从Properties 对象中获取key 对应的属性值
5、对获取的属性进行相应的处理并输出结果
十五、创建标签库描述文件(Tag Library Descriptor)
1、标签库描述文件,简称TLD,采用XML 文件格式,定义了用户的标签库。TLD 文件中的
元素可以分成3类:
A.标签库元素
B.标签元素
C.标签属性元素
2、标签库元素用来设定标签库的相关信息,它的常用属性有:
A.shortname:指定Tag Library 默认的前缀名(prefix);
B.uri:设定Tag Library 的惟一访问表示符。
3、标签元素用来定义一个标签,它的常见属性有:
A.name:设定Tag 的名字;
B.tagclass:设定Tag 的处理类;
C.bodycontent:设定标签的主体(body)内容。
1)empty:表示标签中没有body;
2)JSP:表示标签的body 中可以加入JSP 程序代码;
3)tagdependent:表示标签中的内容由标签自己去处理。
4、标签属性元素用来定义标签的属性,它的常见属性有:
A.name:属性名称;
B.required:属性是否必需的,默认为false;
C.rtexprvalue:属性值是否可以为request-time 表达式,也就是类似于< %=…% >的表达式。
十六、在Web应用中使用标签
1、如果Web 应用中用到了自定义JSP 标签,则必须在web.xml 文件中加入元素,它用于声
明所引用的标签所在的标签库
/sometaglib
/WEB-INF/someTLD.tld
2、设定Tag Library 的惟一标示符,在Web 应用中将根据它来引用Tag Libray;
3、指定和Tag Library 对应的TLD 文件的位置;
4、在JSP 文件中需要加入<% @ taglib% >指令来声明对标签库的引用。例如:
<% @ taglib prefix = “somePrefix” uri = "/someuri" %>
5、prefix 表示在JSP 网页中引用这个标签库的标签时的前缀,uri 用来指定Tag Library 的标
识符,它必须和web.xml 中的属性保持一致。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: