posts - 36, comments - 419, trackbacks - 0, articles - 0
  BlogJava :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

实现if elseif else的jsp标签。

Posted on 2010-07-28 16:13 BearRui(AK-47) 阅读(4192) 评论(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>

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

<g:if test="">

   1

<g:elseif test="" /> 

  2

<g:else /> 

  3

</g:if>

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

实现:

要实现上面说的if elseif,需要继承BodyTagSupport,利用BodyTagSupport的bodyContent的来实现该功能,这里不具体介绍如何实现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;
    }
    
/**
     * 是否已经执行完毕
     * 
@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()){
            
// 已经有执行成功的条件,保存之前的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()){
            
// 已经有执行成功的条件,保存之前的html
            ifTag.setBody();
        }
else{
            
// 之前没有的判断没有成功条件,则清除之前的输出
            ifTag.getBodyContent().clearBody();
            ifTag.succeeded();
        }
            
        
return EVAL_BODY_BUFFERED;
    }
    
}


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

[作者]:BearRui(AK-47)
[博客]: http://www.blogjava.net/bearrui/
[声明]:本博所有文章版权归作者所有(除特殊说明以外),转载请注明出处.
英雄,别走啊,帮哥评论下:  

精彩推荐 好文要顶 水平一般 看不懂 还需努力

评论

# re: 实现if elseif else的jsp标签。  回复  更多评论   

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

# re: 实现if elseif else的jsp标签。  回复  更多评论   

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

# re: 实现if elseif else的jsp标签。  回复  更多评论   

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

# re: 实现if elseif else的jsp标签。  回复  更多评论   

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

# re: 实现if elseif else的jsp标签。  回复  更多评论   

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

# re: 实现if elseif else的jsp标签。  回复  更多评论   

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

# re: 实现if elseif else的jsp标签。  回复  更多评论   

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

# re: 实现if elseif else的jsp标签。  回复  更多评论   

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

# re: 实现if elseif else的jsp标签。  回复  更多评论   

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

# re: 实现if elseif else的jsp标签。  回复  更多评论   

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

# re: 实现if elseif else的jsp标签。  回复  更多评论   

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

# re: 实现if elseif else的jsp标签。  回复  更多评论   

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

# re: 实现if elseif else的jsp标签。  回复  更多评论   

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

# re: 实现if elseif else的jsp标签。  回复  更多评论   

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

# re: 实现if elseif else的jsp标签。  回复  更多评论   

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

# re: 实现if elseif else的jsp标签。  回复  更多评论   

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

# re: 实现if elseif else的jsp标签。  回复  更多评论   

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

# re: 实现if elseif else的jsp标签。  回复  更多评论   

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

# re: 实现if elseif else的jsp标签。  回复  更多评论   

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

# re: 实现if elseif else的jsp标签。  回复  更多评论   

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

# re: 实现if elseif else的jsp标签。  回复  更多评论   

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

# re: 实现if elseif else的jsp标签。  回复  更多评论   

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

# re: 实现if elseif else的jsp标签。  回复  更多评论   

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

# re: 实现if elseif else的jsp标签。  回复  更多评论   

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

# re: 实现if elseif else的jsp标签。  回复  更多评论   

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

# re: 实现if elseif else的jsp标签。  回复  更多评论   

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

# re: 实现if elseif else的jsp标签。[未登录]  回复  更多评论   

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

# re: 实现if elseif else的jsp标签。  回复  更多评论   

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

# re: 实现if elseif else的jsp标签。  回复  更多评论   

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

谢谢支持,^_^

只有注册用户登录后才能发表评论。


网站导航: