`
jspengxue
  • 浏览: 179835 次
  • 性别: Icon_minigender_1
  • 来自: 天堂和地狱的中间
社区版块
存档分类
最新评论

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>

 



Web.Xml 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文件格式大家要注意匹配版本



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



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。对于新创建的处理器,可以用TagSupport和BodyTagSupport类作为基类。这些类和接口包含在javax.servlet.jsp.tagext包中。

JSP页面的servlet在对标签处理的不同阶段调用由Tag和BodyTag接口定义的标签handler。遇到自定义标签的开始标签时,JSP页面的servlet调用方法以初始化相应的handler,然后调用handler的doStartTag方法。遇到自定义标签的结束标签时,调用处理器的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接口的doStartTag和doEndTag方法。在遇到开始标签时调用doStartTag方法。因为简单标签没有正文,所以这个方法返回SKIP_BODY。在遇到结束标签时调用doEndTag方法。如果要对页面的其他部分进行判断,则doEndTag方法需要返回EVAL_PAGE,否则,它就返回SKIP_PAGE。

每当你写的tag在Jsp页面里面要被解释的时候,服务器就自动调用你的类里面的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对象来处理tag的body,如果类实现了BodyTag,那么doStartTag()可用,否则非法



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



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

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

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

2 doStartTag(),doEndTag()

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

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

   预定的处理顺序是:doStartTag()返回SKIP_BODY,doAfterBodyTag()返回SKIP_BODY,doEndTag()返回EVAL_PAGE.

  如果继承了TagSupport之后,如果没有改写任何的方法,标签处理的执行顺序是:

   doStartTag() ->不显示文字 ->doEndTag()->执行接下来的网页

  如果您改写了doStartTag(),则必须指定返回值,如果指定了EVAL_BODY_INCLUDE,则执行顺序是

   doStartTag()->显示文字->doAfterBodyTag()->doEndTag()->执行下面的网页

下面来看一段程序:

package com;
import java.io.*;
import java.util.Properties;

import javax.servlet.jsp.*;
import javax.servlet.jsp.tagext.*;
public class TestTld extends TagSupport ...{
      private String begin = null;              //参数
      private String end = null;               //参数
      public TestTld() ...{}                   //构造
      public String getBegin() ...{return begin;}
      public void setBegin(String begin) ...{this.begin = begin;}
      public String getEnd()...{return end;}
      public void setEnd(String end)...{this.end = end;}

      public int doStartTag() throws JspTagException...{//这个方法不用所以直接返回值

            return EVAL_BODY_INCLUDE;

          }


      public int doEndTag() throws JspException ...{//重点在这个方法上
          
          JspWriter out = pageContext.getOut();  //重要

          String sum = begin +""+ end;
        System.out.print(sum);
        //  pageContext.setAttribute("sum", sum); //返回一个值

          try ...{
            out.println("beginend= "+sum);//标签的返回值
        } catch (IOException e) ...{
            
            e.printStackTrace();
        }

        return SKIP_BODY;
      }

      public void release() ...{
        super.release();
      }
    }






下面看一下显示的效果:



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



beginend=aabd

//------------------------------------------------------------------

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

<%=sum%>



beginend=aabd

aabd



3.最后说一下2.0的新方法


SimpleTagSupport类别顾名思义,就是可以处理一些简单的自订标签需求,它是在JSP 2.0之后新增的类别,对于一些简单的自订标签页求,您可以继承它来实作标签处理类别,而不用为了处理一些TagSupport、 BodyTagSuppourt类别中回传值的问题。

为了使用上的简单而降低了复杂性,另一方面就是SimpleTagSupport类别所处理的功能受了些限制,它只处理标签与本体,要不要显示本体文字取决于您,对于标签之后的页面则不在SimpleTagSupport处理的范围之内(虽然您还是可以使用forward之类的方式来决定要不要显示之后的页面,但直接实作TagSupport会更方便一些),另外SimpleTagSupport类别的本体文字不能设定为JSP,这也是使用 SimpleTagSupport上的一些限制。



下面说一下例子:


package demo.tags;

import java.io.*;
import javax.servlet.jsp.*;
import javax.servlet.jsp.tagext.*;

public class SimpleTagFrag extends SimpleTagSupport ...{
    private JspFragment _frag1;
    private JspFragment _frag2;

    public void setFragment1(JspFragment frag1) ...{
        _frag1 = frag1;
    }

    public void setFragment2(JspFragment frag2) ...{
        _frag2 = frag2;
    }

    public void doTag() throws JspException, IOException ...{
        _frag2.invoke(null);
        _frag1.invoke(null);
    }
}


传过来的值都变成了JspFragment类的,看到了么就是这么简单,只实现一个doTag就行了,配置是一样的。输出的时候只要调用.invoke()方法就完成啦,很简单吧



4.现有的开源库


我们最方便能拿到的就是JSTL和Struts的标签了,有兴趣的可以深入研究一下,《JSP2.0》这本书里面有详细的讲解

[url]
分享到:
评论
1 楼 zhengbin917943 2008-01-18  
thank you

相关推荐

    JSP笔记,本人学习JSP的心得

    JSP(JavaServer Pages)是Java的一种技术,用于开发动态网页。...JSP与JavaScript不同,后者主要在客户端执行,而JSP工作在服务器端,它...理解和掌握JSP的基本原理和常用语法,对于深入学习Java Web开发是十分重要的。

    新一代JSP网络编程笔记

    **新一代JSP网络编程笔记** ...本笔记通过个人的学习心得,详细解析了JSP网络编程的关键概念和技术,对于初学者和有经验的开发者都是宝贵的学习资料。通过阅读和实践,读者可以掌握如何利用JSP构建高效的Web应用程序。

    jsp学习总结

    ### jsp学习总结 在深入探讨JSP(JavaServer Pages)的相关知识点之前,我们先来简单了解一下JSP的基本概念。JSP是一种基于Java的技术,用于创建动态网页。它结合了HTML、XML标记语言与Java代码片段,使得开发人员...

    javaweb学习心得.doc

    * 在学习 JSP 时,需要掌握自定义标签的解析过程和使用 七、JQuery * JQuery 是一种 JavaScript 库,负责简化 DOM 操作和事件处理 * 学习 JQuery 需要掌握选择器、事件处理、动画效果等概念 * 在学习 JQuery 时,...

    (word完整版)JSP学习心得.doc

    - `taglib`指令:引入自定义标签库。 3. **动作组件**:JSP动作是以XML格式的标签,用于控制Web容器的行为。例如: - `&lt;jsp:include&gt;`:在运行时动态地将一个页面或资源插入到当前页面。 - `&lt;jsp:param&gt;`:传递...

    JSP学习笔记截屏1

    在1.docx文档中,可能包含了更详细的讲解、代码示例以及对某些复杂概念的解析,例如JSP的转发和重定向、自定义标签的使用、过滤器和监听器等。这些内容都是深化JSP技能的关键点,建议读者仔细研读,以便全面掌握JSP...

    struts2学习心得

    其中,`struts-tags.tld`是Struts2标签库的定义文件,包含了所有自定义标签的元信息,如标签名、属性等。 4. **POJO Action类**:Struts2支持使用简单的JavaBean作为Action类,这种被称为POJO(Plain Old Java ...

    JSP基础 课程知识点总结论文

    Tag文件和Tag标记是JSP自定义标签的实现方式,用于创建可重用的组件。Tag文件使用XML结构定义标签行为,而Tag标记是JSP页面中引用这些自定义标签的方式。通过自定义标签,可以提高代码的可读性和复用性。 **1.3 JSP...

    Jsp程序设计——交友网站

    JSP的核心概念包括:脚本元素、指令元素、动作元素以及自定义标签。在这个交友网站中,JSP用于处理用户请求,生成动态响应,如用户登录、注册、查看个人信息等。 ### 2. MVC设计模式 为了实现清晰的代码结构和良好...

    两个非常不错的JSP笔记

    11. **JSP自定义标签**:开发者可以创建自己的标签库,提供可复用的组件,增强代码的模块化。 在提供的资源中,“课件笔记.rar”可能包含JSP的基础理论、语法示例和实践案例,适合初学者理解和学习JSP的基本用法。...

    JSP基本语法总结(1)---(12)

    - **`&lt;%@ taglib ... %&gt;`**:引入自定义标签库,指定URI和别名。 ### 4. JSP脚本元素 - **`&lt;%-- ... --%&gt;`**:JSP注释,服务器端不会执行。 - **`! ... %&gt;`**:声明区,用于声明变量和方法,相当于Java类的一部分...

    JSP编程(绝对经典的jsp编程经验总结)

    - **Controller**:协调Model和View,如Servlet或自定义标签。 6. **最佳实践** - **最小化脚本**:尽可能使用EL和JSTL,减少Java脚本的使用。 - **分离关注点**:将业务逻辑移至Java类,JSP只负责显示。 - **...

    cankaowenxian.rar_java 参考 文献

    8. `JSP自定义标签试验[转载].mht`:JSP自定义标签是扩展JSP功能的一种方式,这个文件可能是对创建和使用自定义标签的实践指南。 9. `jsp教程二[标签Tag].mht`:与上一个文件类似,继续讲解JSP的标签和Tag库的使用...

    java学习心得笔记.doc

    总结来说,Java学习涵盖了J2EE模式、JSP的指令、脚本元素、动作,以及JavaBean和Custom Tag的使用。同时,理解ServletConfig和会话跟踪对于有效构建和管理Web应用程序至关重要。这些知识点构成了Java开发的基础,并...

    jsp learn

    3. taglib指令:引入自定义标签库,方便扩展功能。 三、JSP脚本元素 1. 表达式:${expression},将Java表达式的结果转换为字符串输出到HTML。 2. 脚本let:! %&gt;, 在页面初始化时执行,创建变量或初始化对象。 3. ...

    jsp网络教学系统(本科毕业设计)

    指令元素如page、include和taglib,用于配置页面属性和引入自定义标签库。 2. **JSP生命周期**:JSP页面经过编译、实例化和销毁三个阶段。在编译阶段,JSP被转换为Servlet源码;实例化阶段,Servlet对象被创建并...

    Jsp开发总结(实用版)

    3. 模块化设计,将功能相近的代码封装为JavaBean或自定义标签。 4. 利用会话管理,正确处理用户状态。 5. 注重异常处理和日志记录,便于问题排查。 通过这些实践经验,你可以更高效地进行JSP开发,创建出稳定、易于...

Global site tag (gtag.js) - Google Analytics