jstl 自定义标签

开发自定义标记需要有两个组件:
1、一个是描述标记特征的标记库描述文件(TLD文件)
2、另一个是Java类,也称为标记处理器,为了完成标记的行为,JSP容器要执行标记处理器。
自定义标签实现过程:
 1、写标签处理器类:TestTag.java。
 2、写tld文档:用来指定标签的名字,标签库等。
 3、用JSP来测试(指定标签库的位置tld,指定前缀名,使用标签)。

首先编写标签处理器类,标签处理器类需要继承javax.servlet.jsp.tagext.TagSupport或者javax.servlet.jsp.tagext.BodyTagSupport,二者区别暂时不知道,如果有高手知道,请给与指导,谢谢先。一般实现doStartTag和doEndTag方法,例如:

public class ExampleTag extends TagSupport{
                 public int doStartTag(){
                    //当处理开始标记的时候调用该方法
                }
               public int doEndTag(){
                       //当处理结束标记的时候调用该方法
               }
}

doStartTag方法和doEndTag方法的返回值说明:

SKIP_BODY:跳过自定义标签间的代码, 跳过了开始和结束标签之间的代码,一般是在doStartTag中使用;
       SKIP_PAGE:跳过在此之后的所有页面内容,忽略剩下的页面,一般是在doEndTag中使用;
       EVAL_BODY_INCLUDE:执行自定义标签间内容,处理嵌套的标签,一般是在doStartTag中使用,由负责处理标签正文的tag接口提供 ;

EVAL_BODY_BUFFERED :对包含的内容进行解析 一般是在doStartTag中使用,由负责处理标签正文的bodyTag接口提供,目的是通知jsp容器作好读取正文的工作(创建一个body-content包装正文和获取存放操作结果的out对象,便于以后的操作和输出). 
       EVAL_BODY_AGAIN:再次执行自定义标签间内容,处理标签正文,嵌套标签的iteratorTag接口的使用 ;
       EVAL_PAGE:执行标签后页面内容, 继续执行下面的页, 一般是在doEndTag中使用 ;

常用的返回值为:EVAL_BODY_INCLUDE。

常用的属性有pageContex。

例如:

package com.test;
       import java.io.IOException;
       import javax.servlet.jsp.tagext.BodyTagSupport;
       public class TestAttributeTag extends BodyTagSupport {

//自定义标签支持带参数
      private String name;
      public String getName() {
                return name;
      }
      public void setName(String name) {
                this.name = name;
      }
      public int doStartTag(){
                try {
                              pageContext.getOut().print("Hello "+name);
                } catch (IOException e) {
                            // TODO Auto-generated catch block
                            e.printStackTrace();
                }
                return EVAL_BODY_INCLUDE;
     }
     public int doEndTag(){
                return  EVAL_BODY_INCLUDE;
      }
}

然后讨论一下TLD文档编写

<?xml version="1.0" encoding="UTF-8"?>
<!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-version>1.0</tlib-version>  //标签版本
 <jsp-version>1.2</jsp-version>  //标签依赖jsp的版本
 <short-name>zl</short-name>  //默认前缀名称
 <uri>http://www.test.com</uri>  //指定标签库德uri
 <tag>
  <name>testtag</name>         //标签名称
  <tag-class>com.test.TestAttributeTag</tag-class>    //标签处理器类
  <body-content>JSP</body-content>                      //标签主体内容,一般选择JSP
  <attribute>                                                           //标签的参数name
   <name>name</name>
   <required>true</required>                                //参数是否必须,true表示必须,false反之
   <rtexprvalue>true</rtexprvalue>                       //是否支持EL表达式
   <type>java.lang.String</type>                         //参数类型
   <description>用户名称</description>             //参数描述
  </attribute>
 </tag>
</taglib>

最后用jsp页面测试自定义标签,例如:

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ taglib prefix="zl" uri="
http://www.test.com" %>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <base href="<%=basePath%>">   
    <title>My JSP 'ZidingyiTag.jsp' starting page</title>   
 <meta http-equiv="pragma" content="no-cache">
 <meta http-equiv="cache-control" content="no-cache">
 <meta http-equiv="expires" content="0">   
 <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
 <meta http-equiv="description" content="This is my page">
 <!--
 <link rel="stylesheet" type="text/css" href="styles.css">
 -->
  </head> 
  <body>
    This is my JSP page. <br>   
 
   <zl:testtagname="test"></zl:testtag>  
  </body>
</html>

例子比较简单,有什么不对地方,欢迎大家批评!

 

转:http://beautifulsmallsnow.blog.163.com/blog/static/280985012010122111644689/

参考:http://www.iteye.com/topic/157737

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值