仿写ForEach
package tag1;
import java.io.IOException;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.SimpleTagSupport;
public class chooseTag extends SimpleTagSupport{
private boolean flag=true;
public void setFlag(boolean flag) {
this.flag = flag;
}
public boolean isFlag() {
return flag;
}
@Override
public void doTag() throws JspException, IOException {
getJspBody().invoke(null);
}
// //模仿 if else 该属性不写在mytag.tld中
// private boolean flag1=true;
// //子类调用 设置falg1的布尔值
// public void setFlag1(boolean flag1) {
// this.flag1 = flag1;
// }
// //子类调用 获取 flag1的布尔值
// public boolean isFlag1() {
// return flag1;
// }
}
package tag1;
import java.io.IOException;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.SimpleTagSupport;
import org.apache.taglibs.standard.tag.common.core.ChooseTag;
public class when extends SimpleTagSupport{
private boolean test;
public void setTest(boolean test) {
this.test = test;}
@Override
public void doTag() throws JspException, IOException {
//如果test为真
if(test){
chooseTag ct=(chooseTag) getParent();
boolean flag=ct.isFlag();
if(flag){
//同为true的时候输出
getJspBody().invoke(null);
//重置
ct.setFlag(false);
}}
// if(test1){
// chooseTag ct=(chooseTag) getParent();
// boolean flag1=ct.isFlag();
// if(flag1){
// getJspBody().invoke(null);
// ct.setFlag(flag1);
// }
// }
} //JSP页面中的判断写在此处
/*<lvqian:choose>
<lvqian:when test="${param.age > 24 }">大学毕业</lvqian:when>
<lvqian:when test="${param.age > 20 }">高中毕业</lvqian:when>
<lvqian:otherwise>高中以下。。</lvqian:otherwise>
</lvqian:choose>
// * */
// private boolean test1;
// public void setTest1(boolean test1) {
// this.test1 = test1;
// }
}
package tag1;
import java.io.IOException;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.SimpleTagSupport;
public class otherwise extends SimpleTagSupport{
@Override
public void doTag() throws JspException, IOException {
//获取父类对象
chooseTag ct=(chooseTag) getParent();
// boolean Flag=ct.isFlag();
// if(Flag){
// getJspBody().invoke(null);
// }
//获取父类的 布尔值
if(ct.isFlag()){
getJspBody().invoke(null);
}
}
}
<%@page import="java.util.Map"%>
<%@page import="java.util.HashMap"%>
<%@page import="java.util.ArrayList"%>
<%@page import="tag1.Customer"%>
<%@page import="java.util.List"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<%@taglib prefix="lvqian" uri="tag1.HelloSimpleTag_rt"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<!-- 父标签打印name到控制台 -->
<lvqian:parent>
<!-- 字标签以父标签的标签体存在 字标签把父标签的name属性打印到控制台上 -->
<lvqian:son/>
</lvqian:parent>
<lvqian:getJspFragment>nihaoa</lvqian:getJspFragment>
<lvqian:time time= "10" >abcdefg</lvqian:time>
<%
//模拟Servlet中的操作
List<Customer> customers=new ArrayList<Customer>();
customers.add(new Customer("AA",1));
customers.add(new Customer("BB",2));
customers.add(new Customer("CC",3));
customers.add(new Customer("DD",4));
customers.add(new Customer("FF",5));
request.setAttribute("customers", customers);
%>
<%
Map<String,Customer> cm=new HashMap<String,Customer>();
cm.put("a",cm.get(0));
cm.put("a",cm.get(1));
cm.put("a",cm.get(2));
cm.put("a",cm.get(3));
cm.put("a",cm.get(4));
request.setAttribute("cm", cm);
%>
<%--
<lvqian:foreach tiems="${requestScope.cm }" var="cmp">
-->${pageScope.cmp.key }--${cmp.value.name }-->${cmp.value.age }
</lvqian:foreach>
<c:forEach items="${requestScope.customers }" var="customer">
--${customer.name }, ${customer.age }<br>
</c:forEach>
--%>
<lvqian:foreach tiems="${requestScope.customers }" var="cust">
--${pageScope.cust.name } --${cust.age }<br>
</lvqian:foreach>
<lvqian:choose>
<lvqian:when test="${param.age > 24 }">大学毕业</lvqian:when>
<lvqian:when test="${param.age > 20 }">高中毕业</lvqian:when>
<lvqian:otherwise>高中以下。。</lvqian:otherwise>
</lvqian:choose>
${lvqian:concat(param.name1,param.name2)} EL表达式
</body>
</html>
<?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>mytag 1.0 core library</description>
<display-name>mytag core</display-name>
<tlib-version>1.0</tlib-version>
<!-- 建议在jsp页面上使用的标签前缀 -->
<short-name>lvqian</short-name>
<!-- 作为tid文件的id 用来唯一标示当前的TLD文件 多个TLD文件的URI不能重复 通过 JSP页面的taglib标签的uri属性来引用 -->
<uri>tag1.HelloSimpleTag_rt</uri>
<!-- 自定义标签 -->
<tag>
<name>choose</name>
<tag-class>tag1.chooseTag</tag-class>
<body-content>scriptless</body-content>
</tag>
<tag>
<name>when</name>
<tag-class>tag1.when</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>tag1.otherwise</tag-class>
<body-content>scriptless</body-content>
</tag>
<tag>
<name>parent</name>
<tag-class>tag1.ParentTag</tag-class>
<body-content>scriptless</body-content>
</tag>
<tag>
<name>son</name>
<tag-class>tag1.sonTag</tag-class>
<body-content>empty</body-content>
</tag>
<tag>
<name>foreach</name>
<tag-class>tag1.Foreach</tag-class>
<body-content>scriptless</body-content>
<attribute>
<name>tiems</name>
<required>true</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
<attribute>
<name>var</name>
<required>true</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
</tag>
<tag>
<name>time</name>
<tag-class>tag1.PrintUpperTag</tag-class>
<body-content>scriptless</body-content>
<attribute>
<name>time</name>
<required>true</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
</tag>
<tag>
<name>getJspFragment</name>
<tag-class>tag1.testgetJspFragment</tag-class>
<body-content>scriptless</body-content>
</tag>
<tag>
<name>file</name>
<tag-class>tag1.FileTag</tag-class>
<body-content>empty</body-content>
<attribute>
<name>src</name>
<required>true</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
</tag>
<tag>
<name>max</name>
<tag-class>tag1.lainxi1</tag-class>
<body-content>empty</body-content>
<attribute>
<name>num1</name>
<required>true</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
<attribute>
<name>num2</name>
<required>true</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
</tag>
<tag>
<!-- 标签的名字 在JSP页面上使用标签时的名字 -->
<name>hello</name>
<!-- 标签所在的全类名 -->
<tag-class>tag1.HelloSimpleTag</tag-class>
<!-- 标签体 的类型 -->
<body-content>empty</body-content>
<!-- 描述当前标签的属性 -->
<attribute>
<!-- 属性名字 -->
<name>value</name>
<!-- 该属性是否被必须写 -->
<required>true</required>
<!-- rtexprvalue:runtime expression value 当前属性是否可以接受运行时表达式的动态值 -->
<rtexprvalue>true</rtexprvalue>
</attribute>
<attribute>
<!-- 属性名字 -->
<name>count</name>
<!-- 该属性是否被必须写 -->
<required>true</required>
<!-- rtexprvalue:runtime expression value 当前属性是否可以接受运行时表达式的动态值 -->
<rtexprvalue>false</rtexprvalue>
</attribute>
</tag>
<!-- EL自定义表达式 -->
<function>
<name>concat</name>
<function-class>tag1.ELfunction</function-class>
<!-- 指定java类中的静态方法签名 必须声明方法的返回值类型及各个参数的类型 各个参数之间用逗号隔开 -->
<function-signature>java.lang.String show(java.lang.String, java.lang.String)</function-signature>
</function>
<function>
<name>concat1</name>
<function-class>全类名</function-class>
<function-signature>类型 方法名(参数1,参数2)</function-signature>
</function>
</taglib>