自定义choose,when,otherwise标签

自定义choose,when,otherwise标签。
1)Jsp文件内容:
(1)引入文件
<%@taglib uri="www.ctags.c" prefix="ctag" %>
(2)文件内容,相当于 
<ctag:choose>
        <ctag:when test="${10 < 9}">
            条件成立1
        </ctag:when>
        <ctag:when test="${10 > 9}">
            条件成立2
        </ctag:when>
        <ctag:otherwise>
            其他情况
        </ctag:otherwise>
 </ctag:choose>
相当于: if(条件1){
        }else if(条件2){
        }else if(条件3){
}else{其他情况} 

问题1:标签和Java处理器类对应关系?
一个标签一个处理器类。
一个标签在翻译的过程中会在jsp_service()方法中生成一个方法,每个方法都会创建一个处理器类对象。
问题2:otherwise是在前面条件成立的情况下不执行,如果标签之间不交换数据,otherwise会顺序的被执行?如何保证前面条件执行之后后面条件不执行?
通过父标签传递数据。获得父标签对象,然后子标签可以通过getparent获得同一个父标签对象。在父标签对应的处理器类中设置,setXX和getXX方法。子标签之间就可以传递数据。

2)标签处理器类Java文件


Otherwise标签处理器类
public class otherwisetag extends SimpleTagSupport{
    //用来获取其他子标签的属性。所以不需要set和get
    private boolean test;
    public void doTag() throws JspException, IOException {
        //获取父标签,choose下的子标签,获取的是同一个父对象。
        choosetag choose = (choosetag)this.getParent();
        this.test = choose.isFlag();
        if(!test){
            this.getJspBody().invoke(null);
        }
    }
}
When标签处理器类
public class whentag extends SimpleTagSupport{
    //因为when标签有一个属性,所以需要设置成员变量和setXX方法。
    private boolean test;
    public void setTest(boolean test) {
        this.test = test;
    }
    public void doTag() throws JspException, IOException {
        //获取父标签。choose下的子标签,获取的是同一个父对象。
        choosetag choose = (choosetag)this.getParent();
        choose.setFlag(test);
        if(test){
            this.getJspBody().invoke(null);
        }
    }
}
Choose标签处理器类
public class choosetag extends SimpleTagSupport {
    //不是标签属性,是子标签之间传递参数用的。所以需要get,set方法。
    private boolean flag;
    public boolean isFlag() {
        return flag;
    }
    public void setFlag(boolean flag) {
        this.flag = flag;
    }
    public void doTag() throws JspException, IOException {
        this.getJspBody().invoke(null);
    }
}

3)tld文件内容
<tag>
    <name>choose</name>
    <tag-class>defineLables.choosetag</tag-class>
    <body-content>scriptless</body-content>
  </tag>

  <tag>
    <name>when</name>
    <tag-class>defineLables.whentag</tag-class>
    <body-content>scriptless</body-content>
    <attribute>
        <name>test</name>
        <required>true</required>
        <rtexprvalue>true</rtexprvalue>
    </attribute>
  </tag>

  <tag>
    <name>otherwise</name>
    <tag-class>defineLables.otherwisetag</tag-class>
    <body-content>scriptless</body-content>
  </tag>








猜你喜欢

转载自blog.csdn.net/newVenues/article/details/70784610
今日推荐