【el表达式】

【el表达式】
EL全名为Expression Language EL主要作用:
获取数据:
EL表达式主要用于替换JSP页面中的脚本表达式,以从各种类型的web域中检索java对象、获取数据。(某个web域中的对象,访问javabean的属性、访问list集合、访问map集合、访问数组)
执行运算:
利用EL表达式可以在JSP页面中执行一些基本的关系运算、逻辑运算和算术运算,以在JSP页面中完成一些简单的运算。${user==null}
获取web开发常用对象
EL表达式定义了一些隐式对象,web开发人员可以很轻松获得对web常用对象的引用,从而获得这些对象中的数据。
调用Java方法
EL表达式允许用户开发定义EL函数,已在JSP页面中通过EL表达式调用Java类的方法。


【获取数据】
使用EL表达式获取数据语法:"${标识符}"
EL表达式语句在执行时,会调用pageContext.findAttribute方法,使用标识符为关键字,分别从page、request、session、application四个域中查找相应对象,找到则返回相应对象,找不到则返回""(注意,不是null,而是空字符串)。

示例:${user}

基本用法如下:

  <body>
   <%
   		//分别在4个域对象中存储数据
   		pageContext.setAttribute("name1", "唐僧");
   		session.setAttribute("name2", "猪八戒");
   		application.setAttribute("name3", "孙悟空");
   		request.setAttribute("name4", "哆啦A梦");
   %>
   <pre>
   		name1=${name1}
   		name2=${name2}
   		name3${name3}
   		name4${name4}
   </pre>
   
   <h3>演示使用er表达式:支持对象的导航</h3>
   <%
   		User user=new User();
   		user.setUsername("哆啦A梦");
   		user.setAge(14);
   		
   		Friend f=new Friend();
   		f.setName("大雄");
   		
   		Cat[] ct=new Cat[2];
   		ct[0]=new Cat("胖虎","黑色");
   		ct[1]=new Cat("小夫","绿色");
   		f.setCats(ct);
   		user.setFriend(f);
   		session.setAttribute("user", user);
   %>
   <pre>
   //注意,这样的方式获取的值,相对应的属性必须提供get方法。
   	获取"哆啦A梦"的名字:${user.username}
   	或者这样获取:${user["username"]}
   	获取"年龄":${user["age"] }
   	获取哆啦A梦朋友的名字:${user.friend.name }
   	或者这样获取:${user["friend"]["name"] }
   	获取朋友的第一只猫:${user.friend.cats[0].name }
   	或者这样获取:${user["friend"]["cats"][0]["name"]}
   </pre>
   <h3>ER表达式对运算符的支持:</h3>
   <pre>
   	3+4=${3+4 }
   	5*9=${5*9 }
   	6/4=${6/4 }
   	5/3=${5/3 }
   	<% session.setAttribute("n", 10); %>
   	n+5=${n+5 }
   	n/10=${n/10 }
   	对一元运算符号的支持:${-n }
   	对比较运算符的支持:${n>10 }||${n==10 }||${n gt 9 }||${n eq 11 }
   	对逻辑运算符的支持:${n>5 && n<10 }||${n>5 || n<10 }
   	对善缘运算符的支持:${n>5?"真的":"假的" }
   	<% 
   		pageContext.setAttribute("gdy", null);
   		List<String> list=new ArrayList<String>();
   		list.add("aaaa");
   		list.add("bbbb");
   		list.add("cccc");
   		pageContext.setAttribute("list", list);
   	
   	%>
   	对empty(是否为null)运算符的支持:${empty gdy }||${not empty gdy  }
   	获取集合中的全部数据${list}
   	获取集合中的第一个数据${list[0]}
   </pre>
  </body>

【EL的11个隐式对象】(注意:容易和jsp的隐式对象混淆)

EL表达式表示类型备注对应的jsp内置对象
pageContextjavax.servlet.jsp.PageContext和jsp的内置对象完全一样pageContext
requestScopejava.util.Map<String,Object>代表者ServletRequest中的那个Map没有
pageScopejava.util.Map<String,Object>代表者PageContext中的那个Map没有
sessionScopejava.util.Map<String,Object>代表者HttpSession中的那个Map没有
applicationScopejava.util.Map<String,Object>代表者ServletContext中的那个Map没有
paramjava.util.Map<String,String>代表一个请求参数没有
paramValuesjava.util.Map<String,String[]>代表重命名的请求参数没有
headerjava.util.Map<String,String>代表一个请求消息头没有
headerValuesjava.util.Map<String,String[]>代表重命名的请求消息头没有
initParamjava.util.Map<String,String>代表web.xml中配置文件的全局参数没有
cookiejava.util.Map<String,Cookie>获取cookie值的key,是cookie的name,Value是cokie对象本身没有

param可以直接获取客户端传递过来的值。

例如:

  <body>
  	<!-- 使用pageContext对象获取工程路径 -->
    <form action="${pageContext.request.contextPath }/jsp/ER/JER03.jsp" >
    	姓名:<input type="text" name="username" />
    	<br>
    	<input type="submit" value="提交" />
    </form>
  </body>
JER03.jsp通过param获取传递过来的值代码为:

  <body>
  	<!-- 通过param。username自己获取request请求中传递过来的值 -->
  	preage获取姓名为:${param.username }
  </body>

paramValues可以获取请求参数中同名的数据

用法如下:

  <body>
  	<% request.setCharacterEncoding("UTF-8"); %>
  	<!-- 使用pageContext对象获取工程路径 -->
    <form action="${pageContext.request.contextPath }/jsp/ER/JER03.jsp" method="post" >
    	姓名:<input type="text" name="username" />
    	姓名2<input type="text" name="username" />
    	<br>
    	<input type="submit" value="提交" />
    </form>
  </body>
JER03.jsp中通过paramValues获取方法为:

  <body>
  <% request.setCharacterEncoding("UTF-8"); %>
  	<!-- 通过param。username自己获取request请求中传递过来的值 -->
  	preage获取姓名为:${param.username }||${param["username"] }
  	<br>
  	el表达式获取表单中同名控件的数据:${paramValues.username[0] }||${paramValues.username[1] }
  </body>

el内置对象header获取请求头中的数据Host:${header["Host"] }
el内置对象initParam获取web.xml中的全局配置name1:${initParam.name1 }
el内置对象cookie获取浏览器携带的cookie :${cookie }</br>
el内置对象cookie获取浏览器携带的cookie Jsessionid的key:${cookie.JSESSIONID.name }</br>
el内置对象cookie获取浏览器携带的cookie Jsessionid的value:${cookie.JSESSIONID.value }</br>

【EL表达式-----自定义函数】

自定义函数类代码为:

package com.gdy.jjsp;

public class JSELFunction {
	
	/**
	 * 将字符串转换为大写
	 * @param str
	 * @return
	 */
	public static String upper(String str){
		
		return str.toUpperCase();
	}

}

注意:要想在el表达式中使用自定义函数类中的方法,必须要满足一下几点
1.使用的方法在类函数中必须是静态方法。
2.必须使用后缀为.tld的文件中定义函数,在引用该函数的jsp页面中使用<%@ taglib uri="在tld文件中定义的地址" prefix="名字可以自己定义" %>引入在tld文件中定义的规范。
3.tld文件(即:标签库的描述文件)必须在WEB-INF文件夹里面。但不能在WEB-INF/lib文件夹里面。

在.tld文件引入上面自定义类的代码为:

<?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>描述,注释</description>
  <display-name>gdfunn</display-name>
  <!--  标签库的版面     -->
  <tlib-version>1.1</tlib-version>
  <!-- 标签库的名称,推荐名称   -->
  <short-name>gdyfun</short-name>
  <!-- 命名空间名称(可以自定义) -->
  <uri>com.gdy.function</uri>
  <function>
	<!--  name表示页面上函数的名字    -->
    <name>upper</name>
    <!-- function-class定义包名加类名。引用那个内的那个方法 -->
    <function-class>com.gdy.jjsp.JSELFunction</function-class>
    <!-- 返回参数和调用方法里面的数据类型都必须用包名和类名全些 -->
    <function-signature>java.lang.String upper(java.lang.String)</function-signature>
  </function>
  
</taglib>
在页面中引入在tld文件中定义的类的代码为:

<!-- uri为在fn.tld文件中定义的uri prefix可以自己命名,重新命名函数名 -->
<%@ taglib uri="com.gdy.function" prefix="fun" %>

在jsp页面中调用的代码为:

  <body>
    <h3>EL表达式自定义函数${fun:upper("abcD") }</h3>
  </body>

整个jsp页面源码为:

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<!-- uri为在fn.tld文件中定义的uri prefix可以自己命名,重新命名函数名 -->
<%@ taglib uri="com.gdy.function" prefix="fun" %>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <base href="<%=basePath%>">
    
    <title>EL表达式</title> 
	<meta http-equiv="pragma" content="no-cache">
	<meta http-equiv="cache-control" content="no-cache">
	<meta http-equiv="expires" content="0">    
	<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
	<meta http-equiv="description" content="This is my page">
  </head>
  
  <body>
    <h3>EL表达式自定义函数${fun:upper("abcD") }</h3>
  </body>
</html>

注意点:

1.在页面${fun:upper("abcD")}表达式中fun是由taglib引入tld的类时后面prefix字段的值决定的,名字可以在引入时自己随便修改。

2.在taglib引入表达式中uri=“com.gdy.function”的值是在tld文件中 <uri>com.gdy.function</uri>属性定义的,该属性的值可以自己随便定义。

3.在tld文件中
<!--  name表示页面上函数的名字    -->
    <name>upper</name>
    <!-- function-class定义包名加类名。引用那个内的那个方法 -->
    <function-class>com.gdy.jjsp.JSELFunction</function-class>
    <!-- 返回参数和调用方法里面的数据类型都必须用包名和类名全些 -->
    <function-signature>java.lang.String upper(java.lang.String)</function-signature>

代码中的<function-class>定义了需要在EL表达式中使用的自定义方法的类。而<function-signature>标签定义了该方法的出入参数和返回参数。注意的是入参和出参的类型必须要使用全路径。

在<name>方法中定义了jsp页面引用该方法后调用该方法时的调用名称。可以和自己定义的类方法名称不一致。但jsp引入方法是必须要使用<name>标签中定义的方法名调用。


由于EL表达式不支持字符串的任何运算,所以在EL表达式中使用自定义函数来解决

自定义标签简介
自定义标签主要用于移除Jsp页面中的java代码。
使用自定义标签移除jsp页面中的java代码,只需要完成以下两步骤
1.编写一个狮蝎Tag接口的java类型(标签接口处理器)。
2.编写标签库描述符(tld)文件,在tld文件中吧标签处理器进行描述。


【EL表达式-----自定义标签】
功能:使用自己定义的标签:
例如要实现使用自己定义的标签来打印出当前时间
自定义的标签为:<my:showTime />

注意:在定义自定义标签处理类,类必须要继承SimpleTag接口。或者继承实现了SimpleTag接口的类,当页面匹配到自定义标签后,会执行自定义处理类的toTag()方法。

自定义处理类代码为:

package com.gdy.jjsp;

import java.io.IOException;
import java.util.Date;

import javax.servlet.jsp.JspException;
import javax.servlet.jsp.JspWriter;
import javax.servlet.jsp.PageContext;
import javax.servlet.jsp.tagext.SimpleTagSupport;

/**
 * 演示自定义标签 打印当前时间
 * @author Administrator
 * 执行原理:
 * 	SimpleTag接口中的方法;
 * 	Void doTag();由服务器调用。在JSP中遇到标签时调用。
 * 	JspTag getParent();由程序员调用。获取该标签的父标签对象。没有返回null
 * 
 * 	以下三个方法的共同特点:由服务器调用,在调用doTag之前就调用完了。
 * 	void setJspBody(JspFragment jspBody):由服务器调用。传入标签的内容。
 *  void setJspContext(JspContext pc):由服务器调用。传入当前页面的pageContext对象
 *  void setParent(JspTag parert):由服务器调用。传入你的父类,没父类的传入null;
 *
 */
public class JERSimpleTag extends SimpleTagSupport{

	/**
	 * doTag()方法容器会自动调用
	 * 	当jsp文件解析遇见自定义标签后,找到对应的类,会自动调用doTage方法
	 * 	在执行doTage方法之前,jsp引擎先调用了getPageContext方法,所以在该对象中可以直接使用getJSPContext()方法
	 * 
	 */
	@Override
	public void doTag() throws JspException, IOException {
		//获取当前时间
		Date dt=new Date();
		//获取pageContext对象
		//在执行doTage方法之前,jsp引擎先调用了getPageContext方法,所以在该对象中可以直接使用getJSPContext()方法
		PageContext pagecontext=(PageContext)getJspContext();
		//获取输出流对象
		JspWriter out = pagecontext.getOut();
		//向页面输出
		out.write(dt.toLocaleString());
	}
}


后缀为tld文件的定义关联方法为:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE taglib
  PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.2//EN"
  "http://java.sun.com/dtd/web-jsptaglibrary_1_2.dtd">
<taglib>
  <!-- tlid的版本号 -->
  <tlib-version>1.0</tlib-version>
  <!-- jsp的版本号  -->
  <jsp-version>1.2</jsp-version>
  <!-- 推荐名称 -->
  <short-name>mygettime</short-name>
  <!-- 定义uri 页面引用唯一标示 -->
  <uri>com.gdy.gettime</uri>

  <tag>
  	<!-- 页面上自定义标签的名字 -->
    <name>showTime</name>
    <!-- 对应到后台的那个class -->
    <tag-class>com.gdy.jjsp.JERSimpleTag</tag-class>
    <!-- 主体内容 (即页面自己定义的标签之间的内容)
    	 注意:body-content:的取值内容
				JSP:不要考虑。(给传统标签处理类用的)
				empty:传统和简单标签都能用的。开始标签和结束标签没有主体内容时用。
				scriptless:给简单标签用的。开始标签和结束标签有主体内容时用。但是内容不能有<%
				tagdependent:给简单标签用的。告诉标签处理类,主体内容是普通的文本 
    -->
    <body-content>empty</body-content>
    <!--  定义标签属性
		    <attribute>
		        <name>var</name>
		        <required>false</required>
		        <rtexprvalue>false</rtexprvalue>
		    </attribute>
      -->
  </tag>
 </taglib>


页面jsp引入代码为:

<!-- 引入自定义标签类   -->
<%@ taglib uri="com.gdy.gettime" prefix="my" %>

jsp页面全部代码为:

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<!-- uri为在fn.tld文件中定义的uri prefix可以自己命名,重新命名函数名 -->
<%@ taglib uri="com.gdy.function" prefix="fun" %>
<!-- 引入sun公司提供的自定义类  -->
<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="gdy" %>
<!-- 引入自定义标签类   -->
<%@ taglib uri="com.gdy.gettime" prefix="my" %>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <base href="<%=basePath%>">
    
    <title>EL表达式</title> 
	<meta http-equiv="pragma" content="no-cache">
	<meta http-equiv="cache-control" content="no-cache">
	<meta http-equiv="expires" content="0">    
	<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
	<meta http-equiv="description" content="This is my page">
  </head>
  
  <body>
    <h3>EL表达式自定义函数${fun:upper("abcD") }</h3></br>
    <h3>${gdy:toUpperCase("aaaaa") }</h3><br/>
    <hr>
    <h3>El表达式之自定义标签</h3>
	<!-- 使用自定义标签显示当前时间 -->
	    自定义标签:|<my:showTime />
  </body>
</html>

注意:tld文件的路径和自定义方法的tld文件路径存放规则一样。

自定义标签执行原理

SimpleTag接口中的方法:

void doTag():由服务器调用。在JSP中遇到标签时调用。

JspTaggetParent():由程序员调用。获取该标签的父标签对象。没有返回null


以下三个方法的共同特点:由服务器调用,在调用doTag之前就调完了。

voidsetJspBody(JspFragment jspBody):由服务器调用。传入标签的内容。

voidsetJspContext(JspContext pc):由服务器调用。传入当前页面的pageContext对象

voidsetParent(JspTag parent):由服务器调用。传入你的爹。没爹传入null


自定义标签的详细功能(基本功)

1.控制页面中某部分内容不显示 

2.控制结束标签后的JSP内容不执行 

3.控制主体内容重复执行:带属性的标签开发

4.获取标签主体内容,改变后再输出


示例1:控制页面中某部分内容不显示

类的后台代码为:

package com.gdy.jjsp;

import java.io.IOException;

import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.SimpleTagSupport;

/**
 * 自定义类,演示隐藏内容
 * @author Administrator
 *
 */
public class JERSimpleTag02 extends SimpleTagSupport {
	 @Override
	public void doTag() throws JspException, IOException {

	}
}
tld文件绑定方法为:

  <tag>
  	<name>Hide</name>
  	<tag-class>com.gdy.jjsp.JERSimpleTag02</tag-class>
  	<!-- 注意,这里值为tagdependent 也就是说这个标签有开始标签和结束标签。但内容只能是普通文本  -->
  	<body-content>tagdependent</body-content>
  </tag>

jsp页面引用和调用方法为:

<%@ taglib uri="com.gdy.gettime" prefix="my" %>

  <body>
    <h3>演示ER表达式 自定义标签隐藏内容</h3>
    	哈哈,隐藏内容在这<my:Hide>你看不到我</my:Hide>
  </body>
页面显示效果为:



示例2:控制结束标签后的JSP内容不执行
java类代码为:

package com.gdy.jjsp;

import java.io.IOException;

import javax.servlet.jsp.JspException;
import javax.servlet.jsp.SkipPageException;
import javax.servlet.jsp.tagext.JspFragment;
import javax.servlet.jsp.tagext.SimpleTagSupport;

/**
 * 控制结束标签后的内容不显示
 * @author Administrator
 *
 */
public class JERSimpleTag03 extends SimpleTagSupport {

	@Override 
	public void doTag() throws JspException, IOException {
		//拿到标签中的主题内容
		JspFragment body = getJspBody();
//		//第一种方法
//		//拿到pageContext对象
//		PageContext page=(PageContext)body.getJspContext();
//		//拿到输出流对象
//		JspWriter out=page.getOut();
//		//输出主体内容
//		body.invoke(out);
		
		//第二张方法
		body.invoke(null);
		//跑出自定义异常
		throw new SkipPageException();
	}
}

pld文件关联代码为:

   <tag>
  	<name>HideEnd</name>
  	<tag-class>com.gdy.jjsp.JERSimpleTag03</tag-class>
  	<!-- 注意,这里值为tagdependent 也就是说这个标签有开始标签和结束标签。但内容只能是普通文本  -->
  	<body-content>tagdependent</body-content>
  </tag>
jsp页面相关代码为:

<%@ taglib uri="com.gdy.gettime" prefix="my" %>
  <body>
    <h3>演示ER表达式 自定义标签隐藏内容</h3>
    	哈哈,隐藏内容在这<my:Hide>你看不到我</my:Hide>
    <hr>
    <h4>控制结束标签后的JSP内容不执行</h4>
    	结束标签后的内容不执行<my:HideEnd>【标签里面内容】</my:HideEnd>【标签后面内容】
  </body>
显示结果为:


页面查看源码为:



可以看到在</my:HideEnd>标签后面的内容都没有输出。


示例3 控制主题的部分内容重复执行

java类代码为:

package com.gdy.jjsp;

import java.io.IOException;

import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.SimpleTagSupport;

public class JERSimpleTag04 extends SimpleTagSupport {

	//定义属性,方便自动接收页面传递过来的值
	private int num;

	//必须提供set方法,这样系统才能自动接收值
	public void setNum(int num) {
		this.num = num;
	}

	@Override
	public void doTag() throws JspException, IOException {
		for(int i=0;i<this.num;i++){
			getJspBody().invoke(null);
		}
	}
}

tld文件配置信息为:

  <!-- 定义个自定义标签,循环输出标签里面的内容 -->
  <tag>
  	<name>HideCopy</name>
  	<tag-class>com.gdy.jjsp.JERSimpleTag04</tag-class>
  	<!-- 注意,这里值为scriptless 也就是说这个标签有开始标签和结束标签。主题内容不仅仅是简单的文本了  -->
  	<body-content>scriptless</body-content>
  	<!-- 定义属性,方便指定循环几次 -->
  	<attribute>
  		<!-- 属性名称, 必须和类定义的属性名称一样。注意类定义的属性必须是私有的,并提供set方法 -->
  		<name>num</name>
  		<!-- 属性值是否必须填写  -->
  		<required>true</required>
  		<!-- 表示属性的值是否支持EL表达式 -->
  		<rtexprvalue>true</rtexprvalue>
  	</attribute>
  </tag>
jsp页面调用代码为:

    <hr>
    <h4>控制标签的主体内容重复执行</h4>
    <my:HideCopy num="${'8'}" >我要循环---------</br></my:HideCopy>
    
    <hr>

显示结果为:



示例4:获取主体内容,改变后输出

java处理类代码为:

package com.gdy.jjsp;

import java.io.IOException;
import java.io.StringWriter;

import javax.security.auth.message.callback.PrivateKeyCallback.Request;
import javax.servlet.jsp.JspContext;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.JspFragment;
import javax.servlet.jsp.tagext.SimpleTagSupport;

/*
 * 演示控制标签的主体内容改变后输出
 */
public class JERSimpleTag05 extends SimpleTagSupport {

	@Override
	public void doTag() throws JspException, IOException {
		//获取主体内容
		JspFragment body = getJspBody();
		//我们先把数据写入到一个缓冲流中,然后从缓冲流中取出数据进行修改,修改的数据再写入缓冲流中
		//创建一个字符串输出缓冲流,可以从中获取数据
		StringWriter sw=new StringWriter();
		//将数据写入缓冲流中
		body.invoke(sw);
		//从缓冲流中拿到数据
		String str=sw.toString();
		//改变数据
		str=str.toUpperCase()+"我已经改变";
		//获取输出流对象输出到页面
		getJspContext().getOut().write(str);
		
	
	}
}

tld文件绑定内容为:

  <!-- 定义个自定义标签,修改主体内容 -->
  <tag>
  	<name>HideTH</name>
  	<tag-class>com.gdy.jjsp.JERSimpleTag05</tag-class>
  	<!-- 注意,这里值为scriptless 也就是说这个标签有开始标签和结束标签。主题内容不仅仅是简单的文本了  -->
  	<body-content>tagdependent</body-content>
  </tag>

jsp页面代码为:

<%@ taglib uri="com.gdy.gettime" prefix="my" %>

    <h4>获取标签的主体内容,改变后再输出</h4>
    	获取标签的主体内容改变后再输出:<my:HideTH>我是主体内容aaabbbccc</my:HideTH>
web显示结果为:


示例5:模拟实现if else功能标签

jsp页面代码为:


<%@ taglib uri="com.gdy.gettime" prefix="my" %>

  <body>
   <h5>控制标签的主体内容是否输出(if else 语句功能)</h5>
   <my:choose>
   		<my:when test="${5>3}">真的</my:when>
   		<my:otherwise>假的</my:otherwise>
   </my:choose>
   <br />
      <my:choose>
   		<my:when test="${5<3}">真的</my:when>
   		<my:otherwise>假的</my:otherwise>
   </my:choose>

  </body>

tld关联代码为:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE taglib
  PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.2//EN"
  "http://java.sun.com/dtd/web-jsptaglibrary_1_2.dtd">
<taglib>
  <!-- tlid的版本号 -->
  <tlib-version>1.0</tlib-version>
  <!-- jsp的版本号  -->
  <jsp-version>1.2</jsp-version>
  <!-- 推荐名称 -->
  <short-name>mygettime</short-name>
  <!-- 定义uri 页面引用唯一标示 -->
  <uri>com.gdy.gettime</uri>
  
    <!-- 定义3-1个自定义标签,实现if else功能 -->
  <tag>
  	<name>choose</name>
  	<tag-class>com.gdy.jjsp.JERChoose</tag-class>
  	<body-content>scriptless</body-content>
  </tag>
  
     <!-- 定义3-2个自定义标签,实现if else功能 -->
  <tag>
  	<name>when</name>
  	<tag-class>com.gdy.jjsp.JERWhen</tag-class>
  	<body-content>scriptless</body-content>
  	<attribute>
  		<name>test</name>
  		<required>true</required>
  		<rtexprvalue>true</rtexprvalue>
  	</attribute>
  </tag>
  
       <!-- 定义3-3个自定义标签,实现if else功能 -->
  <tag>
  	<name>otherwise</name>
  	<tag-class>com.gdy.jjsp.JEROtherwise</tag-class>
  	<body-content>scriptless</body-content>
  </tag>
  
 </taglib>
com.gdy.jjsp.JERChoose内代码为:

package com.gdy.jjsp;

import java.io.IOException;

import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.SimpleTagSupport;

/**
 * 模拟执行if else功能
 * @author Administrator
 *
 */
public class JERChoose  extends SimpleTagSupport{
	
	private boolean flag=true;//通过该变量控制是否执行else部分
	
	public boolean isFlag() {
		return flag;
	}

	public void setFlag(boolean flag) {
		this.flag = flag;
	}

	@Override
	public void doTag() throws JspException, IOException {
		getJspBody().invoke(null);
	}
}
com.gdy.jjsp.JERWhen类代码为:

package com.gdy.jjsp;

import java.io.IOException;

import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.SimpleTagSupport;

public class JERWhen extends SimpleTagSupport{
	
	private boolean test;
	
	public void setTest(boolean test){
		this.test=test;
	}
	
	@Override
	public void doTag() throws JspException, IOException {
		if(test){
			//条件为真:执行主体内容 ,修改父标签中的变量的值
			getJspBody().invoke(null);
			//获取父标签
			JERChoose choose=(JERChoose)getParent();
			//修改父标签中的值
			choose.setFlag(false);
		}
		
	}

}
com.gdy.jjsp.JEROtherwise类代码为:

package com.gdy.jjsp;

import java.io.IOException;

import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.SimpleTagSupport;

public class JEROtherwise extends SimpleTagSupport {

	@Override
	public void doTag() throws JspException, IOException {
		//获取父标签
		JERChoose choose=(JERChoose)getParent();
		if(choose.isFlag()){
			getJspBody().invoke(null);
		}
	}
}

页面显示结果为:























  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值