JSP自定义标签.docx
《JSP自定义标签.docx》由会员分享,可在线阅读,更多相关《JSP自定义标签.docx(21页珍藏版)》请在冰点文库上搜索。
JSP自定义标签
JSP自定义标签(CustomTag)
V1.0
JSP自定义标签简介
基本概念
JSP的自定义标签是用户自定义的JSP元素。
自定义标签与JavaBean类似,都封装了Java的代码。
当JSP转换为Servlet并执行时,WEB容器便会调用这些操作。
自定义标签的功能
1、取代了JSP页面的JAVA代码。
2、自定义标签是可重用的组件。
3、可通过从调用页面所传递的属性参数进行定制。
编写和调用JSP自定义标签的基本流程
一个自定义标签的编写和调用包括三个流程:
1、编写后台JAVA处理程序。
2、编写标签库描述文件(TagLibraryDescriptor)。
3、在XML文件中进行自定义标签配置。
4、在JSP页面引用标签。
JSP自定义标签解析过程
在JSP中使用标签库中的标签,都需要按照以下的方式引入标签库:
<%@taglibprefix="custom"uri="/customTag"%>
当在JSP中使用了标签库中的标签,JSP页面加载时,WEB容器根据所使用标签名称前缀获取JSP页面声明taglib中的uri属性值。
然后根据所获取的uri的值在web.xml文件中查找相对应的元素,对获取对应的标签库描述文件(WEB-INF文件夹下的.tld文件)。
根据JSP页面使用的标签的后缀从tld文件中获取相对应的属性,调用JAVA文件,创建TAG的Handler实例。
最后WEB容器调用这个实例doStartTag/doEndTag方法完成标签的处理。
JSP自定义标签创建和使用
自定义标签功能的实现要求在后台必须有一个相关的JAVA类的支持,但并不是任意编写一个JAVA类就能处理JSP标签,这个类也必须实现指定的规范才能用于支持JSP标签,这些规范表现形式也是接口和类,主要接口/类的描述如下:
javax.servlet.jsp.tagext.Tag接口,所有处理JSP标签的类必须实现该接口。
该接口中声明了6个方法,如果直接从该接口生成类则必须实现所有的6个方法,通常不会直接通过该接口生成标签的处理类。
javax.servlet.jsp.tagext.TagSupport类,该类实现了Tag接口,用于创建不带标记体的自结束标签,这些标签中可以带属性。
javax.servlet.jsp.tagext.BodyTagSupport类,该类继承了TagSupport,用于创建带标记体的标签。
通常我们自定义的标签,编写处理程序时使用TagSupport和BodyTagSupport即可,不需要涉及到标签体的,继承TagSupport,需要用标签体的,用BodyTagSuppor。
以下是开发和使用一个JSP自定义标签的全过程:
1、开发标记处理类,该类要继承TagSupport或BodyTagSupport。
2、创建标记库描述符文件*.tld,在该文件中为标记处理类指定标签名、声明标签属性。
3、在XML文件中配置自定义标签。
4、在JSP中引用标签库。
5、在JSP中使用标JSP标签。
标签库描述文件(TagLibraryDescriptor)
标签库描述文件是一个XML文件,这个文件提供了标签库中类和JSP中对标签引用的映射关系。
它是一个配置文件,和web.xml是类似的。
*.tld文件必须放在WEB-INF文件下。
TLD文件中各元素含义
:
代表开始一个标记库的描述
:
代表标记库的版本
:
代表标记所支持的JSP的版本
:
为标记库起别名,相当于注释,无实际用途
:
代表开始描述一个标记,其下子元素如下:
:
为标记处理类起的标记名
:
指定标记处理类的全名(即带包的名字)
:
标记体的类型,该示例中不需要标记体,所有设置为EMPTY,该值的其他取值在后续内容中讲解
:
用于为标签声明属性,其子元素如下:
:
用于指定属性名称
:
用于声明该属性是否为必需的,本例中声明color、loop两个属性都不是必需的。
TLD文件编写示例
xmlversion="1.0"encoding="UTF-8"?
>
1.0
2.0
CustomTags
自定义标签
PageGrid
com.taglib.pagegrid.PageGrid
JSP
分页Grid
id
true
true
唯一标志
width
false
true
宽度
height
false
true
高度
sql
true
true
查询SQL
columnConfig
true
true
列名配置("ID,序号,20,false#NAME,姓名,150,true",列配置字符串格式(数据库列名,表列明,显示宽度,是否显示))
TagSupport类
本文档主要是通过继承TagSupport类来创建不带标记体的自定义标签。
TagSupport类的主要属性
1、parent:
表示嵌套了当前标签的上层标签处理类。
2、pageContext:
表示WEB应用中的pageContext对象。
该成员的功能与JSP的内置对象pageContex完全相同。
通过该对象可以得到其他的JSP对象的引用。
如:
JspWriterout=pageContext.getOut();这一语句可以得到JSP内置对象out的引用,通过out我们就可以向客户端浏览器中输出内容了。
要使用其他几个JSP对象原理与此相同。
使用TagSupport注意点
1、JSP容器在调用doStartTag和doEndTag方法之前,会先调用setPageContext()和setParent()方法,设置pageContext和parent属性。
因此在标签处理类中可以直接访问pageContext变量。
2、在TagSupport的构造方法中不能访问pageContext成员变量,因为此时JSP容器还没有调用setPageContext()方法对pageContext进行初始化。
TagSupport处理JSP自定义标签的方法
TagSupport类提供了两个处理处理自定义标签的方法:
publicintdoStartTag()throwsJspException
publicintdoEndTag()throwsJspException
doStartTag
在JSP容器遇到自定义标签的起始标志,就会调用doStartTag()方法。
doStartTag()方法返回一个整数值,用来决定程序的后续流程:
1、EVAL_BODY_INCLUDE:
包含标记体,本例中要编写自结束标记所以不使用该值。
2、SKIP_BODY——跳过标记体,即不处理标记体,开发自结束标记应该使用该值。
doEndTag
在JSP容器遇到自定义标签的结束标志,就会调用doEndTag()方法。
doEndTag()方法也返回一个整数值,用来决定程序的后续流程:
1、SKIP_PAGE:
返回这个值,则终止页面执行。
2、EVAL_PAGE:
返回该值则处理完当前标记后,JSP页面中止运行。
实例
在以下的实例中,主要是使用两种方式实现自定义标签:
1、使用上面所提到的,继承TagSupport类;
2、通过使用编写*.tag文件实现(JavaScript)。
个人认为第二种方式优于第一种方式,更为实用。
TagSupport方式实现
本例中利用自定义标签达到分页组件的效果。
1、编写后台JAVA处理类
packagecom.taglib.pagegrid;
importjavax.servlet.jsp.JspTagException;
importjavax.servlet.jsp.tagext.TagSupport;
publicclassPageGridextendsTagSupport{
privatestaticfinallongserialVersionUID=1L;
privateStringsql="";
privateStringcolumnConfig="";
privateStringid="";
/**
*无参构造
*/
publicPageGrid(){
}
publicStringgetSql(){
returnsql;
}
publicStringgetColumnConfig(){
returncolumnConfig;
}
publicStringgetId(){
returnid;
}
publicvoidsetSql(Stringsql){
this.sql=sql;
}
publicvoidsetColumnConfig(StringcolumnConfig){
this.columnConfig=columnConfig;
}
publicvoidsetId(Stringid){
this.id=id;
}
publicintdoStartTag()throwsJspTagException{
returnEVAL_BODY_INCLUDE;
}
publicintdoEndTag()throwsJspTagException{
try{
//pageContext.getOut().write(getHTMLInnerText());
pageContext.getOut().print(getHTMLInnerText());
}catch(Exceptione){
thrownewJspTagException("TAGEXCEPTION!
");
}
returnEVAL_PAGE;
}
//输出HTML格式
publicStringgetHTMLInnerText(){
StringBuffersBuffer=newStringBuffer();
sBuffer.append("
");sBuffer.append("
");sBuffer.append("
"); sBuffer.append(" | ");sBuffer.append("
"); sBuffer.append(" | ");sBuffer.append("
"); sBuffer.append(" | ");sBuffer.append("
"); sBuffer.append(" | ");sBuffer.append("
共100页"); sBuffer.append(" | ");sBuffer.append("
");sBuffer.append("
");
returnsBuffer.toString();
}
}
2、编写.tld文件(该文件必须放在WEB-INF目录下)
xmlversion="1.0"encoding="UTF-8"?
>
1.0
2.0
CustomTags
自定义标签
PageGrid
com.taglib.pagegrid.PageGrid
JSP
分页Grid
id
true
true
唯一标志
width
false
true
宽度
height
false
true
高度
sql
true
true
查询SQL
3、在web.xml文件中添加该标签库
--自定义标签-->
/customTag
/WEB-INF/CustomTag.tld
4、在页面上引入该标签库
<%@taglibprefix="custom"uri="/customTag"%>
5、在页面中使用该标签
PageGridsql="select*fromdual"id="">
PageGrid>
启动服务,在浏览器中输入http:
//localhost:
8080/rpc/tagTest.jsp,可以看到如下的显示结果:
以上的是使用TagSupport完成的简单的示例,在实际中,只需要在其中添加需要的属性,和相关的逻辑处理,便可以达到分页的效果。
下面这种结合JQuery实现的分页表格,可以完成无刷新分页,在实际中较上一种更为实用。
TAG文件+JQuery实现
这种方式的基本思路是在JavaScript文件中完成翻页的逻辑处理,将参数传递到服务端完成数据的获取,并将数据转换为HTML文本返回。
1、新建一个WEB项目,并在WebRoot目录下创建一个scripts文件夹,在该文件夹下创建名为CustomPage的JS文件和引入所需的jQuery文件
。
在CustomPage.js中添加如下代码:
//数据分页
CustomPage=function(p_container){
varme=this;
me.id="";
me.width="";
me.height="";
me.style="";
me.className="";
me.allCount=0;
me.currentPageIndex=1;
me.allPageCount=0;
me.pageNumber=0;
me.actionPath="";
me.init=function(){
//计算总页数
if((me.allCount%me.pageNumber)==0){
me.allPageCount=me.allCount/me.pageNumber;
}else{
me.allPageCount=parseInt(me.allCount/me.pageNumber)+1;
}
p_container.innerHTML=""+
"