知识大全 JSP自定义标签开发入门

Posted

篇首语:炒沙作縻终不饱,缕冰文章费工巧。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 JSP自定义标签开发入门相关的知识,希望对你有一定的参考价值。

JSP自定义标签开发入门  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!

  一般情况下开发jsp自定义标签需要引用以下两个包

  import javax servlet jsp *;

  import javax servlet jsp tagext *;

  首先我们需要大致了解开发自定义标签所涉及到的接口与类的层次结构(其中SimpleTag接口与SimpleTagSupport类是JSP 中新引入的)

>

  目标 :自定义一个用表格显示用户信息的简单标签

  效果图

>

  在jsp页面使用此自定义标签

  假设我们有一个UserInfo的javabean 那么在JSP页面使用此标签只需调用此标签即可

  

  1. <!  创建需要展现UserInfo的实例(用于测试数据)  > 
  2.     <%  
  3.     UserInfo user = new UserInfo();  
  4.     user setUserName("Xuwei");  
  5.     user setAge( );  
  6.     user setEmail("test@test test");  
  7.     pageContext setAttribute("userinfo"  user);    
  8.     %> 
  9.    
  10.     <!  给标签设置user属性绑定要展现的UserInfo对象   > 
  11.     <cc:showUserInfo user="$pageScope userinfo " /> 

  开发步骤

  简单标签的开发我们只要实现Tag接口即可 为了简单起见可以直接继承实现了此接口的TagSupport类

   创建自定义标签类

  

  1. public class UserInfoTag extends TagSupport   
  2.      
  3.     private UserInfo user;  
  4.    
  5.     @Override  
  6.     public int doStartTag() throws JspException   
  7.         try   
  8.             JspWriter out = this pageContext getOut();  
  9.             if(user == null)   
  10.                 out println("No UserInfo Found ");  
  11.             &

   nbsp;   return SKIP_BODY;  

  •               
  •             out println("<table width= px  border=  align= center >");  
  •             out println("<tr>");  
  •             out println("<td width= % >Username:</td>");  
  •             out println("<td>" + user getUserName() + "</td>");  
  •             out println("</tr>");  
  •             out println("<tr>");  
  •             out println("<td>Age:</td>");  
  •             out println("<td>" + user getAge() + "</td>");  
  •             out println("</tr>");  
  •             out println("<tr>");  
  •             out println("<td>Email:</td>");  
  •             out println("<td>" + user getEmail() + "</td>");  
  •             out println("</tr>");  
  •             out println("</table>");  
  •          catch(Exception e)   
  •             throw new JspException(e getMessage());  
  •           
  •         return SKIP_BODY;  
  •       
  •      
  •     @Override  
  •     public int doEndTag() throws JspException   
  •    &nbs

   p;    return EVAL_PAGE;  

  •       
  •    
  •     @Override  
  •     public void release()   
  •         super release();  
  •         this user = null;  
  •       
  •      
  •     //getter and setters  
  •     public UserInfo getUser()   
  •         return user;  
  •       
  •     public void setUser(UserInfo user)   
  •         this user = user;  
  •       
  •  
  •   

   在Web Inf创建标签库描述文件 tdl(Tag Library Description)

  

  1. <?xml version=" " encoding="UTF "?> 
  2. <taglib version=" " xmlns="
  3.  xmlns:xsi="
  4.  xsi:schemaLocation="
  5. <tlib version> </tlib version> 
  6. <jsp version> </jsp version> 
  7. <short name>cc</short name> 
  8. <uri>/mytaglib</uri> 
  9. <tag> 
  10.     <name>showUserInfo</name> 
  11.     <tag class> mytags UserInfoTag</tag class> 
  12.     <body content>empty</body content> 
  13.     <attribute> 
  14.         <name>user</name> 
  15.          <required>false</required> 
  16.          <rtexprvalue>true</rtexprvalue> 
  17.     </attribute> 
  18.  </tag> 
  19. </taglib> 

   配置web xml

  

  1. <jsp config> 
  2.     <taglib> 
  3.         <taglib uri>/mytaglib</taglib uri>&n

   bsp;

  •         <taglib location>/WEB INF/mytaglib tld</taglib location> 
  •     </taglib> 
  •   </jsp config> 

   在需要使用此标签的jsp页面头部引入

  

  1. <%@ taglib uri="/mytaglib" prefix="cc"%> 

   使用(参照上面的使用步骤)

  此致 一个简单的JSP标签开发完成

  标签类说明

>

  我们创建的UserInfoTag类继承了TagSupport类 而它又实现了Tag接口 Tag接口的生命周期由其所在的容器控制 如下图

  setPageContext() 将所在jsp页面的pageContext注入进来 目的是为了在后面的方法中可以访问到jsp页面对象的pageContext属性

  setParent() 设置此标签的父标签

  setAttribute() 将标签中的属性注入到此class的属性 不需要自己实现但要提供属性的get与set方法

  doStartTag() 在开始标签属性设置后调用 如果返回SKIP_BODY则忽略标签之中的内容 如果返回EVAL_BODY_INCLUDE则将标签体的内容进行输出

  doEndTag() 在结束标签之前调用 返回SKIP_PAGE跳过整个jsp页面后面的输出 返回EVAL_PAGE执行页面余下部分

  release() 生命周期结束时调用

  特别说明 在tomcat 之后的版本中默认开启了标签缓冲池(websphere和weblogic并不会这么做) 所以执行完标签后并不会执行release()方法(_jspDestroy()时才释放) 也就是说同一个jsp页面自定义标签不管使用多少次只会存在一个实例 但也并不是每一个标签都会为其创建一个缓冲池 要根据参数来判断 例如

  

  1. <cc:UserInfoTag user=”…” /> 
  2. <cc:UserInfoTag /> 

  上面例子中由于参数不同就会创建两个标签缓冲池

  这个问题可以通过设定tomcat的配置文件加以解决

  在%tomcat%\\conf\\web xml加入enablePooling参数 并设置为false(不缓存自定义标签)

  

  1. <init param> 
  2.   <param name>enablePooling</param name> 
  3.   <param value>false</param value> 
  4. </init param> 

  清空%tomcat%\\conf\\目录

  TagSupport类已经为我们实现并扩展了一些方法(比如在上述方法中我们可以直接使用pageContext对象 调用父标签getParent()等) 所以一般情况下我们只需重写doStartTag() doEndTag() 即可

  TLD文件说明

  <! 版本号 > <tlib version> </tlib version> <jsp version> </jsp version> <short name>cc</short name> <tag> <!—指定标签名 > <name>showUserInfo</name> <!—指定标签类文件的全路径 > <tag class> mytags UserInfoTag</tag class> <! 如果不需要标签体则设置empty 反之设定jsp > <body content>empty</body content> <!—设定属性(如果有的话) > <attribute> <!—指定标签名 > <name>user</name> <!—是否是必须 如果非必须没设置则为空 > <required>false</required> <rtexprvalue>true</rtexprvalue><!—是否可在属性中使用表达式 > </attribute> </tag>

  Web xml文件说明

  <jsp config> <taglib> <!

  标签库的uri路径 即jsp头文件中声明<%@ taglib uri="/mytaglib" prefix="cc"%> 的uri > <taglib uri>/mytaglib</taglib uri> <!—tld文件所在的位置 > <taglib location>/WEB INF/mytaglib tld</taglib location> </taglib> </jsp config>

  目标 :自定义一个类似于Asp Net中的Reapter控件的标签

  效果图

>

  在jsp页面使用此自定义标签

  

  1. <!  创建需要展现javabean(UserInfo)集合的实例(用于测试数据)  > 
  2. <%  
  3.     List<UserInfo> users = new ArrayList<UserInfo>();     
  4.     users add(new UserInfo("Zhangsan"    "Zhangsan@ "));  
  5.     users add(new UserInfo("Lisi"    "Lisi@sina "));  
  6.     users add(new UserInfo("Wangwu"    "Wangwu@qq "));  
  7.     pageContext setAttribute("users"  users);  
  8. %> 
  9.    
  10. <!  给标签绑定数据源   > 
  11. <table width= px  border=  align= center > 
  12.     <tr> 
  13.         <td width= % >UserName</td> 
  14.         <td width= % >Age</td> 
  15.         <td>Email</td> 
  16.     </tr> 
  17.     <cc:repeater var="item" items="$pageScope users "> 
  18.         <tr> 
  19.             <td>$item userName </td> 
  20.             <td>$item age </td> 
  21.             <td>$item email </td> 
  22.         </tr> 
  23.     </cc:repeater> 
  24. </table> 

   ;

  开发步骤

  要完成此控件我们需要实现一个迭代接口 即IterationTag 由于TagSupport同样实现了此接口 所以我们继承此类

   创建自定义标签类

  

  1. public class Repeater extends TagSupport   
  2.     private Collection items;  
  3.     private Iterator it;  
  4.     private String var;  
  5.    
  6.     @Override  
  7.     public int doStartTag() throws JspException   
  8.         if(items == null || items size() ==  ) return SKIP_BODY;  
  9.         it = items iterator();    
  10.         if(it hasNext())   
  11.             pageContext setAttribute(var  it next());  
  12.           
  13.         return EVAL_BODY_INCLUDE;  
  14.       
  15.      
  16.     @Override  
  17.     public int doAfterBody() throws JspException   
  18.         if(it hasNext())   
  19.             pageContext setAttribute(var  it next());  
  20.             return EVAL_BODY_AGAIN;  
  21.           
  22.         return SKIP_BODY;  
  23.       
  24.      
  25.     @Override  
  26.     public int doEndTag() throws JspException   
  27.         return EVAL_PAGE;  
  28.       
  29.      
  30.     public void setItems(Collection items)   
  31.         this items = items;  
  32.       
  33.      
  34.     public void setVar(String var)   
  35.      &

   nbsp;  this var = var;  

  •       
  •  

   在Web Inf创建标签库描述文件 tdl(Tag Library Description)由于目标 种已经创建了此文件 我们只需增加此标签的配置即可

  

  1. <tag> 
  2.     <name>repeater</name> 
  3.     <tag class> mytags Repeater</tag class> 
  4.     <body content>jsp</body content> 
  5.     <attribute> 
  6.         <name>items</name> 
  7.         <required>false</required> 
  8.         <rtexprvalue>true</rtexprvalue> 
  9.     </attribute> 
  10.     <attribute> 
  11.         <name>var</name> 
  12.         <required>true</required> 
  13.         <rtexprvalue>true</rtexprvalue> 
  14.     </attribute> 
  15.  </tag> 
  16.   

   配置web xml (目标 中已完成 无需修改)

   在需要使用此标签的jsp页面头部引入

  

  1. <%@ taglib uri="/mytaglib" prefix="cc"%> 

   使用(参照上面的使用步骤)

  标签类说明

  我们用到了迭代接口 以下是容器处理此接口的流程

>

  作为目标 中的补充 在doAfterBody()如果返回值是EVAL_BODY_AGAIN那么将重新执行此方法

  目标 :使用BodyTagSupport

  此目标并不会使用实际例子进行显示 主要是说明为什么 什么情况下需要使用到BodyTag接口或者BodyTagSupport类?

  如果我们需要在  … 之间的标签体的头部和尾部加上一些标记或者是其他处理 一般的处理方法是在doStartTag和doEndTag方法中进行 但是如果是个迭代标签 标签体的每段内容在循环输出时每次都需要在头部和尾部加上一些标记 我们使用BodyTagSupport就很方便了

  此接口在doStartTag()方法返回值多了一个EVAL_BODY_BUFFERED 它将对主体进行计算 并输出到缓冲区(注 此处是缓冲区并非直接输出到客户端 需要我们手动(this bodyContent getEnclosingWriter() write(this bodyContent getString());)进行输出客户端的调用 否则主体内容不会进行显示)

  标签类说明

  关于BodyTagSupport接口的说明

>

  目标 :自定义的函数库 >

   创建函数库类

  

  1. public class MyFunctions   
  2.     public static String formatMyName(String name)   
  3.        return "your name is " + name;  
  4.       
  5.     public static int add(int a  int b)   
  6.        return a+b;  
  7.       
  8.  

   在TLD文件中配置 (引用于目标 中的tld文件)

  

  1. <function> 
  2.     <name>formatMyName</name> 
  3.     <function class> taglib MyFunctions</function class> 
  4.     <function signature>java lang String formatMyName(java lang String)</function signature> 
  5.  </function> 
  6.    
  7. <function> 
  8.     <name>add</name> 
  9.     <function class> taglib MyFunctions</function class> 
  10.     <function signature>java lang String add(int  int)</function signature> 
  11.  </function> 

   JSP中调用

  

  1. $cc:formatMyName("wangfei")   
  2. $cc:add(   )  
cha138/Article/program/Java/JSP/201311/19809

相关参考

知识大全 JSP自定义标签开发流程[1]

JSP自定义标签开发流程[1]  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  一概述  jsp(

知识大全 JSP自定义标签开发流程[2]

JSP自定义标签开发流程[2]  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  下表引自Sun的j

知识大全 JSP的自定义标签

JSP的自定义标签  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  一基本概念  标签(Tag):

知识大全 JSP自定义标签实现数据字典

JSP自定义标签实现数据字典  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  关于JSP标签的好处

知识大全 JSP自定义标签执行顺序

JSP自定义标签执行顺序  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  首先来看一下简单标签接口

知识大全 详细讲解JSP自定义标签

详细讲解JSP自定义标签  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  &n

知识大全 jsp简单自定义标签的forEach遍历及转义字符

jsp简单自定义标签的forEach遍历及转义字符  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!l

知识大全 Jsp中的自定义标签由浅到深详细讲解[4]

Jsp中的自定义标签由浅到深详细讲解[4]  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  十四如

知识大全 Jsp中的自定义标签由浅到深详细讲解[2]

Jsp中的自定义标签由浅到深详细讲解[2]  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  四创建

知识大全 Jsp中的自定义标签由浅到深详细讲解[1]

Jsp中的自定义标签由浅到深详细讲解[1]  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  一基本