JSP自定义标签试验

爱笑的霍尼韦尔

爱笑的霍尼韦尔

2016-02-19 18:08

下面图老师小编要跟大家分享JSP自定义标签试验,简单的过程中其实暗藏玄机,还是要细心学习,喜欢还请记得收藏哦!

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

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

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

  2.开发流程:
  (1)       编写JSP,在JSP中使用自定义标签。

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

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

  3. 自定义标签的分类:
  (1)       简单标签:如 mytag:helloworld/

  (2)       带属性标签:如imytag:checkinput dbname = “myBean.getDBName()”/

  (3)       带标签体的标签:

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

  mytag:checkinput dbname = “myBean.getDBName()”

        mytag:log message=”Table Name”

  mytag:checkinput /

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

  定义了id和type属性的标签可以被标签后面的Scriptlet使用。

  mytag:connection id = “oraDB” type = “DataSource” name = “Oracle”

  %oraDB.getConnection(); %

   

  4.接口及其他
  实际上,自定义标签的处理类实现了Tag Handler对象。JSP技术在javax.servlet.jsp.tagext中提供了多个Tag Handler接口,JSP1.2中定义了Tag、BodyTag、IterationTag接口,在JSP2.0中新增了SimpleTag接口。JSP还提供了上述接口的实现类TagSupport、BodyTagSupport和SimpleTagSupport(SimpleTagSupport只在JSP2.0中才有)。BodyTagSupport实现了BodyTag、Tag和IterationTag接口。

   

  接口及其方法

  Tag接口
   方法
   
  SimpleTag
   dotage
   
  Tag
   doStartTag,doEndTag,release
   
  IterationTag
   doStartTag,doAfterTag,release
   
  BodyTag
   doStartTag,doEndTag,release,doInitBody,doAfterBody
   

   

  下表引自Sun的JSP在线教程。

  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
   

   

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

  返回值
   意义
   
  SKIP_BODY
   表示不用处理标签体,直接调用doEndTag()方法。
   
  SKIP_PAGE
   忽略标签后面的JSP内容。
   
  EVAL_PAGE
   处理标签后,继续处理JSP后面的内容。
   
  EVAL_BODY_BUFFERED
   表示需要处理标签体。
   
  EVAL_BODY_INCLUDE
   表示需要处理标签体,但绕过setBodyContent()和doInitBody()方法
   
  EVAL_BODY_AGAIN
   对标签体循环处理。
   

   

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

  Sun的Java教程相关部分:http://java.sun.com/webservices/docs/1.0/tutorial/doc/JSPTags.html

   

   

  二、实验
  1.试验介绍
  下面的实验就是基于上述开发流程开发的。

  (1)在JSP中指定taglib的uri:%@ taglib uri="/helloworld" prefix="mytag" %。

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

  taglib

              taglib-uri/helloworld/taglib-uri

              taglib-location/WEB-INF/helloworld.tld/taglib-location

         /taglib

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

     short-namemytag/short-name

     tag

        namehelloworld/name

        tag-classmytag.HelloWorldTag/tag-class

        body-contentempty/body-content

    /tag

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

   

   

   

  
  2. 完成后的试验的目录结构
  应用myjsp放在Tomcat的webapps下。

  myjsp中包含J2EE标准目录结构:WEB-INF和hello.jsp。WEB-INF中包含子目录classes和lib及web.xml,tld文件可以放在WEB-INF下,也可以放在WEB-INF的子目录下。

   

   

   

  
  3.开始实验
  3.1.编写JSP
   

   !—hello.jsp的源码 --

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

(本文来源于图老师网站,更多请访问http://m.tulaoshi.com/webkaifa/)

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

  html

  head

  title

  jsp1

  /title

  /head

  body bgcolor="#ffffc0"

  h1

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

  /h1

   

  brbr

  mytag:helloworld/mytag:helloworld

   

  br

   

  /form

  /body

  /html

   

  3.2.编写web.xml
   

   !—web.xml的源码 --

  ?xml version="1.0" encoding="UTF-8"?

  !-- edited with XMLSPY v5 rel. 4 U (http://www.xmlspy.com) by Williams (501) --

  !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

  taglib

          taglib-uri/helloworld/taglib-uri

          taglib-location/WEB-INF/helloworld.tld/taglib-location

  /taglib

  /web-app

(本文来源于图老师网站,更多请访问http://m.tulaoshi.com/webkaifa/)

   

  3.3  编写tld文件
   

   !—helloworld.tld的源码 --

  ?xml version="1.0" encoding="ISO-8859-1"?

  !DOCTYPE taglib PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.2//EN"

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

  taglib

     tlib-version1.0/tlib-version

     jsp-version1.2/jsp-version

     short-namemytag/short-name

     tag

         namehelloworld/name

         tag-classmytag.HelloWorldTag/tag-class

         body-contentempty/body-content

     /tag

  /taglib

   

  3.4  编写标签实现类
   

   !—标签的实现类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.5  执行效果
  部署到Tomcat的WebApps目录下,启动Tomcat,输入:http://localhost:8080/myjsp/hello.jsp

   

  “Hello World”就是我们定义的标签部分的处理类输出的结果。

  3.6  注意:
  这个试验我做了2天,总是报错,弄得很是灰心,开始时以为tld文件或web.xml文件配置不正确,但怎么也找不到原因。

  今晚我终于找到原因了,是因为.class文件一定要放在classes文件夹中,我放到了lib中。

  .jar或servlet文件要放在lib目录中,而.class要放在classes目录中,如果要放到lib目录中,必须把mytag中的文件打包成.jar文件,然后把mytag.jar放到lib目录中。

   

  希望你不要犯我犯过的这个错误!^_^

  有时间我会再写一篇介绍Struts详细处理流程的笔记。

  这篇笔记整理的的确是JSP1.2的自定义标签,在JSP2.0中xml文件的格式变了,其他的就不太了解了!但我想变化应该不会太大,另外标准是向下兼容的,感兴趣的朋友可以看看,这是我的学习笔记,可能会对别人有些用处,所以贴出来献丑了!

展开更多 50%)
分享

猜你喜欢

JSP自定义标签试验

Web开发
JSP自定义标签试验

JSP 自定义标签

Web开发
JSP 自定义标签

s8lol主宰符文怎么配

英雄联盟 网络游戏
s8lol主宰符文怎么配

JSP的自定义标签

Web开发
JSP的自定义标签

jsp 自定义分页标签

Web开发
jsp 自定义分页标签

lol偷钱流符文搭配推荐

英雄联盟 网络游戏
lol偷钱流符文搭配推荐

jsp 自定义标签实例

Web开发
jsp 自定义标签实例

使用静态类实现JSP自定义标签

Web开发
使用静态类实现JSP自定义标签

lolAD刺客新符文搭配推荐

英雄联盟
lolAD刺客新符文搭配推荐

在jsp中运用ajax(简单入门)

在jsp中运用ajax(简单入门)

Servlet动态产生JPEG图像的例子

Servlet动态产生JPEG图像的例子
下拉加载更多内容 ↓