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"%>




EL表达式简介


	<%
		request.setAttribute("userName", "root");
	%>
	
	JSP表达式输出userName:<%= request.getAttribute("userName") %>
JSP表达式输出password:<%= request.getAttribute("password") %>
EL表达式输出userName:${userName }
EL表达式输出password:${password }

 

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

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


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

访问浏览器结果: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 friends;
	private Map 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 getFriends() {
		System.out.println("Person类的getFriends方法");
		return friends;
	}

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

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

	public void setMap(Map map) {
		this.map = map;
	}

	@Override
	public String toString() {
		return "Person类的toString方法";
	}
	
}

	<%
		String[] hobbies = {"打篮球","下棋"};
		
		List friends = new ArrayList();
		friends.add("李四");
		friends.add("王五");
		
		Map 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 }
EL表达式输出name成员: ${person.name }
EL表达式输出hobbies数组的第一个元素: ${person.hobbies[0] }
EL表达式输出hobbies数组越界的元素: ${person.hobbies[10] }
EL表达式输出firends集合: ${person.friends }
EL表达式输出firends集合的第一个元素: ${person.friends[0] }
EL表达式输出map: ${person.map }
EL表达式输出map的第一个键对应的值: ${person.map.key1 }

浏览器访问结果:

JSP中的EL表达式_第1张图片

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

JSP中的EL表达式_第2张图片

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

三、EL的11个隐含对象

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

变量 类型 作用
pageContext PageContextImpl 它可以获取 jsp 中的九大隐含对象
pageScope Map 它可以获取 pageContext 域中的数据
requestScope Map 它可以获取 request 域中的数据
sessionScope Map 它可以获取 session 域中的数据
applicationScope Map 它可以获取 application 域( ServletContext)中的数据
param Map 它可以获取请求参数的值
paramValues Map  它也可以获取请求参数的值,获取多个值的时候使用。
header Map 它可以获取请求头的信息
headerValues Map 它可以获取请求头的信息,它可以获取多个值的情况
cookie Map 它可以获取当前请求的 Cookie 信息
initParam Map 它可以获取在 web.xml 中配置的上下文参数

1.pageContext的使用

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


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

浏览器访问结果如下:

JSP中的EL表达式_第3张图片

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

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


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

浏览器访问结果如下:

3.其他隐含对象的使用

获取请求参数


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

浏览器访问结果如下:

获取请求头信息


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

浏览器访问结果如下:
JSP中的EL表达式_第4张图片

获取Cookie信息


	1.获取 Cookie 的名称:${cookie.JSESSIONID.name } 
2.获取 Cookie 的值:${cookie.JSESSIONID.value }

浏览器访问结果如下:

获取web.xml中配置的值


    userName
	root

	获取全局配置userName 的值:${initParam.userName } 

访问结果为: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 的值。


	<%
		Map 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"] }
${pageScope.map["User-Agent"] }
${pageScope.map.Connection }

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

你可能感兴趣的:(Java,Web)