JSP自定义标签在学习中请多多指教
详情可以去下载:http://filemarkets.com/fs/dgm7in5g073266f921/
一、基本概念:
1. 标签:是一种XML元素,通过标签可以使JSP网页变得更加容易维护,还可以方便地实现同一个JSP文件支持多种语言版本,对大小写比较敏感
2. 标签库:由一系列功能相似、逻辑上互相联系的标签构成的集合。
3. 标签库描述文件:是一种XML文件,提供了标签库中类和JSP中对标签引用的映射关系,是一种配置文件,与web.xml类似
4. 标签处理类:是一个Java类,该类继承了TagSupport或者扩展了SimpleTag接口,通过该类可以实现自定义标签的具体功能。
可重用性: 在JSP中使用JSTL、JavaBeans和自定义标记库是类或组件级的重用,可以替换脚本判断来完成相应的功能。
创建自定义标签:
组成:
1. JavaBeans:为得到Java与生俱来的面向对象的好处,可重用的代码应该放到一个独立的代码容器中,这些JavaBeans并不是标签库的一部分,不过它是你的代码库用来执行相关任务的基本代码快。
2. 标签处理:这是标签库的真正核心
3. 标签库的描述(tld文件):这是一个简单的XML文件,它记录着标签处理器的属性、信息、位置,是必须文件。
4. 网站的web.xml文件:这是网站的初始化文件,在这个文件中,定义了网站中用到的自定义标签,以及哪个tld文件用来描述每个自定义的标签。
5. 分发文件(一个WAR或者JAR文件):如果想重用自定义标签的话,需要一个方法来将它由一个项目转移到另一个项目中,将其打包JAR文件
6. JSP页面上的标签库声明:仅需使用标签库标识符即可方便得到声明页面上存在的标签。
JSP所有标签都实现了Javax.servlet.jsp.tagex.JspTag接口,它有两个直接子接口
1. SimpleTag接口
2. Tag接口
使用Tag接口开发自定义标签的3个步骤:
1. 开发标签处理类
2. 编写标签描述,通常是,tld文件
3. 在web.xml中指定标签库的引用
二、标签处理类:
1. 继承了TagSupport类,改写了doStartTag和doEndTag方法。利用JspWriter类型的out对象显示出来,然后返回EVAL_BODY_INCLUDE:表示标签的本体内容能够正确执行,DoEndTag方法在JSP引擎碰到标签的结尾时被调用,返回EVAL_PAGE表示JSP网页可以继续正确执行,返回SKIP_PAGE时,表示不再继续执行
三、标签描述文件:
TLD是一个XML文件,JSP页面识别相应的TLD,利用taglib指令元素在页面中识别出用于标签的名称空间,如:<%@tagliburi=”WEB-INF/tlds/orataglib.tld” prefix=”ora”%>
<ora:redirectpage=”main.jsp”/>
TLD文件中的内容:
1. 最顶部:标准的XML声明和一个DOCTYPE声明(指明了文件文档类型)
2. <taglib>:TLD的主元素,包含描述库的所有特定元素
3. <tlib-version>:必须元素,指定标记库的版本
4. <jsp-version>:指定了库所依赖的JSP规范的版本,默认1.1
5. <shortname>:必须,不能包含空格或其他特殊字符,也不能以数字或下划线开头
6. <uri>:可选,字符规则同上
7. <info>:可选
8. TLD中至少还必须包括一个<tag>元素,它包括了描述自定义行为的各个方面的其他元素:<name>、<tagclass>、<teiclass>、<bodycontent>、<info>、<attribute>
1.<name>:必须,包括了自定义元素对于的名称,唯一
2.<tagclass>:也是必须的。
3.如果行为引入了变量,或者需要进行语法验证,那么就要使用<teiclass>元素。可选,用来制定TagExtraInfo子类的全名。
4.<bodyconten>:可选元素,有三个可能值:empty,JSP或者tagdependent
5.<info>:元素是可选的,用来描述行为的目的
6.tag:必须为行为的每个属性设置<attribute>元素,当然每个元素中也包含了描述属性的另外一些元素:<name>、<required>、<rtexprvalue>。name属性为行为属性的名字,required为true表示使用标签时要指定它的值,否则可以指定也可不
四、使用自定义标签:
使用步骤:
1. 使用taglib指令,在JSP中引入标签库:
<%@taglibprefix=”taglibprefix” uri=”tagliburi”%>
2. 在JSP中使用标签库标签
3. Web容器根据prefix,获得taglib的uri属性值
4. Web容器根据uri属性在web.xml找到对于的元素;
5. 从元素中获得对应的元素的值
6. Web容器根据元素的值从WEN-INF/目录下找到对于的.tld文件
7. 从.tld文件中找到与tagname对应的元素
8. 从标签中获得对应的元素的值
9. Web容器根据元素的值创建相应的taghandle class的实例
10. Web容器调用这个是咧的doStartTag/doEndTag方法完成相应的处理
五、JavaBean与自定义标签:
在JSP开发中会遇到一些重复的工作,而使用自定义标签库市一中方法,可以将其封装起来在多个项目中重新用到它,此外,应用逻辑还可以包含在基于服务器的资源中,比如JavaBeans。JavaBeans在用于商务逻辑被重用的设计中更为明显
区别:自定义标签可以与JSP页面通信,JavaBean不行,它只是一中数据模型,标签可以显示数据,JavaBean是被动的,等待JSP来调用,自定义标签可以操作JSP,是JSP的一部分
六、标签文件
1. 内容重用
下面是一个简单的例子来说明标签文件实现内容重用:
(1)、构造一个页脚标签文件,保存为bottom,tag,代码如下:
<%@tag pageEncoding=”gb2312”%>
<center>
<hr width=”300” size=”1”>
<h2>联系人:张小姐</h2>
<h2>email:****@163.com</h2>
</center>
与通常的HTML不同多了一个<%@tag pageEnconding=”gb2312”%>指令,该指令只适用于标签文件中
(2)、配置标签文件
要在JSP页面中使用标签文件,只需将它放置在\WEB-INF\tags目录下即可
(3)、使用标签文件
在JSP页面中使用标签文件仍然要用taglib指令:
<%@taglib prefix=”mytagfile” tagdir=”/WEB-INF/tags”%>
与使用自定义标签不同的是,该命令使用了tagdir属性,该属性用来指明标签文件所在的位置,如:
<%@taglib prefix=”mytagfile” tagdir=”/WEB-INF/tags”%>
<mytagfile:bottom/>
2. 自定义模版
在Web应用中,页面经常会用到同样外观的内容块,编号的只是其中的内容。一种简单的实现方式是编写第一个块的JSP或HTML代码,然后通过复制来复用,这种方式比较适合静态页面,对于动态网页,我们可以用JSP文件模版或者标签文件模版
JSP文件模版:
如模版文件content.jsp
<center>
<table width=”300”bordercolor=”${param.color}” border=”1” cellpadding=”4”
cellspacing=”0”>
<trbgcolor=”${param.color}”>
<td class=”boxHeader”>
${param.title}
</td>
</tr>
<tr><td valign=”top”vlass=”boxText”>
${param.author}<br>
${param.publisher}<br>
${param.pubDate}<br>
${param.body}<br>
</td></tr></table>
</center>
利用上面的模版编写contentinclude.jsp:
<jsp:includepage=”content.jsp”>
<jsp:param name=”title” value=”精通JSP编程”/>
<jsp:param name=”author”value=”赵强”/>
<jsp:param name=”publisher”value=”电子工业出版社”/>
<jsp:param name=”pubDate”value=”2006.3”/>
<jsp:param name=”body” value=”从实际项目实施的角度”/>
</jsp:include >
标签文件模版:
标签文件模版content.jsp
<%@taglib tagdir=”WEB-INF/tags”prefix=”templagetag”%>
<%@attribute name=”color”required=”true” rtexprvalue=”false”%>
<%@attribute name=”title”required=”true” rtexprvalue=”false”%>
<%@attribute name=”author”required=”true” rtexprvalue=”false”%>
<%@attribute name=”publisher”required=”true” rtexprvalue=”false”%>
<%@attribute name=”pubDate”required=”true” rtexprvalue=”false”%>
<center>
<table width=”300”bordercolor=”${param.color}” border=”1” cellpadding=”4”
cellspacing=”0”>
<trbgcolor=”${color}”>
<tr class=”boxHeader”>
${title}
</td>
<tr><td valign=”top”vlass=”boxText”>
${author}<br>
${publisher}<br>
${pubDate}<br>
<jsp:doBody><br>
</td>
</tr>
</table>
</center>
使用标签文件模版的JSP 页面contentinclude.jsp
<templateag:content>
<jsp:attribute name=”color”>#00c0c0</jsp:attribute>
<jsp:attribute name=”title”>精通JSP编程</jsp:attribute>
<jsp:attribute name=”author”>赵强</jsp:attribute>
<jsp:attribute name=”publisher”>电子工业出版社</jsp:attribute>
<jsp:attribute name=”pubDate”>2006.3</jsp:attribute>
</jsp:body>
</templatetag:content>
以上使用了嵌入在标签中的<jsp:attribute>标签来传递属性值,还有另外一种更简单的方式传递属性值,即直接在使用标签文件模版时传递属性值,类似于自定义标签的使用:contentinclude.jsp代码:
<%@taglib tagdir=”WEB-INF”/tagsprefix=”templagetag”%>
<templatetag:content>
color=”#00c0c0”
title=”精通JSP编程”
author=”赵强”
publisher=”电子工业出版社”
pubDate=”2006.3”
从实际项目中的角度
</templatetag:content>
标签文件模版与JSP文件模版的区别:
1. 属性定义方式:JSP模版使用请求参数的方式,标签文件模版使用attribute指令来定义参数
2. 属性的使用方式:JSP模版中使用请求参数的表达式,如${param.color};而标记文件模版中使用EL表达式,如${color}
3. 内容定义:JSP模版中需要定义显示的内容,如${param.body};而标签文件模版使用<jsp:doBody>,由JSP容器来将标签的本体内容显示到页面中。<jsp:doBody>标签也是只用于标签文件中
标签文件中的变量:
标签文件除了上述表示内容和模版外,还可以有自己的处理逻辑,并可以使用变量,像所有的标签处理一样,标签文件也能通过变量与调用者进行通信,这些变量用variable指令实现:
<%@variable
name-given=”output-name”|(name-from-attribute=”attr-name”alias=”local-name”)
[variable-class=”output-type”]
[scope=”AT_BEGIN|AT_END|NESTED”]
[declare=”true|false”]
[description=”description”]%>
属性描述:
1. name-given:定义一个变量,该变量可以在调用该标记的页面中使用;也可以用name-from-attribute来定义一个变量,指定的名字是一个属性名;alias定义保存变量值的局部有效的属性名
2. variable-class:变量对应的类名,默认为java.lang.String
3. declare:指明调用该标记后,变量名是否已经在调用页面中声明,默认为True,
4. scope:变量的有效范围,可以为AT_BEGIN|AT_END|NESTED,默认为nested
5. Description:变量描述
在标签中定义变量sum,类型为Integer,范围NESTED如下:
应用总结:
总结:
jsp页面通过导入<%@ taglib uri=”/myDateTag” prefix=”pp”%>的uri属性值找到对应web中的<taglib-uri>之间的名字,确定其<taglib-location>中的tld文件,再通过tld文件中对应的<name>之间的名字,找到处理类的路径。
在jsp页面调用时利用:prefix的属性值调用对应tld文件的<name>属性所对应的类如:
jsp页面:<%@ taglib uri="/myDateTag" prefix="pp" %>把<pp:DateTag/>放在要调用的页面地方。
Web中:
<taglib>
<taglib-uri>/myDateTag</taglib-uri>
<taglib-location>/WEB-INF/myDateTag.tld</taglib-location>
</taglib>
myDateTag.tld文件:
<tag>
<name>DateTag</name>
<tag-class>qhit.com.cn.simpleTag.DateTag</tag-class>
<body-content>jsp</body-content>
</tag>