jsp自定义标签

来源:互联网 发布:sql server 2012 64位 编辑:程序博客网 时间:2024/06/08 02:26

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如下:

<%@variablename-given=”sum” variable-class=”java.lang.Integer” scope=”NESTED” declare=”true”description=”the sum of tow integer”%>



应用总结:

总结:

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>



原创粉丝点击