posts - 36, comments - 419, trackbacks - 0, articles - 0
            BlogJava :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理

          實現(xiàn)if elseif else的jsp標簽。

          Posted on 2010-07-28 16:13 BearRui(AK-47) 閱讀(4252) 評論(29)  編輯  收藏 所屬分類: Java

              相信很多使用jstl的朋友都抱怨過,為什么jstl只有<c:if 而沒有elseif、else。當需要判斷多個條件的時候,只能寫多個<c:if 或者使用<c:choose。
          雖然struts有elseif 和 else標簽,不過看著就跟多個<c:if 沒什么2樣,使用如下:

          <s:if test="">  

          1

          </s:if>

          <s:elseif test="">

            2

          </s:elseif>

          <s:else>

             3

          </s:else>

          下面是本人實現(xiàn)的if elseif else。先看看使用代碼:

          <g:if test="">

             1

          <g:elseif test="" /> 

            2

          <g:else /> 

            3

          </g:if>

                這樣代碼結構個人覺得更加清晰簡單,類似freemarker的if elseif。

          實現(xiàn):

          要實現(xiàn)上面說的if elseif,需要繼承BodyTagSupport,利用BodyTagSupport的bodyContent的來實現(xiàn)該功能,這里不具體介紹如何實現(xiàn)jsp tag。直接貼出所有代碼,有興趣的自己看看。 

          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;
              }
              
          /**
               * 是否已經執(zhí)行完畢
               * 
          @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;
              }
          }

           

           


          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()){
                      
          // 已經有執(zhí)行成功的條件,保存之前的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;
              }
          }

           
          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()){
                      
          // 已經有執(zhí)行成功的條件,保存之前的html
                      ifTag.setBody();
                  }
          else{
                      
          // 之前沒有的判斷沒有成功條件,則清除之前的輸出
                      ifTag.getBodyContent().clearBody();
                      ifTag.succeeded();
                  }
                      
                  
          return EVAL_BODY_BUFFERED;
              }
              
          }


          tld配置就不貼出來了,因為這個太簡單了,大家都知道的。

          [作者]:BearRui(AK-47)
          [博客]: http://www.aygfsteel.com/bearrui/
          [聲明]:本博所有文章版權歸作者所有(除特殊說明以外),轉載請注明出處.
          英雄,別走啊,幫哥評論下:  

          精彩推薦 好文要頂 水平一般 看不懂 還需努力

          評論

          # re: 實現(xiàn)if elseif else的jsp標簽。  回復  更多評論   

          2010-07-29 17:10 by popo4j
          好文章,頂一下!

          # re: 實現(xiàn)if elseif else的jsp標簽。  回復  更多評論   

          2010-07-29 17:10 by popo4j
          文章很精彩,推薦一下!

          # re: 實現(xiàn)if elseif else的jsp標簽。  回復  更多評論   

          2010-07-29 17:10 by popo4j
          好文章,頂一下!

          # re: 實現(xiàn)if elseif else的jsp標簽。  回復  更多評論   

          2010-07-29 17:10 by popo4j
          文章寫的一般般,:)

          # re: 實現(xiàn)if elseif else的jsp標簽。  回復  更多評論   

          2010-07-29 17:10 by popo4j
          看不懂哦,~_~

          # re: 實現(xiàn)if elseif else的jsp標簽。  回復  更多評論   

          2010-07-29 17:10 by popo4j
          博主還需努力啊!

          # re: 實現(xiàn)if elseif else的jsp標簽。  回復  更多評論   

          2010-07-29 17:11 by popo4j
          看不懂哦,~_~

          # re: 實現(xiàn)if elseif else的jsp標簽。  回復  更多評論   

          2010-07-29 17:11 by popo4j
          文章寫的一般般,:)

          # re: 實現(xiàn)if elseif else的jsp標簽。  回復  更多評論   

          2010-07-29 17:11 by popo4j
          好文章,頂一下!

          # re: 實現(xiàn)if elseif else的jsp標簽。  回復  更多評論   

          2010-07-29 17:11 by popo4j
          文章很精彩,推薦一下!

          # re: 實現(xiàn)if elseif else的jsp標簽。  回復  更多評論   

          2010-07-29 17:11 by popo4j
          好文章,頂一下!

          # re: 實現(xiàn)if elseif else的jsp標簽。  回復  更多評論   

          2010-07-29 17:11 by popo4j
          文章寫的一般般,:)

          # re: 實現(xiàn)if elseif else的jsp標簽。  回復  更多評論   

          2010-07-29 17:11 by popo4j
          看不懂哦,~_~

          # re: 實現(xiàn)if elseif else的jsp標簽。  回復  更多評論   

          2010-07-29 17:11 by popo4j
          博主還需努力啊!

          # re: 實現(xiàn)if elseif else的jsp標簽。  回復  更多評論   

          2010-07-29 17:11 by popo4j
          看不懂哦,~_~

          # re: 實現(xiàn)if elseif else的jsp標簽。  回復  更多評論   

          2010-07-29 17:11 by popo4j
          文章寫的一般般,:)

          # re: 實現(xiàn)if elseif else的jsp標簽。  回復  更多評論   

          2010-07-29 17:11 by popo4j
          好文章,頂一下!

          # re: 實現(xiàn)if elseif else的jsp標簽。  回復  更多評論   

          2010-07-29 17:11 by popo4j
          文章很精彩,推薦一下!

          # re: 實現(xiàn)if elseif else的jsp標簽。  回復  更多評論   

          2010-07-29 17:11 by popo4j
          好文章,頂一下!

          # re: 實現(xiàn)if elseif else的jsp標簽。  回復  更多評論   

          2010-07-29 17:11 by popo4j
          文章寫的一般般,:)

          # re: 實現(xiàn)if elseif else的jsp標簽。  回復  更多評論   

          2010-07-29 17:11 by popo4j
          看不懂哦,~_~

          # re: 實現(xiàn)if elseif else的jsp標簽。  回復  更多評論   

          2010-07-29 17:11 by popo4j
          博主還需努力啊!

          # re: 實現(xiàn)if elseif else的jsp標簽。  回復  更多評論   

          2010-07-29 17:11 by popo4j
          看不懂哦,~_~

          # re: 實現(xiàn)if elseif else的jsp標簽。  回復  更多評論   

          2010-07-29 17:11 by popo4j
          文章寫的一般般,:)

          # re: 實現(xiàn)if elseif else的jsp標簽。  回復  更多評論   

          2010-07-29 17:11 by popo4j
          文章很精彩,推薦一下!

          # re: 實現(xiàn)if elseif else的jsp標簽。  回復  更多評論   

          2010-07-29 17:14 by BearRui(AK-47)
          暈,樓上的干嘛了。

          # re: 實現(xiàn)if elseif else的jsp標簽。[未登錄]  回復  更多評論   

          2010-07-30 09:40 by alan
          ......

          # re: 實現(xiàn)if elseif else的jsp標簽。  回復  更多評論   

          2010-07-30 11:03 by 凡客
          文章很精彩

          # re: 實現(xiàn)if elseif else的jsp標簽。  回復  更多評論   

          2010-08-01 22:43 by BearRui(AK-47)
          @凡客

          謝謝支持,^_^
          主站蜘蛛池模板: 宁安市| 集贤县| 漳平市| 益阳市| 宜君县| 吴江市| 前郭尔| 安福县| 临桂县| 民和| 龙井市| 牟定县| 贡觉县| 玉门市| 汾西县| 元江| 乌兰察布市| 财经| 隆德县| 北碚区| 进贤县| 曲阳县| 湛江市| 阿拉善盟| 兰考县| 邢台市| 永嘉县| 石嘴山市| 淮南市| 英德市| 兴隆县| 辉南县| 郧西县| 梧州市| 莫力| 深州市| 霍林郭勒市| 衡阳市| 广安市| 夹江县| 汝城县|