JSP自定义标签
更新时间:2024-04-20 19:01:01 阅读量: 综合文库 文档下载
1、自定义标签的体系结构
自定义标签需要有一个相应的标签处理类,当服务器遇到自定义标签时会调用标签处理类。多个自定义标签组成一个自定义标签库,标签库有一个描述文件,该描述文件对库中的标签进行声明。开发自定义标签其实就是定义标签处理类和编写标签库描述文件的过程。 1.1、什么是自定义标签库
JSP容器遇到
自定义标签在使用中会以下面几种形式出现: (1)简单格式
简单格式不带标签体、不嵌套自定义标签。例如:
自定义标签之间包含标签体,例如:
(3)自定义标签的嵌套使用
嵌套使用标签是指自定义标签中又使用了自定义标签,例如:
自定义标签库由一下成员组成: ???? 标签处理程序
???? 标签库描述文件(TLD) 1、标签处理程序
自定义标签的处理功能是由标签处理程序定义的。因此,自定义标签的开发主要是标签处理程序的开发。标签处理程序的开发有固有的规范,即开发实现特定接口的Java类。运行时,JSP对应的Servlet会建立本页面使用的自定义标签处理类的一个实例。
标签处理类的规范由Tag接口定义。如果要建立带标签体的标签处理类,可以实现BodyTag接口。BodyTag接口是Tag接口的子接口。
Tag接口中,主要定义的是和标签生命周期相关的方法,主要方法有: (1)当容器创建一个新的标签后,通过setPageContext方法来设置标签的页面上下文。
(2)使用setParent方法设置这个标签的上一级标签,如果没有上一级嵌套,设置为null。
(3)设置标签的属性,这个属性在标签库描述文件中定义,如果没有定义属性,就不调用该类方法。
(4)调用doStartTag方法,这个方法可以返回EVAL_BODY_INCLUDE和
SKIP_BODY,当返回EVAL_BODY_INCLUDE时,就计算标签体,如果返回SKIP_BODY时,就不计算标签体。
(5)调用doEndTag方法,这个方法可以返回EVAL_PAGE和SKIP_PAGE,当返回EVAL_PAGE时,容器将在标签结束时继续计算JSP页面的其他部分,如果返回SKIP_PAGE,容器将在标签结束时停止计算JSP页面的其他部分。 (6)调用release方法释放标签处理程序占用的资源。
为了简化开发,JSP规范又定义了一些辅助类。例如:Tag接口对应辅助类为TagSupport类。BodyTag接口对应BodyTagSupport类。 2、标签库描述文件 标签库描述文件(Tag Library Descriptor)包含了自定义标签的描述信息。它把自定义标签和对应的处理程序关联起来。一个标签库对应一个标签库描述文件,一个标签库描述文件可以包含多个自定义标签的声明。
\\
This taglib provides tag example
相应的标签处理类文件: package edu.jsp.tag;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.SimpleTagSupport; import java.util.HashMap; import java.io.IOException;
public class SimpleTag extends SimpleTagSupport {
private int num;
public void doTag() throws JspException, IOException {
for (int i=0; i getJspContext().setAttribute(\getJspBody().invoke(null); } } public void setNum(int num) { this.num = num; //这个用来设置num的值,这个方法将在tld文件中调用this.num = num; } } 1.2、使用自定义标签的好处 使用自定义标签的好处是: (1)加快Web应用开发的速度。 可以有效地使表示逻辑和应用逻辑相分离。 (2)提高代码的可重用性 (3)使JSP程序更加容易维护 然而,实际上相当多的JSP开发人员排斥自定义标签,宁愿在JSP文件插入大量的JSP Scriptlet。这主要是因为学习自定义标签需要时间,开发自定义标签也需要时间,所以为了“节省时间”,他们放弃了自定义标签,结果往往要耗费大量的时间在JSP的调试和维护上。 自定义标签和JavaBean有区别: ???? JavaBean不能操作JSP形式的内容,而自定义标签可以处理JSP形式的标签体。 ???? 自定义标签比JavaBean更能将复杂的操作缩减为十分简洁的形式。 ???? 建立自定义标签比JavaBean困难。 2、自定义标签开发实例 2.1、自定义标签——Date 下面定义一个名为myDate的自定义标签。完成这个自定义标签的步骤如下: (1)定义标签处理类:DisplayDate。 (2)定义标签库描述文件:date.tld。 (3)在web.xml中加入对自定义标签库的声明。 (4)在date.jsp中引用自定义标签myDate。 1、定义标签处理类——DisplayDate package my.date; import java.io.*; import java.util.*; import javax.servlet.jsp.*; import javax.servlet.jsp.tagext.*; public class DisplayDate extends TagSupport { public DisplayDate() { super(); } public int doStartTag() throws JspException { JspWriter out = pageContext.getOut(); try { out.print(new Date()); } catch (IOException ioe) { System.out.println(\} return this.SKIP_BODY; } } 例子中,只覆盖了doStartTag方法,通过pageContext对象获得out对象,通过out对象页面输出日期信息。 TagSupport类定义了get/setParent和setPageContext方法,get/setParent方法允许标签嵌套。另外TagSupport类还定义了一个可以被子类使用的 pageContext实例变量(protexted PageContext pageContext),这个变量由setPageContext方法设置。 2、创建TLD文件——date.tld TLD文件对应于一个自定义标签库,里面有包含库中所有自定义标签的声明。TLD文件对自定义标签处理程序的作用,与Web部署描述符对Servlet的作用类似。TLD文件列出了从标签名到标签处理程序的映射。TLD文件通常保存于Web应用程序的WEB-INF目录下,并且要在web.xml文件中声明。 下面是date.tld文件内容: \\ This taglib provides tag to show date. 我们仔细分析一下这些标签: ???? TLD文件有一个导言。 ???? TLD文件的根元素是 ???? 标签库版本对应于 ???? 标签库所依赖的JSP技术的版本对应于元素 ???? 元素tag将自定义标签映射到它们的自定义标签处理程序,name设定自定义标签的名字,tag-class设定标签处理类,body-context指标签体,这里没有标签体,设为empty。如果有标签体设为JSP。 3、在web.xml中加入对自定义标签库的引用 web.xml文件中内容如下: \\ 首先在JSP中加入声明:<%@ taglib uri=\,声明中的URI要和web.xml中taglib-uri元素一致,prefix定义在本页面使用自定义标签库中标签时的前缀。声明后可以通过<前缀:自定义标签名>格式使用。 date.jsp文件内容如下: <%@ taglib uri=\ For all your office needs
2.2、定义有属性的标签——info JSP允许像下面这样的标签:
其中,attribute1、attribute2为自定义标签的属性。下面定义一个名为info的标签。
1、定义支持属性的标签处理类——infoTagExample
当使用一个名为attribute1的属性时,处理类中称为setAttribute1的方法被调用。当然该类要继承TagSupport类(或实现接口Tag)。 package my.info;
import javax.servlet.jsp.*;
import javax.servlet.jsp.tagext.*; import java.io.Writer;
import java.io.IOException;
public class InfoTagExample extends TagSupport {
String userName;//对应于自定义标签的userName属性 public InfoTagExample() {
super(); } /**
*设置userName属性。这个方法由容器自动调用。 */
public void setUserName(String user) {
this.userName=user; } /**
*覆盖doStartTag方法 */
public int doStartTag() throws JspTagException {
System.out.println(\try {
pageContext.getOut().write(\}
catch (Exception e) {
e.printStackTrace(); }
return SKIP_BODY; } }
如果标签处理类要被别的类访问,那么除setAttributeName方法外,可以再提供一个getAttributeName方法,但setAttributeName方法时必须的。
2、定义TLD文件——info.tld
标签的属性必须在Tag内通过attribute元素的方式进行声明,attribute元素有3个内嵌的位于和之间的元素: ???? 元素name不可缺少且区分大小写。
???? 元素required不可缺少,用来约定该属性是必须的(true),或是可选的(false)。
???? 元素rtexprvalue是可选的,指明该属性能否接受像<% =expression %>的JSP表达式。默认false,因此这个元素通常被忽略,除非允许属性在运行时再决定其值。
文件info.tld如下:
\\
This taglib provides tag example
正在阅读:
JSP自定义标签04-20
当小大人作文500字07-13
关于常宁市油茶产业的调查与思考04-01
物业年终总结一03-08
普通话考试朗读材料:《一分钟》08-29
如何培养幼儿民间体育游戏兴趣07-11
高中情态动词10-06
自信的演讲稿【9篇】03-22
交互设计开题报告 - 图文07-08
《海底两万里》阅读任务清单(学生版)04-27
- 多层物业服务方案
- (审判实务)习惯法与少数民族地区民间纠纷解决问题(孙 潋)
- 人教版新课标六年级下册语文全册教案
- 词语打卡
- photoshop实习报告
- 钢结构设计原理综合测试2
- 2014年期末练习题
- 高中数学中的逆向思维解题方法探讨
- 名师原创 全国通用2014-2015学年高二寒假作业 政治(一)Word版
- 北航《建筑结构检测鉴定与加固》在线作业三
- XX县卫生监督所工程建设项目可行性研究报告
- 小学四年级观察作文经典评语
- 浅谈110KV变电站电气一次设计-程泉焱(1)
- 安全员考试题库
- 国家电网公司变电运维管理规定(试行)
- 义务教育课程标准稿征求意见提纲
- 教学秘书面试技巧
- 钢结构工程施工组织设计
- 水利工程概论论文
- 09届九年级数学第四次模拟试卷
- 定义
- 标签
- JSP
- XX市人民政府关于支持xx农村商业银行及xx地区农信社改革发展的指
- 京西地区地质实习报告 - 图文
- 高等学校辅导员职业能力标准(暂行)2014
- 部编语文二下教材分析及听课笔记
- UV真空电镀面漆配方参考
- 住有所居,政府有责
- 2018师大一中小升初数学真卷(一)
- 河南省PPP项目
- 圆、相似、锐角三角函数测试题(含答案)
- UG考试试题及答案
- 上海市医疗机构药品集中招标采购实施办法
- 防伪税控 操作常识
- 电工基础课后习题
- 22.1.4 - Frictional - behavior - - 摩擦行为
- 孟子 - 全文翻译
- linux实验内容和要求
- 锚杆质量检测
- Altium designer(Protel)中常用库及部分元件名中英文1
- 水库施工组织设计
- 信息处理与仿真实验