`
holoblog
  • 浏览: 1228346 次
博客专栏
E0fcf0b7-6756-3051-9a54-90b4324c9940
SQL Server 20...
浏览量:18937
文章分类
社区版块
存档分类
最新评论

JSP自定义标签(1)

 
阅读更多


一、引入标签


其实在JSP中我们已经使用过了几个标签,比如<jsp:forward>、<jsp:include>等;这些标签都是预先定义好的,如果我们需要自定义标签,就需要学习标签编程。

标签编程的优点就是灵活性+封装性。

灵活性体现在属性的赋值上,可以赋任意值。比如<jsp:forward page="A"> //A处可以赋任意的URL;

封装性体现在内部的行为的封装,因为标签是用一个类实现的,因此类的方法中能够包含任意复杂的动作。

因此标签是为了能够在JSP中使用尽可能少的Scriptlet;

比如:


这个代码非常混乱,但是如果通过标签,从这段代码都封装在一个标签里,则代码就清晰了很多。


接下来是我通过标签封装后的JSP页面效果;


是不是大大缩短了呢??再来看看我在背后干了什么。。。。

TableTagSupport.java


是不是很神奇。。。那接下来就看看实现的过程吧。

注意,在编写标签之前,必须把tomcat\lib中的jsp-api.jar文件配置在CLASSPATH中才可以;


二、基本标签编写


1、TagSupport类


如果要编写一个标签类,则必须继承javax.servlet.jsp.tagext.TagSupport

TagSupport中提供了很多常用方法:

(1)public intdoStartTag()throwsJspException; // 标签开始时调用

能够返回SKIP_BODY(跳过标签体)、EVAL_BODY_INCLUDE(执行标签体)

(2)public intdoEndTag()throws JspException;// 标签结束时调用

能够返回SKIP_PAGE(立刻停止执行)、EVAL_PAGE(JSP正常运行完毕);

(3)intSKIP_BODY;// 跳过标签体

(4)intEVAL_BODY_INCLUDE;//执行标签体

(5)intEVAL_BODY_AGAIN;// 重复执行标签体,主要是因为集合迭代输出,只能在doAfterBody中使用;

(6)public intdoAfterBody()throws JspException;// 执行完一次标签体后调用的函数;

能够返回SKIP_BODY(结束标签体)、EVAL_BODY_AGAIN(重复执行标签体)

(7) JspWriter out = super.pageContext.getOut();//获取向网页输出的输出流;

举例讲述这些函数和常量代表什么意思:


执行流程如下:

(1)doStartTag(); <xiazdong:hello>时调用,如果是EVAL_BODY_INCLUDE,则继续;如果是SKIP_BODY,则执行(4)

(2)执行标签体;

(3)如果实现了doAfterBody,则执行;如果返回SKIP_BODY,则执行(4) ; 如果返回EVAL_BODY_AGAIN,则重复执行doAfterBody;

(4)doEndTag():标签尾调用;


2.制作无属性标签


为了清晰,我们以例子说明。

代码举例1:实现显示Hello world;


1.编写HelloTag.java


注意点:

(1)javax.servlet.jsp.tagext.TagSupport,必须记住;

(2)JspWriter out = super.pageContext.getOut();

(3)public int doStartTag()throws JspException;必须记住;


2.编写xiazdong.tld


tld文件是标签描述文件,是整个标签编程的核心,用来描述自定义的标签的名字、标签的实现类、是否有标签体、描述属性等;

一个tld文件其实类似于一个标签库,里面能够描述很多标签;每个标签都以


的形式描述;

*.tld文件的模版如下:(因为tld文件前面这些内容都不是很重要,因此可以直接复制黏贴)


3.在web.xml中编写映射


编写映射的目的类似于给一个网页配置一个映射地址,为了方便访问;

比如本来需要访问/a/b/c/d/e/f/g/1.tld,这个路径非常麻烦,但是如果通过映射,我们可以只需要用"a"表示一长串的文件路径及名称;



4.编写JSP页面并使用自定义的标签


<%@ taglib prefix="" uri=""%> prefix类似于<jsp:forward>中的jsp,uri中使用前面所说的映射;



3.制作有属性标签


其实制作有属性和制作无属性没有太大区别,


1.需要在原来的HelloTag.java 中加入属性.


如果做形如:<xiazdong:hello id="" format="" />的属性,则需要在HelloTag.java中添加两个属性,id属性和format属性;

形如:


在用户使用标签,并为id和format属性赋值时,会自动调用setter方法,将HelloTag类中的id和format赋值;


2.在tld文件中添加属性描述:


属性描述形如:


代码实例:


HelloTag.java


xiazdong.tld
需要加上attribute的描述:名字、是否必须、是否支持表达式语言


HelloTag.jsp


三、IterationTag和Tag接口的区别


Tag接口只有一些最基本的标签编程方法,而IterationTag接口是用于迭代输出,比如EVAL_BODY_AGAIN等;




分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics