首页 服务器 编程 必备知识 搜索引擎 圩日手册
站内搜索
最近浏览
推荐文章
热文排行

[JSP]JSP自定义标签学习心得


JSP标签从1.0 开始就已经出现啦,现在JSP都2.0了出现了两个版本,所以我们在用的时候第一是Jar包要注意版本,还有一个要注意版本的地方就是web.xml和.Tld这两个XML文件。
我最开始的时候摸不到头绪,两个配置文件的版本不一致结果导致页面报错找不到标签,还发了个帖子询问,但是大家都误以为是配置的错误,还郁闷了好几天后来再发现这个原因。
1. 配置文件的头信息
Web.Xml 2.0
<web-app xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="2.4" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee   http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
 

Test.tld 2.0

<taglib xmlns="http://java.sun.com/xml/ns/j2ee"
    xmlns:xsi
="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation
="http://java.sun.com/xml/ns/j2ee web-jsptaglibrary_2_0.xsd"
    version
="2.0">
    
<description>SimpleTag</description>
    
<tlib-version>1.0</tlib-version>

 

 

WebXml 1.x

 

<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd">
<web-app>

 

Test.tld 1.x

 

<!DOCTYPE taglib PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.1//EN" "http://java.sun.com/j2ee/dtds/web-jsptaglibrary_1_1.dtd">
<taglib>
<tlibversion>1.0</tlibversion>
<jspversion>1.1</jspversion>
<shortname>html</shortname>
<uri>http://jakarta.apache.org/struts/tags-html</uri>

 

头信息的版本匹配很重要,本文就在此举例头信息,以下的XML文件格式大家要注意匹配版本

 

(以下的例子都是1X版本)

 

2如何配置标签

 

配置标签是写标签中最有挑战性的事情,下面说说应该如何配置。

首先要配置web.xml

 

<taglib>
    
<taglib-uri>/aaa</taglib-uri>
    
<taglib-location>/WEB-INF/test.tld</taglib-location>
  
</taglib>

 

然后是test.tld

 

<taglib>
     
<tlibversion>1.0</tlibversion>
  
<jspversion>1.1</jspversion>
  
<shortname>Application Tag Library</shortname>
  
<uri>/mytag</uri>
  
<info>学习标签</info>

    
<tag>
    
<name>hello</name>
    
<tagclass>com.TestTld</tagclass>
    
<bodycontent>empty</bodycontent>
    
<info>向菜头学习</info>
   
<attribute>
        
<name>begin</name>
        
<required>true</required>
    
</attribute>
        
<attribute>
        
<name>end</name>
        
<required>true</required>
    
</attribute>
   
  
</tag>
</taglib>

 

TLD的根是taglib元素。表16-2中列出了taglib的子元素:

16-2 taglib子子元素 

元素

说明

tlib-version

标签库的版本

jsp-version

这个标签库要求的JSP规范版本

short-name

JSP页面编写工具可以用来创建助记名的可选名字

uri

唯一标识该标签库的的URI

display-name

将由工具显示的可选名

small-icon

将由工具使用的可选小图标

large-icon

可被工具使用的可选大图标

description

可选的标签特定信息

listener

listener元素

tag

tag元素

 

tag元素中的TLD中指定标签。在表16-3中出了tag的子元素:

16-3 标签子元素

元素

说明

name

唯一标签名

tag-class

标签handler类的完全限定名

tei-class

javax.servlet.jsp.tagext.TagExtraInfo的可选子类。见提供有关脚本变量的信息

body-content

正文内容类型。见body-conten元素body-content元素

display-name

由工具显示的可选名

small-icon

可以由工具使用的小图标

large-icon

可以由工具使用的大图标

description

可选的标签特定的信息

variable

可选的脚本变量信息。见提供有关脚本变量的信息

attribute

标签属性信息。见Attribute 元素

下面几节描述开发在标签类型中介绍的每一种类型的标签所需要的方法和TLD

 

之后是在页面上加上声明

 

<%@ taglib uri="/aaa" prefix="mytag"%>

 

使用起来就变得非常简单了

 

<mytag:hello begin="aa" end="bd"/>

 

以上就是标签的整个配置过程。

 

2.  class的编写

标签handler

标签handler是由Web容器调用的一个对象,用于执行带有自定义标签的JSP页面时对这个标签进行判断。标签handler必须实现Tag或者BodyTag接口。接口可以用于接受现有Java对象并使它成为标签handler。对于新创建的处理器,可以用TagSupportBodyTagSupport类作为基类。这些类和接口包含在javax.servlet.jsp.tagext包中。

JSP页面的servlet在对标签处理的不同阶段调用由TagBodyTag接口定义的标签handler。遇到自定义标签的开始标签时,JSP页面的servlet调用方法以初始化相应的handler,然后调用handlerdoStartTag方法。遇到自定义标签的结束标签时,调用处理器的doEndTag方法。在标签handler需要与标签的正文交互时调用其他方法,见带正文的标签。为了提供标签handler的实现,必须实现在处理标签的不同阶段调用的方法,在表16-1中汇总了这些方法。

16-1标签handler方法

标签handler类型

方法

简单

doStartTag, doEndTag, release

属性

doStartTag, doEndTag, set/getAttribute1...N, release

正文、判断且无交互

doStartTag, doEndTag, release

正文、迭代判断

doStartTag, doAfterBody, doEndTag, release

正文、交互

doStartTag, doEndTag, release, doInitBody, doAfterBody, release

标签handler可以使用一个能让它得以与JSP页面通信的API。到API的入口点是页面上下文对象(javax.servlet.jsp.PageContext),通过它标签handler可以获取JSP页面能够访问的所有其他隐式对象(请求、会话和应用程序)

隐式对象可以有与其相关联的命名属性。可以用[set|get]Attribute方法访问这种属性。

如果标签是嵌入的,标签handler还可以访问与外围标签关联的handler称为parent)

一组相关的标签handler(标签库)一般是打包的且作为JAR文档部署。

简单标签的handler必须实现Tag接口的doStartTagdoEndTag方法。在遇到开始标签时调用doStartTag方法。因为简单标签没有正文,所以这个方法返回SKIP_BODY。在遇到结束标签时调用doEndTag方法。如果要对页面的其他部分进行判断,则doEndTag方法需要返回EVAL_PAGE,否则,它就返回SKIP_PAGE

每当你写的tagJsp页面里面要被解释的时候,服务器就自动调用你的类里面的doStartTag()函数来完成你定义的逻辑,当解析完标签后调用doEndTag()。实现Tag接口来定制自己的tag无疑是最灵活的。但是,难度也比较大,我们定义自己的tag的时候完全不必要搞得这么有内涵。

EVAL_BODY_INCLUDE:把Body读入存在的输出流中,doStartTag()函数可用


EVAL_PAGE
:继续处理页面,doEndTag()函数可用


SKIP_BODY
:忽略对Body的处理,doStartTag()doAfterBody()函数可用


SKIP_PAGE
:忽略对余下页面的处理,doEndTag()函数可用


EVAL_BODY_TAG
:已经废止,由EVAL_BODY_BUFFERED取代


EVAL_BODY_BUFFERED
:申请缓冲区,由setBodyContent()函数得到的BodyContent对象来处理tagbody,如果类实现了BodyTag,那么doStartTag()可用,否则非法

 

EVAL_BODY_AGAIN:请求继续处理body,返回自doAfterBody(),这个返回值在你制作循环tag的时候是很有用的。

 

TagSupportBodyTagSupport的区别主要是标签处理类是否需要与标签体交互,如果不需要交互的就用TagSupport,否则如果不需要交互就用BodyTagSupport

     交互就是标签处理类是否要读取标签体的内容和改变标签体返回的内容。

    TagSupport实现的标签,都可以用BodyTagSupport来实现,因为BodyTagSupport继承了TagSupport

 2 doStartTag(),doEndTag()

   doStartTag()方法是遇到标签开始时会呼叫的方法,其合法的返回值是EVAL_BODY_INCLUDESKIP_BODY,前者表示将显示标签间的文字,后者表示不显示标签间的文字;doEndTag()方法是在遇到标签结束时呼叫的方法,其合法的返回值是EVAL_PAGESKIP_PAGE,前者表示处理完标签后继续执行以下的JSP网页,后者是表示不处理接下来的JSP网页

    doAfterBody(),这个方法是在显示完标签间文字之后呼叫的,其返回值有EVAL_BODY_AGAINSKIP_BODY,前者会再显示一次标签间的文字,后者则继续执行标签处理的下一步。

[wangjy17908]
添加时间:2006-11-22
版权所有(C)2005-2015