Java学习者论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

手机号码,快捷登录

恭喜Java学习者论坛(https://www.javaxxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,购买链接:点击进入购买VIP会员
JAVA高级面试进阶视频教程Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程

Go语言视频零基础入门到精通

Java架构师3期(课件+源码)

Java开发全终端实战租房项目视频教程

SpringBoot2.X入门到高级使用教程

大数据培训第六期全套视频教程

深度学习(CNN RNN GAN)算法原理

Java亿级流量电商系统视频教程

互联网架构师视频教程

年薪50万Spark2.0从入门到精通

年薪50万!人工智能学习路线教程

年薪50万!大数据从入门到精通学习路线年薪50万!机器学习入门到精通视频教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程 MySQL入门到精通教程
查看: 462|回复: 0

[jsp学习]自定义if elseif else的jsp标签

[复制链接]
  • TA的每日心情
    开心
    2021-3-12 23:18
  • 签到天数: 2 天

    [LV.1]初来乍到

    发表于 2014-10-2 13:36:11 | 显示全部楼层 |阅读模式
    相信很多使用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配置就不贴出来了,因为这个太简单了,大家都知道的。
       

       

       
       

       

       
       
       
      
      
       
      


      
      
       
       

         
       

         
       
      
    复制代码
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|Java学习者论坛 ( 声明:本站资料整理自互联网,用于Java学习者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2025-2-26 22:21 , Processed in 0.302650 second(s), 36 queries .

    Powered by Discuz! X3.4

    © 2001-2017 Comsenz Inc.

    快速回复 返回顶部 返回列表