JSP自定义标签

更新时间:2024-04-20 19:01:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

1、自定义标签的体系结构

自定义标签需要有一个相应的标签处理类,当服务器遇到自定义标签时会调用标签处理类。多个自定义标签组成一个自定义标签库,标签库有一个描述文件,该描述文件对库中的标签进行声明。开发自定义标签其实就是定义标签处理类和编写标签库描述文件的过程。 1.1、什么是自定义标签库

JSP容器遇到标签时会执行页面转发的操作。如果希望在JSP中实现用类似于JSP标签的方式完成特定操作,可以通过自定义标签来完成。 自定义标签库是自定义标签的集合。

自定义标签在使用中会以下面几种形式出现: (1)简单格式

简单格式不带标签体、不嵌套自定义标签。例如:,your为前缀,displayDate为标签名称。这种标签可以带有属性,例如:

,name和type是自定义标签使用的两个属性。 (2)带有标签体

自定义标签之间包含标签体,例如: Hello

(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)包含了自定义标签的描述信息。它把自定义标签和对应的处理程序关联起来。一个标签库对应一个标签库描述文件,一个标签库描述文件可以包含多个自定义标签的声明。

\\

1.2 1.2 mytag

This taglib provides tag example

repeat

edu.jsp.tag.SimpleTag scriptless

num

true

true

相应的标签处理类文件: 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文件内容:

\\

1.2 1.2 date

This taglib provides tag to show date.

displayDate

my.date.DisplayDate empty

我们仔细分析一下这些标签: ???? TLD文件有一个导言。

???? TLD文件的根元素是

???? 标签库版本对应于元素。

???? 标签库所依赖的JSP技术的版本对应于元素。 ???? 本标签库的前缀对应于元素。

???? 元素tag将自定义标签映射到它们的自定义标签处理程序,name设定自定义标签的名字,tag-class设定标签处理类,body-context指标签体,这里没有标签体,设为empty。如果有标签体设为JSP。 3、在web.xml中加入对自定义标签库的引用 web.xml文件中内容如下:

\\

date

/WEB-INF/date.tld

定义的引用URI,在使用自定义标签的JSP文件中使用,指明使用的标签描述文件和相对路径。 4、在JSP中使用自定义标签

首先在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如下:

\\

1.2 1.2 info

This taglib provides tag example

info

my.info.InfoTagExample empty

本文来源:https://www.bwwdw.com/article/i7tp.html

Top