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

自定义jsp标记库简介

阅读更多
1. 基本步骤 实例-输出“hello,eking”
1) 标记处理类
import javax.servlet.jsp.tagext.*;
import javax.servlet.jsp.*;

public class HelloTag extends TagSupport {
  public int doEndTag() throws javax.servlet.jsp.JspException {
    return  Tag.EVAL_PAGE;
  }
  public void release() {
    super.release();
  }
  public int doStartTag() throws javax.servlet.jsp.JspException {
      JspWriter out=pageContext.getOut();
      try{
        out.println("hello, eking");
      }catch(java.io.IOException ioe){
        ioe.printStackTrace();
      }
      return Tag.SKIP_BODY;
  }
}

2)标记库描述符   hellodemo.tld文件
<?xml version="1.0" encoding="ISO-8859-1" ?>
<!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>hellodemo</shortname>
  <tag>
     <name>hello</name>
     <tagclass>WebLayer.JspTags.HelloTag</tagclass>
     <bodycontent>empty</bodycontent>
  </tag>
</taglib>
3) 在web.xml中加入
 
<taglib>
    <taglib-uri>/WEB-INF/hellodemo.tld</taglib-uri>
    <taglib-location>/WEB-INF/hellodemo.tld</taglib-location>
  </taglib>

4)hello.jsp
<%@ taglib uri="/WEB-INF/hellodemo.tld" prefix="demo" %>
 ....
 <demo:hello/>


2.TLD描述文件
1)一个taglib下可以有多个tag
2)tag标签下的bodycontent可以为:
   empty: 空标记,即起始标记和结束标记之间没有内容
   JSP:标记题为jsp文本,将和页面上的jsp文本一起被处理
   tagdependent:标记体内容由java标记处理类 来进行处理,不能当作jsp文本


3.标记处理类
   必须实现javax.servlet.jsp.tagext包中接口(Tag,IterationTag,BodyTag)之一。为了简化开发,我们只需要继承包中的两个抽象类,再重载某些方法即可
1)TagSupport: 标记体为空或不需要处理标记体
2)BodyTagSupport: 标记体需要被处理 (对应的bodycontent=tagdependent)

4.自定义标记的生命周期
1)doStartTag()
   处理起始标记时调用,返回一个int值表明对标记体的处理方式:
        Tag.SKIP_BODY:忽略标记体  (对应的bodycontent=empty)
        Tag.EVAL_BODY_INCLUDE: 处理标记体 
2)doEndTag()
   标记体结束时调用,返回一个int值表明对jsp余下页面的处理方式:
        Tag.EVAL_PAGE : 继续执行jsp文件的内容
        Tag.SKIP_PAGE : 停止执行
3)release()
   释放资源

下面两个方法只有在继承BodyTagSupport类的时候才需要重载4)doInitBody()
   在调用doStartTag()之后,处理标记体之前被调用
5)doAfterBody()
   在处理完标记体后,调用doEndTag()之前调用。
   该方法的返回值代表对标记体的处理方式:
      IterationTag.EVAL_BODY_AGAIN : 需要再次处理标记体
      Tag.SKIP_BODY: 结束对标记体的处理

4.带属性的标记-从页面向自定义标记传递信息
1)页面
<demo:hello name="username" />
属性值也可以是表达式,如 :<demo:hello name="<%=request.getParameter("username")%>" />
2)标签处理类
必须提供get,set方法对属性进行操作
每个属性的set方法会在doStartTag()之前自动被调用
3)TLD文件中必须对所有的属性进行定义
<tag>
  ...
  <attribute>
     <name>属性名</name>
     <required>true表示属性必须存在,false表示可由可无</required>
     <rtexprvalue>定义属性是否允许使用表达式,为false表示只允许使用字符串</rtexprvalue>
  </attribute>



一、概要:

1、JSP标签技术始于JSP1.1

2、作用:代码复用;JSP页面简洁

3、四个步骤:
     A、创建实现标签功能的JAVA类(Bean或Servlet)
     B、创建标签库的描述文件
     C、web.xml中添加标签库说明
     D、JSP页面中添加标签库说明,及使用标签

4、标签可以访问的数据范围类型:application;session;request;page.
     ------------------------[主要是为了说明什么时候用JavaBean或TagLib]

二、TagLib常用知识点

1、JSP Tag API----标签处理类必须是此API[只两种,且任一种即可]的子类
    -----javax.servlet.jsp.TagSupport
    -----javax.servlet.jsp.BodyTagSupport

2、TagSupport的主要方法[8种]及重要属性[2个]
     1)主要方法:
        与Servlet容器处理TAG开关相关的方法:
        A、doStartTag()---Servlet容器遇到自定义标签的起始标志时调用该方法
        B、doEndTag()----Servlet容器遇到自定义标签的结束结志时调用该方法
       
        与标签处理类中值相关的方法:
        C、setValue(String k,Object o)---在标签处理类中设置key/value
        D、getValue(String k)--------------在标签处理类中根据参数key返回相应的value
        E、removeValue(String k)---------删除标签处理类中的相应的key/value
       
        与Servlet容器相关,设置页面上下文相关的方法:
        F、setPageContext(PageContext pc)--设置PageContext对象,该方法由Servlet容器
                       在调用doStartTag或doEndTag方法前调用
       
        与标签嵌套相关的方法:
        G、setParent(Tag t)----------------设置嵌套了当前标签的上层标签的处理类,该方法由
                                                        Servlet容器在调用doStartTag或doEndTag方法前调用
        H、getParent()---------------------- 返回嵌套了当前标签的上层标签的处理类

   2)重要属性:
        A、parent---代表了嵌套了当前标签的上层标签的处理类
        B、pageContext----代表了Web应用中的javax.servlet.jsp.PageContext对象
        两点说明        C、Servlet容器在调用doStartTag()或doEndTag()方法前,会先调用
             setPageContext()和setParent()方法,调置pageContext和parent.
        D、在doStartTag()或doEndTag()方法中可以通过getParent()方法获取上层标签的处理类
             在TagSupport类中定义了protected类型的pageContext成员变量,因此在标签处理类
             中可以直接访问pageContext变量

3、pageContext类的几点说明:
     A、pageContext类提供了保存及访问WEB应用共享数据的方法:
          ---public void setAttribute(String name,Object value,int scope)
          ---public Object getAttribute(String name,int scope)
     B、scope---用来指定数据的作用范围。可选值如下:
          PageContext.PAGE_SCOPE
          PageContext.REQUEST_SCOPE
          PageContext. SESSION_SCOPE
          PageContext.APPLICATION_SCOPE
    如:setAttribute("userName","dxm",PageContext.SESSION_SCOPE);

二、TagLib常用知识点  

4、javax.servlet.jsp.TagSupport的两个基础方法的重申:
       ---public int doStartTag() throws JspException
       ---public int doEndTag() throws JspException
    1)doStartTag()方法:
     A、当servlet容器遇到自定义标签的起始标志,就会调用doStartTag()方法。
     B、doStartTag()方法会返回一个整数值,用来决定程序的后续流程。它有两个可选值:
         
----Tag.SKIP_BODY

                表示忽略掉标签之间的内容
        
 ----Tag.EVAL_BODY_INCLUDE
                表示标签之间的肉容要正常执行
         如:
                  ... ...
                 Dxm,Hello!
                  ... ...
     
        若的doStartTag()方法返回Tag.SKIP_BODY,“Dxm,Hello!”字样即不会出现在页
        面;若返回Tag.EVAL_BODY_INCLUDE,则页面上显示出"Dxm,Hello!"字样。

   2)doEndTag()方法:
   A、当servlet容器遇到自定义标签的结束标志,就会自动调用doEndTag()方法
   B、doEndTag()方法也会返回一个整数值,用来决定程序的后续流程。它也有两个可选值:
        ---Tag.SKIP_PAGE
            表示立刻停止执行JSP网页,网页上未处理的静态内容和JSP程序均被忽略,任何已有的输出
            内容立刻返回到客户的浏览器上。
        ---Tag.EVAL_PAGE
            表示按正常的流程继续执行JSP网页。

5、用户自定义标签属性:
A、标签中可以包含自定义的属性,如:

... ...


B、但标签处理类中应将这个属性做为成员变量来使用,并给出赋值及取值的方法。如:
     private String username;
      public setUsername(String value){
           this.username=value;
     }
     public  String getUsername(){
           return username;
     }




三、一个简单的范例
1、创建hello标签:定义一个名为mytaglib的标签库,它包含一个简单的hello标签,这个标签能够将
     JSP页面中所有的解析为字符串"hello".
     A、hello标签的处理类:
   
      public int doEndTag() throws JspException{
                 try{
                          pageContext.getOut().print("hello");
                      }catch(Exception e){
                          throw new JspTagException(e.getMessage());
                      }
                      return EVAL_PAGE;
          }

     B、创建标签库描述文件:.tld文件存放位置;标签库名,标签名,属性,对应的处理类。
         
     C、web.xml中引入标签库:
   
      
               ... ...
               
                         /mytaglib
                         /WEB-INF/tld/mytaglib.tld
               
               ... ...
          
  
  D、JSP页面中引入标签库说明,并使用标签:
          
          taglib指令中,prefix属性值用作指代mytaglib标签库。

四、另一个标签
1、创建一个能替换helloapp应用中JSP网页的静态文本的标签,这个标签名为message,它放在mytaglib标签库中。
2、在hellowithtag2.jsp文件中使用message标签的代码如下:
   
   当客户访问hello.jsp网页时,message标签的处理类会根据属性key的值从一个文本文件中找到与key匹配的字符串。假定这个字符串为“Hello”,然后将这个字符串输出到网页上。
3、创建包含JSP网页静太文本的文件
   messageresource.properties:
   hello.title=Title of hello.jsp
   hello.hello=hello
4、
由[color=red]DispatcherServlet[/color]类的init方法负责从静态文本中读取静态文本,然后把它们装载到Properties对象中,最后再把这个Properties对象作为属性保存到ServletContext中。

5、DispatcherServlet类的init方法:
  
 public void init(ServletConfig config) throws ServletException{
          super.init(config);
          Properties ps=news Properties();
          SevletContext context=config.getServletContext();
          InputStream in=context.getResourceAsStream("/WEB-INF/messageresource");
          ps.load(in);
          in.close();

         context.setAttribute("ps",ps);
    }

6、为保证在WEB应用启动时就加载DispathcherServlet,应该在web.xml中配置这个Servlet时的设置load-on-startup属性:
  
  
     dispacher
     mypack.DspacherServlet
     1
  
  


n        dispatcher n        mypack.DispatcherServlet n        1     7、创建MessageTag标签处理类
      MessageTag包含一个成员变量key ,它与message标签的属性key 对应,在MessageTag
      中定义了getKey和setKey 方法。
 
   private String key=null;
     public String getKey(){

           return this.key;

  }

    public void setKey(String key)

          this.key=key;

}


在MessageTag的doEndTag方法中,首先从pageContext中读取包含静态文本的Properties对象:
Properties ps=(Properties)pageContext.getAttribute("ps",pageContext.APPLACTION_SCOPE);


然后从Properties对象中读取key对应的静态文本,最后输出该文本:
String message=null;
message=(String)ps.get(key);
pageContext.getOut.print(message);


8、mytaglib库中定义message标签:

  
 message
    mypack.MessageTag
   empty
    produce message by key
    
     key
     true

    
后记:
        1问题:在标签处理类中,如何访问session范围内的共享数据?
           选项:
       (B)在标签处理类TagSupport类中定义了pageContext成员变量,先通过它的
            getSession()方法获得当前的HttpSession对象,再调用HttpSession对
            象的getAttribute()方法。
分享到:
评论

相关推荐

    JSP之自定义标记示例程序

    在JSP的学习中,自定义标记应该是一个难点;然而他的作用确是不容忽略的;这是一个自定义标记的示例程序,希望通过这个程序,能够让你对自定义标记的使用有一个大致的了解。

    掌握自定义JSP标签(html).

    掌握自定义JSP标签(html).实用易学,很强的引导性和参考性

    JSP自定义标签学习笔记

    本人自行研究JSP自定义标签的学习笔记 目录如下: 目录 一、概述 1 1.1 使用简单标签机制 2 1.2 使用标签文件 3 二 、自定义标签简介 3 2.1 自定义标签概念 3 2.2 标签相关概念 3 2.3 如何创建自定义标签 3 三、自...

    JSP自定义标记

    第6章 JSP自定义标记

    JSP自定义标记(四则运算)

    这是个实现ComputeSimpleTag标记的文件,该标记可以实现两个数字的加减乘除。自定义为,然后再输入两个数字就可以实现

    自定义JSP标签

    自定义JSP标签,继承了Tag接口和其他的接口

    自定义JSP分页标签

    很适用的自定义JSP分页标签,完整的源码.在实际项目中,是经常用到的.讲解一下:自定义分页标签实现步骤--1.编写一个分页标签处理类;2.配置标记的tld;3.web.xml配置;4.jsp页面调用标记.顺便补充一下:分页,有真分页(读...

    jsp自定义带属性的标签

    jsp自定义带属性的标签 jsp自定义带属性的标签

    jsp-taglibs:有用的JSP自定义标记库

    Phylliscoders JSP自定义标签库 朝鲜语的有用的JSP定制标签库这是您可能需要在韩国开发的JSP定制标签库。 它将不断更新。 安装 在dist/phylliscoders.jar路径中下载文件后,将jar文件复制到项目的WEB-INF/lib文件夹...

    在JSP中使用嵌套的自定义标记 (2002年)

    Java Server Page(JSP)是近几年发展起来的用于生成动态页面的技术,在1.1版本里推出了一项的新功能:允许用户在JSP页面中开发和使用自定义的标记.复杂自定义标记形式(如嵌套)有助于增强JSP页面的功能,扩充自定义...

    jsp自定义带标签体的标签

    jsp自定义带标签体的标签 jsp自定义带标签体的标签

    JSP标签,采用web.xml引入标签库描述文件

    JSP标签、自定义标签,含有属性的JSP标签,学习标签的基本功。

    第6章 JSP自定义标记.ppt

    Java EE编程技术课程课件ppt,供参考学习使用

    自定义标签,jstl应用

    JSP 标准标记库( Standard Tag Library , JSTL) 是一组以标准化格式实现许多通用的 Web 站点功能的定制标记。 JSP 技术的优势之一在于其定制标记库工具。除了核心 JSP 标记,如 jsp:include 之外,定制标记库...

    Struts标记库

    JSP视窗组件所使用的struts标记库由四类标记组成: Bean标记:用来在JSP页中管理bean 逻辑标记:用来在JSP页中控制流程 HTML标记:用来生成HTML标记,在表单中显示数据,使用会话ID对URL进行编程 模板标记:使用...

    ppt课件-第6章 JSP自定义标记.zip

    课件参考,欢迎下载

    JSP设计第二版(附源码).rar

    《JSP设计(第二版)》得到了彻底的修订和更新,包括了JSP规范1.2版本中的重大变化。它包括关于JSP Standard Tag Library...最后,本书作者展示了如何用逼真的示例开发自定义标记库,读者可将其用作自己JSP库的出发点。

    JSP 自定义标签

    JSP 2.0规范中引入Simple Tag Handlers来编写这些自定义标记。 你可以继承SimpleTagSupport类并重写的doTag()方法来开发一个最简单的自定义标签。 创建”Hello”标签 接下来,我们想创建一个自定义标签叫作,标签...

    JSP自定义标签详解

    刚刚接触学习JSP标签的学习资料,将脚本简化为标签

Global site tag (gtag.js) - Google Analytics