自定义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: 结束对标记体的处理

5.带属性的标记-从页面向自定义标记传递信息
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>

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值