您的位置:首页 > 其它

【el表达式】

2016-04-30 14:34 253 查看
【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);
}
}
}


页面显示结果为:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: