实现ifelseifelse的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() { lease(); init(); } @Override public int doStartTag() throws JspException { if(test){ this.succeeded(); } return EVAL_BODY_BUFFERED; } @Override public int doEndTag() throws JspException { try { if(subtagSucceeded) Out().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 = String().trim(); } } private String getBody(){ if(body == null) String().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) { st = 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(); // 则清除之前的输出BodyContent().clearBody(); } return EVAL_BODY_BUFFERED; } @Override public void release() { lease();
init(); } private void init() { test = false; } private boolean test; public void setTest(boolean test) { st = test; } }
public class ElseTag extends BodyTagSupport{ public void release() { lease(); } 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
jstl条件标签ifTag.setBody(); }else{ // 之前没有的判断没有成功条件,则清除之前的输出 BodyContent().clearBody(); ifTag.succeeded(); } return EVAL_BODY_BUFFERED; } }
tld配置就不贴出来了,因为这个太简单了,⼤家都知道的。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。