实现if elseif else的jsp标签。

 相信很多使用jstl的朋友都抱怨过,为什么jstl只有c:if 而没有elseif、else。当需要判断多个条件的时候,只能写多个c:if 或者使用c:choose。
虽然struts有elseif 和 else标签,不过看着就跟多个c:if 没什么2样,使用如下:

  

 1

  2

   3

 

  下面是本人实现的if elseif else。先看看使用代码:

   1

 

  2

 

  3

      这样代码结构个人觉得更加清晰简单,类似freemarker的if elseif。

 

实现:

 

  要实现上面说的if elseif,需要继承BodyTagSupport,利用BodyTagSupport的bodyContent的来实现该功能,这里不具体介绍如何实现jsp tag。直接贴出所有代码,有兴趣的自己看看。  

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
public  class  IfTag extends  BodyTagSupport{
 
     public  IfTag() {
         super ();
         init();
     }
 
     @Override
     public  void  release() {
         super .release();
         init();
     }
     
     @Override
     public  int  doStartTag() throws  JspException {
         if (test){
             this .succeeded();
         }
         return  EVAL_BODY_BUFFERED;
     }
 
     @Override
     public  int  doEndTag() throws  JspException {
         try  {
             if (subtagSucceeded)
                 pageContext.getOut().write(getBody());
         } catch  (IOException e) {
             throw  new  JspException( "IOError while writing the body: "  + e.getMessage(), e);
         }
         
         init();
         return  super .doEndTag();
     }
     
     private  String body = null ;     //  用于存放成功条件后的内容
     public  void  setBody(){
         if (body == null ){
             body = bodyContent.getString().trim();
         }
     }
     
     private  String getBody(){
         if (body == null )
             return  bodyContent.getString().trim();
         else
             return  body;
     }
     
     /**
      * 判断if 或者 子 else if是否提交成功
      */
     private  boolean  subtagSucceeded;
     
     /**
      * 子条件判断成功
      */
     public  void  succeeded(){
         subtagSucceeded = true ;
     }
     /**
      * 是否已经执行完毕
      * @return
      */
     public  boolean  isSucceeded(){
         return  subtagSucceeded;
     }
     
     private  void  init() {
         test = false ;
         subtagSucceeded = false ;
         body = null ;
     }
     
     private  boolean  test; 
     
     public  void  setTest( boolean  test) {
         this .test = test;
     }
}




1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
public  class  ElseIfTag extends  BodyTagSupport{
 
     public  ElseIfTag() {
         super ();
         init();
     }
 
     @Override
     public  int  doStartTag() throws  JspException {
         Tag parent = getParent();
 
         if (parent== null  || !(parent instanceof  IfTag)){
             throw  new  JspTagException( "else tag must inside if tag" );
         }
         
         IfTag ifTag = (IfTag)parent;
         if (ifTag.isSucceeded()){
             // 已经有执行成功的条件,保存之前的html
             ifTag.setBody();
         } else  if (test){     // 当前条件为true,之前无条件为true
             ifTag.succeeded();
             // 则清除之前的输出
             ifTag.getBodyContent().clearBody();
         }
             
         return  EVAL_BODY_BUFFERED;
     }
      
     @Override
     public  void  release() {
         super .release();
         init();
     }
     
     private  void  init() {
         test = false ;
     }
     
     private  boolean  test; 
     
     public  void  setTest( boolean  test) {
         this .test = test;
     }
}




1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
public  class  ElseTag extends  BodyTagSupport{
 
     public  void  release() {
         super .release();
     }
     
     public  int  doStartTag() throws  JspException {
         Tag parent = getParent();
 
         if (parent== null  || !(parent instanceof  IfTag)){
             throw  new  JspTagException( "else tag must inside if tag" );
         }
         
         IfTag ifTag = (IfTag)parent;
         if (ifTag.isSucceeded()){
             // 已经有执行成功的条件,保存之前的html
             ifTag.setBody();
         } else {
             // 之前没有的判断没有成功条件,则清除之前的输出
             ifTag.getBodyContent().clearBody();
             ifTag.succeeded();
         }
             
         return  EVAL_BODY_BUFFERED;
     }
     
}

 

tld配置就不贴出来了,因为这个太简单了,大家都知道的。











本文转自BearRui(AK-47)博客园博客,原文链接: http://www.cnblogs.com/BearsTaR/archive/2010/07/29/jsp_if_elseif_else_tag.html   ,如需转载请自行联系原作者




你可能感兴趣的:(实现if elseif else的jsp标签。)