JSP中的EL表达式

目录

一、EL表达式简介

二、EL表达式获取数据

1.EL 表达式搜索域数据的顺序

2.EL表达式获取JavaBean的数据

2.1 JavaBean规范

2.2 获取JavaBean中不同类型的数据

三、EL的11个隐含对象

1.pageContext的使用

2.获取四个特定域中的属性

3.其他隐含对象的使用

四、EL中的运算符

1.关系运算

2.逻辑运算

3.算数运算

4.empty运算

5.三元运算符

6."."点运算和[]中括号运算符


一、EL表达式简介

  1. EL 表达式的全称:Expression Language。是表达式语言。
  2. EL 表达式的作用:EL 表达式主要是代替 jsp 页面中的表达式脚本在 jsp 页面中进行数据的输出。因为 EL 表达式在输出数据的时候,要比 jsp 的表达式脚本要简洁很多。
  3. EL表达式的语法格式:${表达式}。EL 表达式在输出 null 值的时候,输出的是空串。jsp 表达式脚本输出 null 值的时候,输出的是 null 字符串。

二、EL表达式获取数据

示例:

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>EL表达式简介</title>
</head>
<body>
	<%
		request.setAttribute("userName", "root");
	%>
	
	JSP表达式输出userName:<%= request.getAttribute("userName") %><br />	
	JSP表达式输出password:<%= request.getAttribute("password") %><br />
	EL表达式输出userName:${userName }<br /> 
	EL表达式输出password:${password }<br />
</body>
</html>

 

1.EL 表达式搜索域数据的顺序

EL 表达式主要是在 jsp 页面中输出数据。主要是输出域对象中的数据。当四个域中都有相同的 key 的数据的时候,EL 表达式会按照四个域的从小到大的顺序去进行搜索,找到就输出。如下:

<body>
	<%
		pageContext.setAttribute("key", "pageContextValue");
		request.setAttribute("key", "requestValue");
		session.setAttribute("key", "sessionValue");
		application.setAttribute("key", "applicationValue");
	%>
	EL表达式输出数据:${key }<br />
</body>

访问浏览器结果:EL表达式输出数据:pageContextValue

2.EL表达式获取JavaBean的数据

2.1 JavaBean规范

  1. JavaBean 类必须是一个公共类,并将其访问属性设置为 public。
  2. JavaBean 类必须有一个空的构造函数:类中必须有一个不带参数的公用构造器,此构造器也应该通过调用各个特性的设置方法来设置特性的缺省值。
  3. 一个JavaBean类不应有公共实例变量,类变量都为private。
  4. 持有值应该通过一组存取方法(getXxx 和 setXxx)来访问:对于每个特性,应该有一个带匹配公用 getter 和 setter 方法的专用实例变量。若是布尔值,可以用isXxx来代替getXxx。
  5. 成员变量的第二个字母最好不要大写, 像rCategory, hFilename之类,生成getter 和setter会有问题。

2.2 获取JavaBean中不同类型的数据

public class Person {
	private String name;
	private String[] hobbies;
	private List<String> friends;
	private Map<String, String> map;

	public String getName() {
		System.out.println("Person类的getName方法");
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public String[] getHobbies() {
		System.out.println("Person类的getHobbies方法");
		return hobbies;
	}

	public void setHobbies(String[] hobbies) {
		this.hobbies = hobbies;
	}

	public List<String> getFriends() {
		System.out.println("Person类的getFriends方法");
		return friends;
	}

	public void setFriends(List<String> friends) {
		this.friends = friends;
	}

	public Map<String, String> getMap() {
		System.out.println("Person类的getMap方法");
		return map;
	}

	public void setMap(Map<String, String> map) {
		this.map = map;
	}

	@Override
	public String toString() {
		return "Person类的toString方法";
	}
	
}
<body>
	<%
		String[] hobbies = {"打篮球","下棋"};
		
		List<String> friends = new ArrayList<String>();
		friends.add("李四");
		friends.add("王五");
		
		Map<String, String> hashMap = new HashMap<>();
		hashMap.put("key1", "value1");
		hashMap.put("key2", "value2");
	
		Person p = new Person();
		p.setName("张三");
		p.setHobbies(hobbies);
		p.setFriends(friends);
		p.setMap(hashMap);
		
		pageContext.setAttribute("person", p);
	%>
	
	EL表达式输出p对象: ${person }<br />
	EL表达式输出name成员: ${person.name }<br />
	EL表达式输出hobbies数组的第一个元素: ${person.hobbies[0] }<br />
    EL表达式输出hobbies数组越界的元素: ${person.hobbies[10] }<br />
	EL表达式输出firends集合: ${person.friends }<br />
	EL表达式输出firends集合的第一个元素: ${person.friends[0] }<br />
	EL表达式输出map: ${person.map }<br />
	EL表达式输出map的第一个键对应的值: ${person.map.key1 }<br />
</body>

浏览器访问结果:

由于在JavaBean中每个成员的getter方法中都往控制台输出了一句话,下面为控制台输出:

可以看到,EL表达式获取值其实是通过JavaBean的getter方法获取数据。 

三、EL的11个隐含对象

EL 个达式中 11 个隐含对象,是 EL 表达式中自己定义的,可以直接使用。如下:

变量类型作用
pageContextPageContextImpl它可以获取 jsp 中的九大隐含对象
pageScopeMap<String,Object>它可以获取 pageContext 域中的数据
requestScopeMap<String,Object>它可以获取 request 域中的数据
sessionScopeMap<String,Object>它可以获取 session 域中的数据
applicationScopeMap<String,Object>它可以获取 application 域( ServletContext)中的数据
paramMap<String,String>它可以获取请求参数的值
paramValuesMap<String,String[]> 它也可以获取请求参数的值,获取多个值的时候使用。
headerMap<String,String>它可以获取请求头的信息
headerValuesMap<String,String[]>它可以获取请求头的信息,它可以获取多个值的情况
cookieMap<String,Cookie>它可以获取当前请求的 Cookie 信息
initParamMap<String,String>它可以获取在 web.xml 中配置的<context-param>上下文参数

1.pageContext的使用

EL表达式中的pageContext可以获取JSP中的九个隐含对象,JSP中的几个对象的原型我们可以查看其转换后的Servlet类得知。比如JSP中的request对象就是HttpRequest对象,session就是HttpSession对象,所以我们可以调用其暴露出来的getter方法,而EL表达式只不过是以“.”的形式执行其getter方法。

<body>
	1.获取请求的协议: ${pageContext.request.scheme }<br />
	2.获取服务器IP: ${pageContext.request.serverName }<br />
	3.获取服务器端口: ${pageContext.request.serverPort }<br />
	4.获取工程路径: ${pageContext.request.contextPath }<br />
	5.获取请求方法: ${pageContext.request.method }<br />
	6.获取客户端 IP: ${pageContext.request.remoteHost }<br />
	7.获取会话ID: ${pageContext.session.id }<br />
</body>

浏览器访问结果如下:

2.获取四个特定域中的属性

如果不使用EL域对象那么其搜索域数据的顺序是由小到大的,EL提供4个域对象方便精准获取数据。

<body>
	<%
		pageContext.setAttribute("key", "pageContextValue");
		request.setAttribute("key", "requestValue");
		session.setAttribute("key", "sessionValue");
		application.setAttribute("key", "applicationValue");
	%>
	pageContext域中的数据: ${pageScope.key }<br />
	request域中的数据: ${requestScope.key }<br />
	session域中的数据: ${sessionScope.key }<br />
	application域中的数据: ${applicationScope.key }<br />
</body>

浏览器访问结果如下:

3.其他隐含对象的使用

获取请求参数

<body>
	<%--请求参数:?userName=123&hobby=c&hobby=java --%>
	1.获取请求参数userName的值:${param.userName }<br />
	2.获取请求参数userName的值:${paramValues.userName[0] }<br />
	
	3.获取请求参数hobby的值 : ${paramValues.hobby[0] }<br />
	4.获取请求参数hobby的值 : ${paramValues.hobby[1] }<br />
</body>

浏览器访问结果如下:

获取请求头信息

<body>
	1.输出请求头【User-Agent】的值:${header['User-Agent'] } <br />
	2.输出请求头【User-Agent】的值:${headerValues['User-Agent'][0] } <br />
	3.输出请求头【Accept-Language】的值:${header['Accept-Language'] } <br />
	4.输出请求头【Connection】的值:${header.Connection } <br />
	5.输出请求头【Host】的值:${header.Host } <br />
</body>

浏览器访问结果如下:

获取Cookie信息

<body>
	1.获取 Cookie 的名称:${cookie.JSESSIONID.name } <br />
	2.获取 Cookie 的值:${cookie.JSESSIONID.value } <br />
</body>

浏览器访问结果如下:

获取web.xml中配置的值

<context-param>
    <param-name>userName</param-name>
	<param-value>root</param-value>
</context-param>
<body>
	获取全局配置userName 的值:${initParam.userName } <br />
</body>

访问结果为:root

四、EL中的运算符

1.关系运算

关系运算符示例结果
== 或 eq${5 == 5} 或 ${5 eq 5}true
!= 或 ne${5 != 5} 或 ${5 ne 5}false
< 或 lt${2 < 8} 或 ${2 lt 8 }true
> 或 gt${2 > 8 } 或 ${2 gt 8 }false
<= 或 le${2 <= 2 } 或 ${2 le 2 }true
>= 或 ge${2 >= 6} 或 ${2 ge 6}false

2.逻辑运算

逻辑运算符示例结果
&& 或 and${12 < 20 && 2 > 1} 或 ${12 < 20 and 2 > 1}true
|| 或 or${12 == 12 || 1 > 6} 或 ${12 == 12 or 1 > 6}true
! 或 not${! true} 或 ${not true}false

3.算数运算

算数运算符示例结果
+${10 + 1}11
-${10 - 1}9
*${10 * 2}20
/ 或 div${10 / 2} 或 ${10 div 2}5
% 或 mod${11 % 10} 或 ${11 mod 10}1

4.empty运算

empty 运算可以判断一个数据是否为空,如果为空,则输出 true,不为空输出 false。

以下几种情况为空:

  1. 值为 null 值的时候,为空
  2. 值为空串的时候,为空
  3. 值是 Object 类型数组,长度为零的时候
  4. list 集合,元素个数为零
  5. map 集合,元素个数为零

5.三元运算符

表达式 1?表达式 2:表达式 3

如果表达式 1 的值为真,返回表达式 2 的值,如果表达式 1 的值为假,返回表达式 3 的值。

6."."点运算和[]中括号运算符

.点运算,可以输出 Bean 对象中某个属性的值。[]中括号运算,可以输出有序集合中某个元素的值。并且[]中括号运算,还可以输出 map 集合中 key 里含有特殊字符的 key 的值。

<body>
	<%
		Map<String, String> hashMap = new HashMap<>(); 
		hashMap.put("Accept-Language", "xxx");
		hashMap.put("User-Agent", "yyy");
		hashMap.put("Connection", "zzz");
		pageContext.setAttribute("map", hashMap);
	%>
	${pageScope.map["Accept-Language"] }<br />
	${pageScope.map["User-Agent"] }<br />
	${pageScope.map.Connection }<br />
</body>

最后需要注意的是:EL表达式目的是替代JSP脚本表达式可以使页面变得整洁,方便,避免<%= %>的出现。由于JSP中Java代码就是写在<%%>中的,这将导致不能与EL表达式一起使用,可以利用JSP中的各种标签替代Java代码,这样可以结合EL表达式。比如对于一些使用if判断的java代码可以使用JSP标签来代替<c:if>等。

  • 19
    点赞
  • 70
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值