BearRui(AK-47)
花开有时,错过了一日便错过了一季,就象人生错过了相遇,就不再找寻到美丽的相聚
随笔- 39  文章- 2  评论- 1288 
博客园  首页  新随笔  联系  管理  订阅 订阅
实现if elseif else的jsp标签。

     相信很多使用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.cnblogs.com/BearsTaR/
[声明]:本博所有文章版权归作者所有(除特殊说明以外),转载请注明出处.
绿色通道:好文要顶关注我收藏该文与我联系
posted on 2010-07-29 08:46 BearRui(AK-47) 阅读(3109) 评论(9) 编辑 收藏
发表评论
2101530
 回复 引用 查看   
#1楼 2010-07-29 09:38 | szyicol      
现在用jsp的人是越来越少了!!
 回复 引用 查看   
#2楼[楼主] 2010-07-29 09:41 | BearRui(AK-47)      
@szyicol
在博客园用jsp的是少,但java中大部分人还是使用的jsp吧,比较一般模板语言,可能很多公司还没什么胆量直接用来做前台页面。

 回复 引用 查看   
#3楼 2010-07-29 16:52 | nicye      
我刚刚写好一个模板引擎

支持 include 其他模板文件
嵌套 for if else end 等

正打算用在前端页面中

 回复 引用 查看   
#4楼[楼主] 2010-07-29 17:03 | BearRui(AK-47)      
@nicye
自己写模板引擎很厉害啊,呵呵。

以前也用过freemarker做前台页面,用起来很方便,也支持include ,if else等等。就是还不太敢再大型项目中使用。

 回复 引用   
#5楼 2010-07-31 11:47 | kasir.wang[未注册用户]
不错。。。
 回复 引用 查看   
#6楼[楼主] 2010-07-31 20:34 | BearRui(AK-47)      
@kasir.wang
谢谢

 回复 引用 查看   
#7楼 2010-08-06 20:09 | nicye      
@BearRui(AK-47)
没什么啦,我写的性能挺好的,就是解析表达式时性能不好。。IF 条件,还有绑定输出时,因为我用了 jscript.eval,这个方便一点!!而且功能也很丰富,不过一百的页面性能还是没啥问题的,我测试 60000 次绑定,也才 150ms

 回复 引用   
#8楼 2011-05-19 23:02 | tld文件如何写呀[未注册用户]
tld文件如何写呀,俺是新手,还是写下吧
 回复 引用   
#9楼 2011-05-19 23:05 | tld文件如何写呀[未注册用户]
tld配置贴一个出来,俺是学习来的,很希望能看到
刷新评论列表  刷新页面  返回页首
发表评论

昵称: [登录] [注册]

主页:

邮箱:(仅博主可见)

验证码: 验证码 看不清,换一个

评论内容:

  登录  注册

[使用Ctrl+Enter键快速提交评论]

0 1787035 bw9CWPa/JX0=
首页博问闪存新闻园子招聘知识库
最新IT新闻:
· 太空首次发现固体富勒烯
· 苹果第三名创始人:当年离开苹果因前景不明
· 报告称Android广告印象份额同比增长504%
· 百度高管称正调研东南亚市场 未来或建分公司
· 东芝索尼获得日本国有银行逾十亿美元贷款
» 更多新闻...
最新知识库文章:
· 编程的艺术:漂亮的代码和漂亮的软件
· GIT分支管理是一门艺术
· 编程:是一门艺术
· 编程是一门艺术吗?
· 对Java初学者的忠告
» 更多知识库文章...

China-pub 2011秋季教材巡展
China-Pub 计算机绝版图书按需印刷服务

抓虾
google reader
鲜果
哪吒
QQ邮箱
http://wap.feedsky.com/BearRui
昵称:BearRui(AK-47)
园龄:5年10个月
荣誉:推荐博客
粉丝:127
关注:3

搜索

 

最新随笔

  • 1. 产生唯一随机码的方法分析。
  • 2. URL中允许携带sessionid带来的安全隐患。
  • 3. JS 实现完美include
  • 4. 基于模板的excel导出
  • 5. 实现if elseif else的jsp标签。
  • 6. 记一复杂页面的前端优化(2) - 其他优化
  • 7. 记一复杂页面的前端优化(1) - 不一样的延迟加载
  • 8. 名站技术分析 — tudou网首页下列菜单的弹出效果
  • 9. LESS 让css也支持变量,运算符,include,嵌套规则等等
  • 10. CSS技巧 — 不使用图片实现圆角、阴影、渐变等功能

随笔分类(38)

  • .NET(11)
  • CSS(3)
  • JAVA(2)
  • javascript(4)
  • Life(5)
  • WEB(4)
  • 高性能WEB开发(5)
  • 浏览器(1)
  • 名站技术分析(3)

随笔档案(39)

  • 2010年10月 (1)
  • 2010年8月 (3)
  • 2010年7月 (5)
  • 2010年6月 (4)
  • 2010年5月 (6)
  • 2006年6月 (4)
  • 2006年5月 (7)
  • 2006年4月 (9)

积分与排名

  • 积分 - 178246
  • 排名 - 484

最新评论

阅读排行榜

评论排行榜

推荐排行榜

Copyright ©2012 BearRui(AK-47)