·您的位置: 首页 » 资源教程 » 编程开发 » JAVA、JSP » JSP中的TAGLIB应用

JSP中的TAGLIB应用

类别: JSP教程  评论数:0 总得分:0
1、前言:

写程序很重要的几点是要让我们的CODE可以复用, 可以扩展和具有灵活性.

jsp基于面向对象的JAVA技术, 我们可以通过运用DESIGN PATTERNS使之具备这些特性.

而jsp和xml的紧密结合使得我们在编码时又多了一种选择,写出精良的code已不是遥远的童话.

这里将讲述编程时使用我们自定义的或应用其他已定义好的 tag.以及对TagLib进行部署.

要应用TAG,

-------------建立tld文件.

TLD(TLD:Tag Library Descriptor标签库描述符)文件,标准的XML格式的标记定义文件.

定义tag和他的各种属性和处理文件等等.

-------------Tag Handler( TAG处理器.)

实际上就是个JAVA类文件,用来处理tag. 需要在tld文件里的每个tag标记

中指明是应用哪一个类文件来对这个TAG进行处理.

-------------在JSP使用tag

可以通过jsp指令来使用

在建立TAGLIB,编写TAG处理文件的时候, 可能会显得有点复杂. 但当我们需要重复使用或添加功能的

时候, 就会发现我们做了多么伟大的事情! ^_- (呵呵 , 有点夸张)

2、开始

现在让我们逐步深入的了解xml在jsp中的应用吧.

首先需要定义tld文件和相应tag处理的java类文件.然后在jsp通过定义的语法使用tag,

让我们来看看下面这个XML文件。

==================taglib.tld===========================

PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.1//EN"

"http://java.sun.com/j2ee/dtds/web-jsptaglibrary_1_1.dtd">

1.0

1.1

Java Pet Store Demo custom tags

insert

com.sun.estore.taglib.InsertTag

JSP

An insertion tag

id

false

true

template

true

true

parameter

true

true

CreateTemplate

com.sun.estore.taglib.CreateTemplateTag

JSP

Create a template object and store in the request with the specified name

id

false

true

template

true

true

screen

true

true

Screen

com.sun.estore.taglib.TemplateScreenTag

JSP

A template screen object

screen

true

true

Parameter

com.sun.estore.taglib.TemplateParameterTag

JSP

A template parameter object

parameter

true

true

value

true

true

direct

true

true
===========================================================

这是J2EE Blueprints 里提供的sample------Pet Store里面的一个TLD文件。

下面对TLD文件进行说明

TagLib Descriptor

自定义tag位置

WEB-INF/tlds/xxxx.tld

注意:需要在tld文件里定义:

tlibversion--------Tag library的版本

jspversion--------这个Tag library要求的JSP版本。

shortname-------缺省的名字。(这个例子里没有定义)

uri-------------------这个Tag library的URL

info-----------------Tag library的使用信息

tag-----------------自定义的tag

name--------------- 自定义的tag的名字

tagclass----------- 处理这个tag的java类的名字.不同的tag可能对应不同的java类来处理。

Teiclass----------

bodycontent----- 标出属性值的类型,如果没有标识,隐含为JSP

JSP -------------------interpreted by page

EMPTY ------ -----------no body allowed

TAGDEPENDENT-----interpreted by tag

需要BodyTag

BodyTag can post-process JSP

info------------------ 这个tag的使用信息

attribute----------- 属性。 每个tag可以有n个属性

在这个例子里,定义了四个tag。

下一页详细说明一下attribute.
自定义tag位置

详细说明一下attribute.

指出了tag所包含的属性名字

true 表示这个属性是必须的



false 表示这个属性不是必须的

隐含为false

true表示这个属性的值可以用jsp程序段的结果输出。



false表示这个属性的值不可以用jsp程序段的结果输出。

隐含为false

------------------------------------------------------------

以insert tag为例, 定义了一个名字叫insert的tag, 他的处理文件是com.sun.estore.taglib.InsertTag

属性值的类型是JSP, 接下来是定义了三个属性.在jsp页面里引用。

现在你应该能明白这个tld文件所表示的大概含义. 我们按照这种格式来写自己的tld文件.

应该没有什么问题了. 如果还是不懂的话, 看看关于XML方面的书籍会有好处.

在jsp文件里使用tld文件,是使用指令

借用飞刀同志在jsp语法里面的讲解。

自定义tag位置

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Taglib 指令

定义一个标签库以及其自定义标签的前缀.

JSP 语法

例子

.

.


描述

指令声明此JSP文件使用了自定义的标签,同时引用标签库,

也指定了他们的标签的前缀。

这里自定义的标签含有标签和元素之分。因为JSP文件能够转化为XML,

所以了解标签和元素之间的联系很重要。标签只不过是一个在意义上被抬

高了点的标记,是JSP元素的一部分。JSP元素是JSP语法的一部分,和XML

一样有开始标记和结束标记。元素也可以包含其它的文本,标记,元素。

比如,一个jsp:plugin元素有开始标记和结束标记,同样

也可以有和元素.

你必须在使用自定义标签之前使用指令,而且你可以在一个页面中多次使用,但是前缀只能使用一次属性

自定义tag位置

uri="URIToTagLibrary"

Uniform Resource Identifier (URI)根据标签的前缀对自定义的标签进行唯一的命名,URI可以是以下的内容:

? Uniform Resource Locator (URL), 由 RFC 2396 定义,

查看 http://www.hut.fi/u/jkorpela/rfc/2396/full.html

  Uniform Resource Name (URN), 由 RFC 2396定义

  ? 一个相对或绝对的路径

prefix="tagPrefix"

在自定义标签之前的前缀,比如,在中的public,如果这里不写public,

那么这就是不合法的。请不要用jsp, jspx, java, javax, servlet, sun, 和sunw做为你的前缀

=======================template.jsp====================

要使用此例子,请到aspcn.com

===============================================

这里定义了一个jsp文件。 这个文件是由前面例子定义的tag组成的.

jsp引擎通过对tag的处理,jsp程序段的运行结果和一些html标签组合,

将一个完整的html结果 返回到browser端.

这里有意思的是根据参数的不同,这个文件可以返回不同的内容。这就是通常所说的模板文件.

可惜本文不谈这些,只是介绍 在jsp文件中使用tag. 有兴趣的可以自己研究。
下面到了关键部分乐。 对tag进行处理。其实很多情况下我们是使用已经提供的taglib.

别人/公司已经做好了tag和处理部分,打好了包 我们需要做的只是在我们的jsp中去应用.

但是当我们自己做个taglib时, 就需要编写这部分tag handler了.

这里只针对上面文件里提到的insert tag,其他的为了避免重复,就不一一说明了

==================== InsertTag.java==============================

/*

* $Id: InsertTag.java,v 1.13 2000/03/04 02:54:57 brydon Exp $

* Copyright 1999 Sun Microsystems, Inc. All rights reserved.

* Copyright 1999 Sun Microsystems, Inc. Tous droits réservés.

*/

package com.sun.estore.taglib;

import javax.servlet.jsp.JspTagException;

import javax.servlet.jsp.tagext.TagSupport;

import com.sun.estore.util.Debug;

/**

* This class is an easy interface to the JSP template or other

* text that needs to be inserted.

* @author Greg Murray

*/

public class InsertTag extends TagSupport {

private boolean directInclude = false;

private String parameter = null;

private String templateName = null;

private Template template = null;

private TemplateParameter templateParam = null;

/**

* default constructor

*/

public InsertTag() {

super();

}

public void setTemplate(String templateName){

this.templateName = templateName;

}

public void setParameter(String parameter){

this.parameter = parameter;

}

public int doStartTag() {

try{

if (templateName != null){

template = (Template)pageContext.getRequest().getAttribute("template");

}

} catch (NullPointerException e){

Debug.println("Error extracting template from session: " + e);

}

if (parameter != null && template != null) templateParam = (TemplateParameter)template.getParam(parameter);

if (templateParam != null) directInclude = templateParam.isDirect();

return SKIP_BODY;

}

public int doEndTag() throws JspTagException {

try{

pageContext.getOut().flush();

} catch (Exception e){

// do nothing

}

try {

if (directInclude && templateParam != null) {

pageContext.getOut().println(templateParam.getValue());

} else if (templateParam != null) {

if (templateParam.getValue() != null) pageContext.getRequest().getRequestDispatcher(templateParam.getValue()).include(pageContext.getRequest(), pageContext.getResponse());

}

} catch (Throwable ex) {

ex.printStackTrace();

}

return EVAL_PAGE;

}

}

可以看到。InsertTag.java继承了javax.servlet.jsp.tagext.TagSupport类. 因为在TagSupport中定义了一些接口.

  我们在处理自定义的tag时, 对父类的doStartTag() 和doEndTag() 要进行重载,如果在tld文件中定义了tag的属性, 就需要在tag handler里对每个属性定义相应的setxxx/getxxx方法.

在doStartTag()中是从Template类所定义的Hashtable中取得TemplateParameter对象.

在doEndTag()中

pageContext.getRequest().getRequestDispatcher(templateParam.getValue()).include(pageContext.getRequest(), pageContext.getResponse());

这是在页面里包含通过jsp页的上下文返回通过tag的属性值指定的资源对象(RequestDispatcher)所产生的内容..

doStartTag()和doEndTag()返回值是在Tag Interface里定义的静态int

SKIP_BODY隐含0

Skip body evaluation. Valid return value for doStartTag and doAfterBody. 跳过对body的处理。

就是跳过了开始和结束标签之间的代码。

EVAL_BODY_INCLUDE 隐含1

Evaluate body into existing out stream. Valid return value for doStartTag.

This is an illegal return value for doStartTag when the class implements BodyTag,

since BodyTag implies the creation of a new BodyContent.

将body的内容输出到存在的输出流中。包括是jsp代码,也可以被输出

SKIP_PAGE 隐含5

Skip the rest of the page. Valid return value for doEndTag.

忽略剩下的页面。

EVAL_PAGE 隐含6

Continue evaluating the page. Valid return value for doEndTag().

继续执行下面的页

在这个类里还有对其他类的引用,我就不列出来了. 各位可以自己去研究.

自定义标签(Custom tags)实现了 javax.servlet.jsp.tagext.Tag or javax.servlet.jsp.tagext.BodyTag

interface. 应用javax.servlet.jsp.JspWriter 来输出.

TagSupport class 提供了对interface Tag的隐含实现. 序列化编发数据.

public class TagSupport extends java.lang.Object implements Tag, java.io.Serializable

BodyTagSupport class提供了对interface BodyTag的隐含实现.继承TagSupport

public class BodyTagSupport extendsTagSupport implements BodyTag

我们在编写tag handler时需要继承TagSupport类或BodyTagSupport类,然后重载doStartTag()和doEndTag().

还可以再进一步分离.将具体实现放到bean里

这些自定义标签的类所应放的位置应该在WEB-INF/classes或WEB-INF/lib

最后将custom tag libraries 打包成.war文件.关于.war文件,如下图所示给出了资源结构图。



通过部署描述符来控制映射。

部署描述符是个XML文件。详细的请详见有关文档资料。这里只说明

部署TagLib的部分。

JSP custom tag libraries (optional)

Specifies URL for locating Tag Library Descriptor



uri

path



/**************自定义TagLib例子: JSP page *******************

………

*******************************************************/

文件位置如下:



这个例子很简单, 只是作为练习使用.你也可以自己进行扩展,多练习几种处理方法.比方说标签带有属性,

标签带有内容, 使用bean处理逻辑等等

关于将这些文件打包成.war文件.这里就不详细说明了.请根据你使用的application server情况自己完成吧.
-= 资 源 教 程 =-
文 章 搜 索
关键词:
类型:
范围:
纯粹空间 softpure.com
Copyright © 2006-2008 暖阳制作 版权所有
QQ: 15242663 (拒绝闲聊)  Email: faisun@sina.com
 纯粹空间 - 韩国酷站|酷站欣赏|教程大全|资源下载|免费博客|美女壁纸|设计素材|技术论坛   Valid XHTML 1.0 Transitional
百度搜索 谷歌搜索 Alexa搜索 | 粤ICP备19116064号-1