JSP自定义标签.docx

上传人:b****6 文档编号:13072543 上传时间:2023-06-10 格式:DOCX 页数:21 大小:71.67KB
下载 相关 举报
JSP自定义标签.docx_第1页
第1页 / 共21页
JSP自定义标签.docx_第2页
第2页 / 共21页
JSP自定义标签.docx_第3页
第3页 / 共21页
JSP自定义标签.docx_第4页
第4页 / 共21页
JSP自定义标签.docx_第5页
第5页 / 共21页
JSP自定义标签.docx_第6页
第6页 / 共21页
JSP自定义标签.docx_第7页
第7页 / 共21页
JSP自定义标签.docx_第8页
第8页 / 共21页
JSP自定义标签.docx_第9页
第9页 / 共21页
JSP自定义标签.docx_第10页
第10页 / 共21页
JSP自定义标签.docx_第11页
第11页 / 共21页
JSP自定义标签.docx_第12页
第12页 / 共21页
JSP自定义标签.docx_第13页
第13页 / 共21页
JSP自定义标签.docx_第14页
第14页 / 共21页
JSP自定义标签.docx_第15页
第15页 / 共21页
JSP自定义标签.docx_第16页
第16页 / 共21页
JSP自定义标签.docx_第17页
第17页 / 共21页
JSP自定义标签.docx_第18页
第18页 / 共21页
JSP自定义标签.docx_第19页
第19页 / 共21页
JSP自定义标签.docx_第20页
第20页 / 共21页
亲,该文档总共21页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

JSP自定义标签.docx

《JSP自定义标签.docx》由会员分享,可在线阅读,更多相关《JSP自定义标签.docx(21页珍藏版)》请在冰点文库上搜索。

JSP自定义标签.docx

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("

");

sBuffer.append("

");

sBuffer.append("

共100页");

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=""+

"

"+me.width+"px;height:

"+me.height+"px;'>"+

"共"+me.allCount+"条  当前第"+me.currentPageIndex+"页(共"+me.allPageCount+"页)  每页"+me.pageNumber+"条 "+

" "+

" "+

" "+

""+

"

";

me.getData();

addEvent();

}

//数据获取

me.getData=function(){

$.post(

me.actionPath,

{

currentPage:

(me.currentPageIndex-1),

allCount:

me.allCount,

pageNumber:

me.pageNumber

},

function(result){

$("#grid"+me.id+"").html(result);

}

);

}

//翻页控制

functionaddEvent(){

//首页

$("#first"+me.id+"").click(

function(){

if(1==me.currentPageIndex){

returnfalse;

}else{

me.currentPageIndex=1;

$("#current"+me.id+"").html(me.currentPageIndex);

me.getData();

}

}

);

//上一页

$("#p"+me.id+"").click(

function(){

if(1==me.currentPageIndex){

returnfalse;

}else{

me.currentPageIndex=me.currentPageIndex-1;

$("#current"+me.id+"").html(me.currentPageIndex);

me.getData();

}

}

);

//下一页

$("#n"+me.id+"").click(

function(){

if(me.allPageCount==me.currentPageIndex){

returnfalse;

}else{

me.currentPageIndex=me.currentPageIndex+1;

$("#current"+me.id+"").html(me.currentPageIndex);

me.getData();

}

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 法律文书 > 调解书

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2