[学习笔记]JSP自定义标签(2)

四、编写有标签体的标签


需要返回TagSupport.EVAL_BODY_INCLUDE,则可以进入标签体;

AttributeTag.java

[java]  view plain  copy
  1. package org.tagext;  
  2. import javax.servlet.jsp.tagext.*;  
  3. import javax.servlet.jsp.*;  
  4.   
  5. public class AttributeTag extends TagSupport{  
  6.     private String name;  
  7.     public String getName(){  
  8.         return name;  
  9.     }  
  10.     public void setName(String name){  
  11.         this.name = name;  
  12.     }  
  13.     public int doStartTag()throws JspException{  
  14.         Object value = null;  
  15.         value = super.pageContext.getAttribute(name,PageContext.PAGE_SCOPE);  
  16.         if(value==null){  
  17.             return TagSupport.SKIP_BODY;  
  18.         }  
  19.         else{  
  20.             return TagSupport.EVAL_BODY_INCLUDE;  
  21.         }  
  22.     }  
  23. }  


xiazdong.tld
[html]  view plain  copy
  1.    <tag>  
  2. <name>attribute</name>  
  3. <tag-class>org.tagext.AttributeTag</tag-class>  
  4. <body-content>JSP</body-content>  
  5. <attribute>  
  6.     <name>name</name>  
  7.     <required>true</required>  
  8.     <rtexprvalue>true</rtexprvalue>  
  9. </attribute>  
  10.  </tag>  

AttributeTag.jsp
[html]  view plain  copy
  1. <%@ page contentType="text/html" pageEncoding="GBK"%>  
  2. <%@ taglib prefix="xiazdong" uri="xiazdong"%>  
  3. <html>  
  4.     <head>  
  5.         <title></title>  
  6.     </head>  
  7.     <body>  
  8.     <%  
  9.         pageContext.setAttribute("xiazdong","12345");  
  10.     %>  
  11.         <h1>  
  12.             <xiazdong:attribute name="xiazdong">  
  13.                 <h3>${pageScope.xiazdong}</h3>  
  14.             </xiazdong:attribute>  
  15.         </h1>  
  16.     </body>  
  17. </html>  

五、迭代标签


迭代标签的定义就是重复执行标签体,经常用在输出集合;在MVC中经常使用;

代码实例:


一些变化不大的文件我就不写了;

IterateTag.java

[java]  view plain  copy
  1. package org.tagext;  
  2. import javax.servlet.jsp.tagext.*;  
  3. import javax.servlet.jsp.*;  
  4. import java.util.*;  
  5. public class IterateTag extends TagSupport{  
  6.     private String name;  
  7.     private String id;  
  8.     private Iterator<String> iter;  
  9.     public String getName(){  
  10.         return name;  
  11.     }  
  12.     public void setName(String name){  
  13.         this.name = name;  
  14.     }  
  15.     public String getId(){  
  16.         return id;  
  17.     }  
  18.     public void setId(String id){  
  19.         this.id = id;  
  20.     }  
  21.     public int doStartTag()throws JspException{  
  22.         Object value = null;  
  23.         value = super.pageContext.getAttribute(name,PageContext.PAGE_SCOPE);  
  24.         if(value==null||!(value instanceof List<?>)){  
  25.             return TagSupport.SKIP_BODY;  
  26.         }  
  27.         else{  
  28.             iter = ((List<String>)value).iterator();  
  29.             if(iter.hasNext()){  
  30.                 super.pageContext.setAttribute(id,iter.next());  
  31.                 return TagSupport.EVAL_BODY_INCLUDE;  
  32.             }  
  33.             else{  
  34.                 return TagSupport.SKIP_BODY;  
  35.             }  
  36.         }  
  37.     }  
  38.     public int doAfterBody()throws JspException{  
  39.         if(iter.hasNext()){  
  40.             super.pageContext.setAttribute(id,iter.next());  
  41.             return TagSupport.EVAL_BODY_AGAIN;  
  42.         }  
  43.         else{  
  44.             return TagSupport.SKIP_BODY;  
  45.         }  
  46.     }  
  47. }  

IterateTag.jsp
[html]  view plain  copy
  1. <%@ page contentType="text/html" pageEncoding="GBK" import="java.util.*"%>  
  2. <%@ taglib prefix="xiazdong" uri="xiazdong"%>  
  3. <html>  
  4.     <head>  
  5.         <title></title>  
  6.     </head>  
  7.     <body>  
  8.     <%  
  9.         List<String> list = new ArrayList<String>();  
  10.         list.add("A");  
  11.         list.add("B");  
  12.         list.add("C");  
  13.   
  14.         pageContext.setAttribute("xiazdong",list);  
  15.     %>  
  16.         <h1>  
  17.             <xiazdong:iterate name="xiazdong" id="iter">  
  18.                 <h3>${iter}</h3>  
  19.             </xiazdong:iterate>  
  20.         </h1>  
  21.     </body>  
  22. </html>  


六、BodyTagSupport类


BodyTagSupport的特点就是可以将输出内容存在BodyContent中, 一次全部输出;

根据上面的迭代输出的代码,稍微变化即可,主要变化是在IterateTag.java中,需要extends BodyTagSupport;

BodyTagSupport的常用方法:

(1)BodyTagSupport.EVAL_BODY_BUFFERED;

(2)getPreviousOut();       //获得输出到网页的输出流

(3)bodyContent对象存储数据;

[java]  view plain  copy
  1. package org.tagext;  
  2. import javax.servlet.jsp.tagext.*;  
  3. import javax.servlet.jsp.*;  
  4. import java.util.*;  
  5. public class IterateTag extends BodyTagSupport{  
  6.     private String name;  
  7.     private String id;  
  8.     private Iterator<String> iter;  
  9.     public String getName(){  
  10.         return name;  
  11.     }  
  12.     public void setName(String name){  
  13.         this.name = name;  
  14.     }  
  15.     public String getId(){  
  16.         return id;  
  17.     }  
  18.     public void setId(String id){  
  19.         this.id = id;  
  20.     }  
  21.     public int doStartTag()throws JspException{  
  22.         Object value = null;  
  23.         value = super.pageContext.getAttribute(name,PageContext.PAGE_SCOPE);  
  24.         if(value==null||!(value instanceof List<?>)){  
  25.             return TagSupport.SKIP_BODY;  
  26.         }  
  27.         else{  
  28.             iter = ((List<String>)value).iterator();  
  29.             if(iter.hasNext()){  
  30.                 super.pageContext.setAttribute(id,iter.next());  
  31.                 return TagSupport.EVAL_BODY_BUFFERED;    //存在BodyContent中  
  32.             }  
  33.             else{  
  34.                 return TagSupport.SKIP_BODY;  
  35.             }  
  36.         }  
  37.     }  
  38.     public int doAfterBody()throws JspException{  
  39.         if(iter.hasNext()){  
  40.             super.pageContext.setAttribute(id,iter.next());  
  41.             return TagSupport.EVAL_BODY_AGAIN;  
  42.         }  
  43.         else{  
  44.             return TagSupport.SKIP_BODY;  
  45.         }  
  46.     }  
  47.     public int doEndTag()throws JspException{  
  48.         if(super.bodyContent!=null){  
  49.             try{  
  50.                 super.bodyContent.writeOut(super.getPreviousOut());    //输出到页面  
  51.             }  
  52.             catch(Exception e){}  
  53.         }  
  54.         return BodyTagSupport.EVAL_PAGE;  
  55.     }  
  56. }  

七、TagExtraInfo和VariableInfo的使用


在<jsp:useBean id = "">中的id属性表示对象名称,并且可以通过这个名称调用方法;而如果要实现这种效果,必须继承TagExtraInfo类;

我们需要另外创建一个文件,用以表明属性的对象能够在脚本中使用;

MyExtraInfo.java

[java]  view plain  copy
  1. package org.tag;  
  2. import javax.servlet.jsp.tagext.*;  
  3. public class MyTagExtraInfo extends TagExtraInfo{  
  4.     public VariableInfo[] getVariableInfo(TagData data){  
  5.         return new VariableInfo[]{new VariableInfo(data.getId(),"java.lang.String",true,VariableInfo.NESTED)};  
  6.     }  
  7. }  

写完后在xiazdong.tld中添加:

[html]  view plain  copy
  1. <tei-class>           //注意  
  2.     org.tag.MyTagExtraInfo  
  3. </tei-class>  
最后xiazdong.tld中以:
[html]  view plain  copy
  1. <tag>  
  2.     <name>iterate</name>  
  3.     <tag-class>org.tagext.IterateTag</tag-class>  
  4.     <body-content>JSP</body-content>  
  5.   
  6.   
  7.     <tei-class><span style="white-space:pre">         </span>//注意  
  8.         org.tag.MyTagExtraInfo  
  9.     </tei-class>  
  10.   
  11.   
  12.     <attribute>  
  13.         <name>name</name>  
  14.         <required>true</required>  
  15.         <rtexprvalue>true</rtexprvalue>  
  16.     </attribute>  
  17.     <attribute>  
  18.         <name>id</name>  
  19.         <required>true</required>  
  20.         <rtexprvalue>true</rtexprvalue>  
  21.     </attribute>  
  22.   </tag>  


这样在JSP中就能够在Scriptlet中使用;

[html]  view plain  copy
  1. <%@ page contentType="text/html" pageEncoding="GBK" import="java.util.*"%>  
  2. <%@ taglib prefix="xiazdong" uri="xiazdong"%>  
  3. <html>  
  4.     <head>  
  5.         <title></title>  
  6.     </head>  
  7.     <body>  
  8.     <%  
  9.         List<String> list = new ArrayList<String>();  
  10.         list.add("A");  
  11.         list.add("B");  
  12.         list.add("C");  
  13.   
  14.         pageContext.setAttribute("xiazdong",list);  
  15.     %>  
  16.         <h1>  
  17.             <xiazdong:iterate name="xiazdong" id="iter">  
  18.                 <h3><%=iter%></h3>     //注意,原本是${iter}输出;  
  19.             </xiazdong:iterate>  
  20.         </h1>  
  21.     </body>  
  22. </html>  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值