From:http://hawke1203.spaces.live.com/blog/cns!6FBBD97FD5DC1F83!253.entry

1. 基本步骤 实例-输出“hello,eking” 1) 标记处理类

Java代码

  1. import javax.servlet.jsp.tagext.*;
  2. import javax.servlet.jsp.*;
  3. public class HelloTag extends TagSupport {
  4. public int doEndTag() throws javax.servlet.jsp.JspException {
  5. return  Tag.EVAL_PAGE;
  6. }
  7. public void release() {
  8. super.release();
  9. }
  10. public int doStartTag() throws javax.servlet.jsp.JspException {
  11. JspWriter out=pageContext.getOut();
  12. try{
  13. out.println("hello, eking");
  14. }catch(java.io.IOException ioe){
  15. ioe.printStackTrace();
  16. }
  17. return Tag.SKIP_BODY;
  18. }
  19. }
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文件

Java代码

  1. <?xml version="1.0" encoding="ISO-8859-1" ?>
  2. <!DOCTYPE taglib
  3. PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.1//EN"
  4. "http://java.sun.com/j2ee/dtds/web-jsptaglibrary_1_1.dtd">
  5. <taglib>
  6. <tlibversion>1.0</tlibversion>
  7. <jspversion>1.1</jspversion>
  8. <shortname>hellodemo</shortname>
  9. <tag>
  10. <name>hello</name>
  11. <tagclass>WebLayer.JspTags.HelloTag</tagclass>
  12. <bodycontent>empty</bodycontent>
  13. </tag>
  14. </taglib>
<?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中加入

Java代码

  1. <taglib>
  2. <taglib-uri>/WEB-INF/hellodemo.tld</taglib-uri>
  3. <taglib-location>/WEB-INF/hellodemo.tld</taglib-location>
  4. </taglib>
<taglib>    <taglib-uri>/WEB-INF/hellodemo.tld</taglib-uri>    <taglib-location>/WEB-INF/hellodemo.tld</taglib-location>  </taglib>

4)hello.jsp

Java代码

  1. <%@ taglib uri="/WEB-INF/hellodemo.tld" prefix="demo" %>
  2. ....
  3. <demo:hello/>
<%@ 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文件中必须对所有的属性进行定义

Java代码

  1. <tag>
  2. ...
  3. <attribute>
  4. <name>属性名</name>
  5. <required>true表示属性必须存在,false表示可由可无</required>
  6. <rtexprvalue>定义属性是否允许使用表达式,为false表示只允许使用字符串</rtexprvalue>
  7. </attribute>
<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()方法会返回一个整数值,用来决定程序的后续流程。它有两个可选值:

Java代码

  1. ----Tag.SKIP_BODY
----Tag.SKIP_BODY

表示忽略掉标签之间的内容

Java代码

  1. ----Tag.EVAL_BODY_INCLUDE
 ----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、但标签处理类中应将这个属性做为成员变量来使用,并给出赋值及取值的方法。如:

Java代码

  1. private String username;
  2. public setUsername(String value){
  3. this.username=value;
  4. }
  5. public  String getUsername(){
  6. return username;
  7. }
     private String username;      public setUsername(String value){           this.username=value;     }     public  String getUsername(){           return username;     }

三、一个简单的范例
1、创建hello标签:定义一个名为mytaglib的标签库,它包含一个简单的hello标签,这个标签能够将
JSP页面中所有的解析为字符串"hello".
A、hello标签的处理类:

Java代码

  1. public int doEndTag() throws JspException{
  2. try{
  3. pageContext.getOut().print("hello");
  4. }catch(Exception e){
  5. throw new JspTagException(e.getMessage());
  6. }
  7. return EVAL_PAGE;
  8. }
      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中引入标签库:

Java代码

  1. ... ...
  2. /mytaglib
  3. /WEB-INF/tld/mytaglib.tld
  4. ... ...
               ... ...

                         /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、

Java代码

  1. 由<span style="color: red;">DispatcherServlet</span>类的init方法负责从静态文本中读取静态文本,然后把它们装载到 Properties对象中,最后再把这个Properties对象作为属性保存到ServletContext中。
由DispatcherServlet类的init方法负责从静态文本中读取静态文本,然后把它们装载到Properties对象中,最后再把这个Properties对象作为属性保存到ServletContext中。

5、DispatcherServlet类的init方法:

Java代码

  1. public void init(ServletConfig config) throws ServletException{
  2. super.init(config);
  3. Properties ps=news Properties();
  4. SevletContext context=config.getServletContext();
  5. InputStream in=context.getResourceAsStream("/WEB-INF/messageresource");
  6. ps.load(in);
  7. in.close();
  8. context.setAttribute("ps",ps);
  9. }
 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 方法。

Java代码

  1. private String key=null;
  2. public String getKey(){
  3. return this.key;
  4. }
  5. public void setKey(String key)
  6. this.key=key;
  7. }
   private String key=null;     public String getKey(){

           return this.key;

  }

    public void setKey(String key)

          this.key=key;

}

在MessageTag的doEndTag方法中,首先从pageContext中读取包含静态文本的Properties对象:

Java代码

  1. Properties ps=(Properties)pageContext.getAttribute("ps",pageContext.APPLACTION_SCOPE);
Properties ps=(Properties)pageContext.getAttribute("ps",pageContext.APPLACTION_SCOPE);

然后从Properties对象中读取key对应的静态文本,最后输出该文本:

Java代码

  1. String message=null;
  2. message=(String)ps.get(key);
  3. pageContext.getOut.print(message);
String message=null;message=(String)ps.get(key);pageContext.getOut.print(message);

8、mytaglib库中定义message标签:

Java代码

  1. message
  2. mypack.MessageTag
  3. empty
  4. produce message by key
  5. key
  6. true
 message    mypack.MessageTag   empty    produce message by key

     key     true

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

转载于:https://www.cnblogs.com/tonyzhangtl/archive/2009/11/19/1606351.html

[转]自定义jsp标记库简介相关推荐

  1. 使用tld文件自定义jsp标签库

    目录 一,标签库描述文件(tld文件) 二,标签处理类 三,在JSP页面中使用自定义的标签 四,举个例子 通过Java的TagSupport类或者BodyTagSupport类,和配套的tld文件,可 ...

  2. Android神技之 使用SVG以及自定义IconFont字体库

    Android神技之 使用SVG以及自定义IconFont字体库 简介 Google在Android 5.X中增加了对SVG矢量图形的支持. SVG是什么 SVG 指可伸缩矢量图形 (Scalable ...

  3. JSP→JSTL标准标签库简介与环境搭建、JSTL助手EL表达式EL隐式对象、标签→out、set、if、多选择配合、foreach、redirect、格式化、JSTL函数标签、自定义标签、标签类架构

    JSTL标准标签库简介与环境搭建 EL表达式与EL隐式对象 out标签 set标签 remove标签 catch标签 if标签 choose.when.otherwise配合标签 foreach标签 ...

  4. jsp导入jstl标签库_EE JSP:使用JSTL标记库生成动态内容

    jsp导入jstl标签库 除了在JSP中编写自己的定制标记之外,您还将发现Java EE实际上提供了一组Java标准标记库(JSTL)供您使用. 这些内置标签包括重复(for-loop)标签,条件标签 ...

  5. EE JSP:使用JSTL标记库生成动态内容

    除了在JSP中编写自己的定制标记之外,您还将发现Java EE实际上提供了一组Java标准标记库(JSTL)供您使用. 这些内置标签包括重复(for-loop)标签,条件标签,变量声明和输出标签等.库 ...

  6. JSP标签库Taglib之自定义function篇,轻松实现日期格式化

    一.什么是Taglib? 如果你曾使用JSP页面来作为渲染视图的话,我相信你对JSTL标签库一定不会感到陌生. 比如: 1.forEach代码片段 <c:forEach var="i& ...

  7. java自定义jsp标签_Javaweb自定义jsp标签

    自定义标签 用户定义的一种自定义的jsp标记,当一个含有自定义标签的jsp页面被jsp引擎编译成Servlet时,tag标签被转化成了对一个称为标签处理类的对象的操作.于是当jsp页面被jsp引擎转化 ...

  8. 2011级-csdn-java-张侃—自定义JSP标签(一)

    自定义JSP标签概述 •         自定义JSP标签就是程序员定义的一种JSP标签,这种标签把那些信息显示逻辑封装在一个单独的Java类中,通过一个XML文件来描述它的使用.当页面中需要使用类似 ...

  9. CodeGen编写自定义表达式标记

    CodeGen编写自定义表达式标记 CodeGen支持开发人员通过编写plug-in modules插件模块来定义自定义表达式标记的能力,以提供与这些标记相关联的逻辑.这种plug-in module ...

  10. Py之Pandas:Python的pandas库简介、安装、使用方法详细攻略

    Py之Pandas:Python的pandas库简介.安装.使用方法详细攻略 目录 pandas库简介 pandas库安装 pandas库使用方法 1.函数使用方法 2.使用经验总结 3.绘图相关操作 ...

最新文章

  1. maven仓库阿里云镜像配置
  2. linux mint 19 与windows时间不同步
  3. 互联网协议 — OAuth2 第三方授权协议
  4. JAVA_OA(八):springMVC对JDBC的操作小项目a
  5. Git的remote
  6. html switch开关实现隐藏,css3实现switch开关效果
  7. jni c向java传递数组_通过jni将jint数组从c返回到java
  8. spring3: Aspectj后置返回通知
  9. java过剩_Java程序员的未来发展之路,你是否感到迷茫?你不知道的Java现状
  10. springmvc5源码
  11. 如何在 GitHub 上大显身手?
  12. Eclipse的Ctrl+Shift+R中过滤文件类型
  13. QT高级编程学习笔记(1)
  14. aria2,破解限速的傻瓜式教程
  15. 吉大java是选修课么,吉大校园网客户端 Java 版
  16. run()方法和start()方法的区别
  17. 【音乐】火速收藏!KTV新歌 +老歌10000首+点歌系统支持手机点歌1.6t音乐文件
  18. 【oracle数据库实验相关步骤和语句】
  19. python下的spectral模块(高光谱图像处理)
  20. http协议和https协议对应的端口号

热门文章

  1. NoSuchObjectException(message:ods_db.event table not found)
  2. 【Spring】- 属性注入方式
  3. 激光雷达是什么?一文带你读懂激光雷达
  4. 寻求生态保护与矿产开发平衡点 青海给出“绿色方案”
  5. java虚拟机之垃圾回收器
  6. 我的前端面试日记(一)
  7. iOS定位服务CoreLocation
  8. (NO.00003)iOS游戏简单的机器人投射游戏成形记(二十一)
  9. UIButton的resizableImageWithCapInsets使用解析
  10. From Apprentice To Artisan 翻译 08