JSP Fragment类 (标签体) EL

仿写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>

猜你喜欢

转载自blog.csdn.net/qq_42676998/article/details/82793449