jsp标签小结

2006/11 23 02:11

JSP自定义标签试验原文:兔八哥笔记3:JSP自定义标签试验

 

一、概述

       JSP中有一块重要的技术:自定义标签(Custom Tag),最近这几天在学习Struts的时候发现Struts中使用了很多自定义标签,如htmlbean等。所以我就做了个简单的试验,学习一下这种技术

       首先介绍一下这种技术吧!

1.优点:

取代了JSP中的Java程序,并且可以重复使用,方便不熟悉Java编程的网页设计人员。

2开发流程:

(1)       编写JSP,在JSP中使用自定义标签。

(2)       web.xml中指定JSP中使用的标签的.tld(标签库描述文件)文件的位置。

(3)       .tld文件中指定标签使用的类。

3. 自定义标签的分类:

(1)       简单标签:如< mytaghelloworld/>

(2)       带属性标签:如checkinput dbname = “”/>

(3)       带标签体的标签:

在自定义标签的起始和结束标签之间的部分为标签体(Body)Body的内容可以是JSP中的标准标签,也可以是HTML、脚本语言或其他的自定义标签。

checkinput dbname = “”>

     

checkinput />

(4)       可以被s cript使用的标签:

定义了idtype属性的标签可以被标签后面的s criptlet使用。

connection id = “oraDB” type = “DataSource” name = “Oracle”>

<%oraDB.getConnection(); %>

 

4.接口及其他

实际上,自定义标签的处理类实现了Tag Handler对象。JSP技术javax.servlet.jsp.tagext中提供了多个Tag Handler接口,JSP1.2中定义了TagBodyTagIterationTag接口,在JSP2.0中新增了SimpleTag接口。JSP还提供了上述接口的实现类TagSupportBodyTagSupportSimpleTagSupportSimpleTagSupport只在JSP2.0中才有)。BodyTagSupport实现了BodyTagTagIterationTag接口。

 

接口及其方法

Tag接口

方法

SimpleTag

dotage

Tag

doStartTag,doEndTag,release

IterationTag

doStartTag,doAfterTag,release

BodyTag

doStartTag,doEndTag,release,doInitBody,doAfterBody

 

下表引自SunJSP在线教程。

Tag Handler Methods 

Tag Handler Type

Methods

Simple

doStartTag, doEndTag, release

Attributes

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

Body, Evaluation and No Interaction

doStartTag, doEndTag, release

Body, Iterative Evaluation

doStartTag, doAfterBody, doEndTag, release

Body, Interaction

doStartTag, doEndTag, release, doInitBody, doAfterBody, release

 

下表中的EVALevaluate的缩写,意思是:评价, 估计, ...的值,在下列的返回值中的意思是执行。

返回值

意义

SKIP_BODY

表示不用处理标签体,直接调用doEndTag()方法。

SKIP_PAGE

忽略标签后面的JSP内容。

EVAL_PAGE

处理标签后,继续处理JSP后面的内容。

EVAL_BODY_BUFFERED

表示需要处理标签体。

EVAL_BODY_INCLUDE

表示需要处理标签体,但绕过setBodyContent()doInitBody()方法

EVAL_BODY_AGAIN

对标签体循环处理。

 

具体用法可以查看其他参考资料。

SunJava教程相关部分:java.sun.com/webservices/docs/1.0/tutorial/doc/JSPTags.html">http://java.sun.com/webservices/docs/1.0/tutorial/doc/JSPTags.html

 

 

二、实验

1.试验介绍

下面的实验就是基于上述开发流程开发的。

1)在JSP中指定tagliburi<%@ taglib uri="/helloworld" prefix="mytag" %>

2)在web.xml中配置tag-location:

            /helloworld

            /WEB-INF/helloworld.tld

      

       3)在tag-location中指定的.tld文件中定义实现标签的处理类:

   <short-name>mytagshort-name>

   <tag>

      <name>helloworldname>

      <tag-class>mytag.HelloWorldTagtag-class>

      <body-content>emptybody-content>

 tag>

(4)执行处理类mytag.HelloWorldTagdoStartTag和doEndTag方法,然后将结果输入到JSP中,和JSP中的内容一起输出。实际上自定义标签和JSP中的其他的内容被WebServer一起编译成servlet。

 

 

2. 完成后的试验的目录结构

应用myjsp放在Tomcatwebapps下。

myjsp中包含J2EE标准目录结构:WEB-INFhello.jspWEB-INF中包含子目录classeslibweb.xml,tld文件可以放在WEB-INF下,也可以放在WEB-INF的子目录下。

 

 

3.开始实验

31编写JSP

 

< !—hello.jsp源码 -- >

<%@ page contentType="text/html; charset=GBK" %>

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

</span></p> <p><span><a href="http://www.itlove.net/" target="_blank" rel="noopener"><font color=#246398>jsp</font></a>1</span></p> <p><span>

下面显示的是自定义标签中的内容

 

 


 

 

32.编写web.xml
< !—web.xml源码 -- >

"http://java.sun.com/dtd/web-app_2_3.dtd">

        /helloworld

        /WEB-INF/helloworld.tld


3编写tld文件

 

< !—helloworld.tld源码 -- >

JSP Tag Library 1.2//EN"

   "http://java.sun.com/dtd/web-jsptaglibrary_1_2.dtd">

<taglib>

   <tlib-version>1.0tlib-version>

   <jsp-version>1.2jsp-version>

   <short-name>mytagshort-name>

   <tag>

       <name>helloworldname>

       <tag-class>mytag.HelloWorldTagtag-class>

       <body-content>emptybody-content>

   tag>

taglib>

 以下为jsp2.0


 test
 1.0

 
  hello world
  title
  EMPTY
  com.test.tag.helloworld
  
   title
   true
   true
  

 

3编写标签实现类

 

< !—标签的实现类HelloWorldTag.class源码 -- >

package mytag;   

 

import java.io.IOException;

import javax.servlet.jsp.*;

import javax.servlet.jsp.tagext.*;

 

public class HelloWorldTag extends TagSupport {    

 public HelloWorldTag() {

 }

 public int doStartTag() throws JspTagException{

    return EVAL_BODY_INCLUDE;

 }

 public int doEndTag() throws JspTagException{

    try {

      pageContext.getOut().write("Hello World");

    }

    catch (IOException ex) {

      throw new JspTagException("错误");

    }

    return EVAL_PAGE;

 }

}

 

 

3执行效果

部署到TomcatWebApps目录下,启动Tomcat,输入:jsp/hello.jsp">http://localhost:8080/myjsp/hello.jsp

--转载请注明: http://www.jamesying.com/2006/11/23/jsp%e6%a0%87%e7%ad%be%e5%b0%8f%e7%bb%93/

发表回复

欢迎回来 (打开)

(必填)