<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ taglib uri="/example" prefix="c" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>开发if else标签(是否执行标签体内容、父标签)</title>
<%-- sun公司的if else 标签叫 choose when otherwise 三个标签--%>
</head>
<body>
<%-- 有一个java类控制执行了标签体,就要控制另外一个java类执行标签体。 两个标签共享一个boolean变量 (共享同一个父标签)--%>
<%-- 因为有三个标签,所以要有三个标签处理器类 --%>
<c:choose>
<c:when test="${user!=null }">
aaaaaa
</c:when>
<c:otherwise>
bbbbbb
</c:otherwise>
</c:choose>
</body>
</html>
package cn.itcast.web.tag.example;
import java.io.IOException;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.SimpleTagSupport;
//Choose标签,if else (when otherwise)的父标签,有一个变量记录true false,控制执行if或者else
//父标签要控制标签体执行才可以,才能执行子标签
public class ChooseTag extends SimpleTagSupport {
private boolean isDo;
//is开头的get方法就叫isDo
public boolean isDo() {
return isDo;
}
//is开头的set方法叫setDo
public void setDo(boolean isDo) {
this.isDo = isDo;
}
@Override
public void doTag() throws JspException, IOException {
this.getJspBody().invoke(null);
}
}
package cn.itcast.web.tag.example;
import java.io.IOException;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.SimpleTagSupport;
//when(if)标签
//判断test属性为true和父标签的isDo属性为false就执行标签体,然后将isDo属性设置为true
public class WhenTag extends SimpleTagSupport {
private boolean test;
public void setTest(boolean test) {
this.test = test;
}
@Override
public void doTag() throws JspException, IOException {
//拿到父标签,已经在doTag方法之前调用setParent方法传递进来了 //才能获取和设置父标签的属性
ChooseTag parent = (ChooseTag) this.getParent();
if(test && !parent.isDo()) {
this.getJspBody().invoke(null);
parent.setDo(true);
}
}
}
package cn.itcast.web.tag.example;
import java.io.IOException;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.SimpleTagSupport;
//otherwise(else)标签
//判断父标签的isDo属性为false就执行标签体,然后将isDo属性设置为true
public class OtherWiseTag extends SimpleTagSupport {
@Override
public void doTag() throws JspException, IOException {
ChooseTag parent = (ChooseTag) this.getParent();
if(!parent.isDo()) {
this.getJspBody().invoke(null);
parent.setDo(true);
}
}
}
<?xml version="1.0" encoding="UTF-8" ?>
<taglib xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd"
version="2.0">
<description>A tag library exercising SimpleTag handlers.</description>
<tlib-version>1.0</tlib-version>
<short-name>example</short-name><!-- 描述文件的名称 -->
<uri>/example</uri><!-- 描述文件的uri -->
<tag>
<name>referer</name>
<tag-class>cn.itcast.web.tag.example.RefererTag</tag-class>
<body-content>empty</body-content>
<attribute>
<name>site</name>
<required>true</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
<attribute>
<name>page</name>
<required>true</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
</tag>
<tag>
<name>if</name>
<tag-class>cn.itcast.web.tag.example.IfTag</tag-class>
<body-content>scriptless</body-content>
<attribute>
<name>test</name>
<required>true</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
</tag>
<tag>
<name>choose</name>
<tag-class>cn.itcast.web.tag.example.ChooseTag</tag-class>
<body-content>scriptless</body-content>
</tag>
<tag>
<name>when</name>
<tag-class>cn.itcast.web.tag.example.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>cn.itcast.web.tag.example.OtherWiseTag</tag-class>
<body-content>scriptless</body-content>
</tag>
</taglib>