注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

北漂的小羊

Java编程,开发者,程序员,软件开发,编程,代码。新浪微博号:IT国子监

 
 
 

日志

 
 
关于我

在这里是面向程序员的高品质IT技术学习社区,是程序员学习成长的地方。让我们更好地用技术改变世界。请关注新浪微博号: IT国子监(http://weibo.com/itguozijian)

网易考拉推荐

创建JSP自定义标签  

2011-05-14 09:58:18|  分类: JSP |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

在JSP编程中,Struts一般用来处理form和业务逻辑,Struts中使用了很多自定义标签,如html、bean等,但很多时候我们还是需要使用 "<% java code %>" 这样的语句来操作一些输出。为了减少这种代码,可以创建自定义标签。
     一个tag就是一个普通的java类,它唯一特别之处是它必须继承TagSupport或者BodyTagSupport类。这两个类提供了一些方法,负责jsp页面和你编写的类之间的交互,例如输入,输出。而这两个类是由jsp容器提供的,无须开发人员自己实现。换句话说,你只需把实现了业务逻辑的类继承TagSupport或者BodyTagSupport,再做一些特别的工作,你的类就是一个Tag。并且它自己负责和jsp页面的交互,不用你多操心。
下面介绍如何创建一个自定义标签。
一.编写java类继承TagSupport或TagSupport
1) 提供属性的set方法,
此后这个属性就可以在jsp页面设置。以jstl标签为例 <c:out value=""/>,这个value就是jsp数据到tag之间的入口。所以tag里面必须有一个setValue方法,具体的属性可以不叫value。例如setValue(String data)

Unknown macro: {this.data = data;}

这个“value”的名称是在tld里定义的。取什么名字都可以,只需tag里提供相应的set方法即可。
2)处理 doStartTag 或 doEndTag
  这两个方法是 TagSupport提供的。 还是以<c:out value=""/>为例,当jsp解析这个标签的时候,在“<”处触发 doStartTag 事件,在“>”时触发 doEndTag 事件。通常在 doStartTag 里进行逻辑操作,在 doEndTag 里控制输出。
下面是一个简单的例子

Java代码 http://ltc603.javaeye.com/blog/70091

package com.test.tag;   

import java.io.IOException;   

import javax.servlet.jsp.JspTagException;   

import javax.servlet.jsp.tagext.BodyContent;   

import javax.servlet.jsp.tagext.BodyTagSupport;   

/**  

* PermissionBodyTag 根据是否有权限显示body内容  

 */  

public class PermissionBodyTag extends BodyTagSupport {   

    boolean permission;   

    public boolean isPermission() 

Unknown macro: {            return permission;        }

  

    public void setPermission(boolean permission) 

Unknown macro: {            this.permission = permission;        }

  

    public int doStartTag() throws JspTagException {   

        if (permission) 

Unknown macro: {                return EVAL_BODY_INCLUDE;            }

 else 

Unknown macro: {                return SKIP_BODY;            }

  

    }   

    public int doEndTag() throws JspTagException {   

        System.out.println("doEndTag");   

        try {   

            if (bodyContent != null) 

Unknown macro: {                    bodyContent.writeOut(bodyContent.getEnclosingWriter());                }

else

Unknown macro: {                }

  

        } catch (IOException e) 

Unknown macro: {                throw new JspTagException("IO ERROR}

  

        return EVAL_PAGE;   

    }   

    public void doInitBody() throws JspTagException 

Unknown macro: {        }

  

    public void setBodyContent(BodyContent bodyContent) 

Unknown macro: {            this.bodyContent = bodyContent;        }

  

}  

package com.test.tag;

import java.io.IOException;

import javax.servlet.jsp.JspTagException;

import javax.servlet.jsp.tagext.BodyContent;

import javax.servlet.jsp.tagext.BodyTagSupport;

/**

* PermissionBodyTag 根据是否有权限显示body内容

 */

public class PermissionBodyTag extends BodyTagSupport {

       boolean permission;

       public boolean isPermission()

Unknown macro: {               return permission;        }

       public void setPermission(boolean permission)

Unknown macro: {               this.permission = permission;        }

       public int doStartTag() throws JspTagException {

              if (permission)

Unknown macro: {                      return EVAL_BODY_INCLUDE;               }

else

Unknown macro: {                      return SKIP_BODY;               }

       }

       public int doEndTag() throws JspTagException {

              System.out.println("doEndTag");

              try {

                     if (bodyContent != null)

Unknown macro: {                             bodyContent.writeOut(bodyContent.getEnclosingWriter());                      }

else

Unknown macro: {                      }

              } catch (IOException e)

Unknown macro: {                      throw new JspTagException("IO ERROR}

              return EVAL_PAGE;

       }

       public void doInitBody() throws JspTagException

Unknown macro: {        }

       public void setBodyContent(BodyContent bodyContent)

Unknown macro: {               this.bodyContent = bodyContent;        }

}

 通常你会发现自己绝大多数活动都集中在 doStartTag 或 doEndTag 方法里。确实如此,熟悉一些接口和类之后,写taglib很容易。正如《jsp设计》的作者所言:里面的逻辑稍微有点复杂,但毕竟没有火箭上天那么难。
二.编写tld文件
  标签文件其实只是一个XML格式的说明文件,内容也很简单。
  创建tagTest-html.tld文件在这个标签文件中,我们将我们创建的标签取名 tagTest,并声明了类型和参数(permission)。将该文件保存在 /WEB-INF 下面。

Java代码 http://ltc603.javaeye.com/blog/70091

 <?xml version="1.0" encoding="UTF-8"?>   

<!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.2</tlibversion>   

    <jspversion>1.1</jspversion>   

    <shortname>tagTest</shortname>   

    <uri>/taiji</uri>   

    <tag>   

        <name>permission</name>   

        <tagclass>com.test.tag.PermissionBodyTag</tagclass>   

        <bodycontent>JSP</bodycontent>   

        <attribute>   

            <name>permission</name>   

            <required>true</required>   

            <rtexprvalue>true</rtexprvalue>   

        </attribute>   

    </tag>   

</taglib>   

   

 <?xml version="1.0" encoding="UTF-8"?>

<!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.2</tlibversion>

       <jspversion>1.1</jspversion>

       <shortname>tagTest</shortname>

       <uri>/taiji</uri>

       <tag>

              <name>permission</name>

              <tagclass>com.test.tag.PermissionBodyTag</tagclass>

              <bodycontent>JSP</bodycontent>

              <attribute>

                     <name>permission</name>

                     <required>true</required>

                     <rtexprvalue>true</rtexprvalue>

              </attribute>

       </tag>

</taglib>

三.加到web.xml中
当然,我们还需要将我们自定义的标签添加到 web.xml 中,否则还是无法使用。

Java代码 http://ltc603.javaeye.com/blog/70091

<taglib>   

    <taglib-uri>/tagTest </taglib-uri>   

    <taglib-location>/WEB-INF/tagTest-html.tld</taglib-location>   

  </taglib>  

<taglib>

    <taglib-uri>/tagTest </taglib-uri>

    <taglib-location>/WEB-INF/tagTest-html.tld</taglib-location>

  </taglib>

四.在jsp页面导入tld

Java代码 http://ltc603.javaeye.com/blog/70091

<%@ taglib uri="/tagTest " prefix="tagTest "%>  

<%@ taglib uri="/tagTest " prefix="tagTest "%>

  这样,你的jsp页面就可以使用自己的tag了。用这个标签就可以根据传人的boolean值来决定标签包的jsp内容是否输出

Java代码

<tagTest:permission permission="<% java code%>">   

//需有权限输出,用户才能看到的内容   

</tagTest:permission>  

<tagTest:permission permission="<% java code%>">

//需有权限输出,用户才能看到的内容

</tagTest:permission>

优点
1. 修改后的JSP文件不再或尽量少包含java代码,. html代码变得非常干净,页面设计人员修改页面文件时,不用担心误删除程序代码了。
2. 程序开发人员使用简单的空白页就可以进行开发,待页面设计人员提交目标页后,只需简单的编辑即可完成替换

  评论这张
 
阅读(663)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2016