JSP的taglib示例

技术分享

web.xml

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <web-app version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee"
 3     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 4     xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee                                                
 5     http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
 6 
 7     <jsp-config>
 8         <taglib>
 9             <taglib-uri>/WEB-INF</taglib-uri>
10             <taglib-location>/WEB-INF/mytag.tld</taglib-location>
11         </taglib>
12     </jsp-config>
13 </web-app>

mytag.tld

 1 <?xml version="1.0" encoding="UTF-8"?> 
 2 <taglib> 
 3    <tlibversion>1.0</tlibversion> 
 4    <jspversion>1.1</jspversion> 
 5    
 6   <tag> 
 7     <name>displayDate</name> 
 8     <tagclass>gys.DateTagNoBody</tagclass> 
 9     <bodycontent>empty</bodycontent>     <!-- 标签体之间的内容要为空 -->
10   </tag>  
11   <tag> 
12     <name>displayDateTwo</name> 
13     <tagclass>gys.DateTagAttribute</tagclass> 
14     <bodycontent>empty</bodycontent>    <!-- 标签体之间的内容要为空 -->
15     <!-- 定义属性 -->  
16     <attribute>  
17        <name>pattern</name> <!-- 属性名字 -->  
18        <type>String</type>  <!-- 属性类型 -->  
19        <requried>false</requried> <!-- 是否必须 -->  
20        <rtexprvale>false</rtexprvale> <!-- 表示是否可以使用JSP表达式  -->  
21       </attribute>
22   </tag>
23         
24   <tag> 
25     <name>iterator</name> 
26     <tagclass>gys.BodyTag</tagclass> 
27     <bodycontent>jsp</bodycontent> 
28     <!-- 定义属性 --> 
29     <attribute> 
30        <name>count</name> <!-- 属性名字 --> 
31        <type>int</type>  <!-- 属性类型 --> 
32        <requried>false</requried> <!-- 是否必须 --> 
33        <rtexprvale>false</rtexprvale> <!-- 表示是否可以使用JSP表达式  --> 
34   </attribute> 
35   </tag> 
36   
37 </taglib> 

BodyTag.java

 1 package gys;
 2 
 3 import java.io.IOException;
 4 import java.text.SimpleDateFormat;
 5 import java.util.Date;
 6 
 7 import javax.servlet.http.HttpServletRequest;
 8 import javax.servlet.jsp.JspException;
 9 import javax.servlet.jsp.JspWriter;
10 import javax.servlet.jsp.tagext.BodyContent;
11 import javax.servlet.jsp.tagext.BodyTagSupport;
12 
13 public class BodyTag extends BodyTagSupport {
14 
15 //    执行顺序
16 //
17 //    doStartTag()->setBodyContent()->doInitBody()->doAfterTag()->doEndTag()
18 //
19 //    如果doStartTag()返回的是EVAL_BODY_INCLUDE执行doAfterTag()方法,
20 //
21 //    如果它返回SKIP_BODY就执行doEndTag()方法。
22 //
23 //    setBodyContent()方法用于设置标签体内容,如果在计算BodyContent时需要进行一些初始化工作,
24 //
25 //    则在doInitBody()方法中完成。标签体内容执行完后,会调用doAfterBody()方法
26 //
27 //    在doAfterTag()方法中返回EVAL_BODY_AGAIN来重复执行doAfterTag()方法
28 //
29 //    返回SKIP_BODY值则执行doEndTag()方法。
30 //
31 //    在doEndTag()方法中返回EVAL_PAGE值,则执行此标签的后的其它代码,
32 //
33 //    返回SKIP_PAGE则不执行此页面的其它代码。
34     
35     private int count;
36 
37     private HttpServletRequest reqeust;
38 
39     private JspWriter out;
40 
41     public void init() {
42         reqeust = (HttpServletRequest) pageContext.getRequest();
43         out = pageContext.getOut();
44     }
45 
46     @Override
47     public int doStartTag() throws JspException {
48         init();
49         return this.EVAL_BODY_INCLUDE;//执行doAterTag()方法
50     }
51 
52     // 设置当前标签体
53     @Override
54     public void setBodyContent(BodyContent bodyContent) {
55         this.bodyContent = bodyContent;
56         //System.out.println("setBodyContent...");
57     }
58 
59     // 需要初始化bodyContent
60     @Override
61     public void doInitBody() throws JspException {
62         System.out.println("init.....");
63     }
64 
65     @Override
66     public int doAfterBody() throws JspException {
67         if (count >= 1) {
68             try {
69                 out.println(count);
70                 out.println("<Br>");
71             } catch (IOException e) {
72                 e.printStackTrace();
73             }
74             count--;
75             return this.EVAL_BODY_AGAIN;//在doAfterBody中返回,会重复执行doAfterBody方法
76         } else {
77             return this.SKIP_BODY;//执行doEndTag
78         }
79     }
80 
81     @Override
82     public int doEndTag() throws JspException {
83         SimpleDateFormat formater = new SimpleDateFormat("yyyy-MM-dd");
84         String date = formater.format(new Date());
85         try {
86             out.print(date);
87         } catch (IOException e) {
88             e.printStackTrace();
89         }
90         return this.EVAL_PAGE;//不执行此页面的其它代码
91     }
92 
93     // 必须实现setXX()方法
94     public void setCount(int count) {
95         System.out.println("count........");
96         this.count = count;
97     }
98 }

DateTagAttributr.java

 1 package gys;
 2 
 3 import java.io.IOException;
 4 import java.text.SimpleDateFormat;
 5 import java.util.Date;
 6 
 7 import javax.servlet.http.HttpServletRequest;
 8 import javax.servlet.jsp.JspException;
 9 import javax.servlet.jsp.JspWriter;
10 import javax.servlet.jsp.tagext.Tag;
11 import javax.servlet.jsp.tagext.TagSupport;
12 
13 public class DateTagAttribute extends TagSupport {
14 
15     private String pattern;
16 
17     @Override
18     public int doStartTag() throws JspException {
19         HttpServletRequest request;
20         // 是TagSupport类中定义的一个属性,它是javax.servlet.jsp.PageContext的对象
21         request = (HttpServletRequest) pageContext.getRequest();
22         SimpleDateFormat formater = new SimpleDateFormat(pattern);
23         String date = formater.format(new Date());
24         JspWriter out = pageContext.getOut();
25         try {
26             out.print(date);
27         } catch (IOException e) {
28             e.printStackTrace();
29         }
30         // doStartTag() 方法返回 SKIP_BODY 。当然其原因是我们的简单日期标记没有正文。
31         return Tag.SKIP_BODY;
32     }
33 
34     // 必须实现setXX()方法
35     public void setPattern(String pattern) {
36         this.pattern = pattern;
37     }
38 }

 

DateTagNoBody.java

 1 package gys;
 2 
 3 import java.io.IOException;
 4 import java.text.SimpleDateFormat;
 5 import java.util.Date;
 6 
 7 import javax.servlet.http.HttpServletRequest;
 8 import javax.servlet.jsp.JspException;
 9 import javax.servlet.jsp.JspWriter;
10 import javax.servlet.jsp.tagext.Tag;
11 import javax.servlet.jsp.tagext.TagSupport;
12 
13 public class DateTagNoBody extends TagSupport {
14 
15     @Override
16     public int doStartTag() throws JspException {
17         HttpServletRequest request=(HttpServletRequest)pageContext.getRequest();
18         SimpleDateFormat formater=new SimpleDateFormat("yyyy-MM-dd");
19         String date=formater.format(new Date());
20         JspWriter out=pageContext.getOut();
21         try{
22             out.print(date);
23         }
24         catch(IOException e){
25             e.printStackTrace();
26         }
27         return Tag.SKIP_BODY;
28     }
29 
30 }

运行结果:

技术分享

 

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。