版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_34928644/article/details/82587994
EL表达式简介
- EL 全名为Expression Language。EL主要作用:
- 获取数据:
•EL表达式主要用于替换JSP页面中的脚本表达式,以从各种类型的java对象中获取数据。
- 执行运算:
•利用EL表达式可以在JSP页面中执行一些基本的关系运算、逻辑运算和算术运算,以在JSP页面中完成一些简单的逻辑运算。
- 获取web开发常用对象
•EL 表达式定义了一些隐式对象,利用这些隐式对象,web开发人员可以很轻松获得对web常用对象的引用,从而获得这些对象中的数据。
- 调用Java方法
•EL表达式允许用户开发自定义EL函数,以在JSP页面中通过EL表达式调用Java类的方法。
获取数据
- 使用EL表达式获取数据语法:“${标识符}”
- EL表达式语句在执行时,会调用pageContext.findAttribute方法,用标识符为关键字,分别从page、request、session、application四个域中查找相应的对象,找到则返回相应对象,找不到则返回”” (注意,不是null,而是空字符串)。
- 示例:${user}
- EL表达式也可以很轻松获取JavaBean的属性,或获取数组、Collection、Map类型集合的数据,例如
•${user.address.city}
•${user.list[0]}:访问有序集合某个位置的元素
•${map.key} : 获得map集合中指定key的值
代码示例
<%@page import="java.util.List"%>
<%@page import="java.util.ArrayList"%>
<%@page import="java.util.HashMap"%>
<%@page import="cn.hncu.domain.User"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!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>EL表达式技术演示1: 读取属性值</title>
</head>
<body>
<h1>EL表达式技术演示1: 读取属性值</h1>
基本语法: ${varName} <br>
作用:依次从page、request、session、application四个容器中
读取varName属性,若小容器存在则输出,忽略后面的大容器。
若4个容器中都不存在该varName指定的属性,则输出空字符串:""<br>
其它语法1:${sessionScope.varName},从指定的容器中读取。<br>
其它语法2:${2*200+80},可以执行算术、逻辑运算<br>
<hr>
<!-- 1读取容器中的属性变量。PS:以后开发时都是在后台servlet把属性存入容器,这里为方便演示直接用java脚本代替 -->
<%
pageContext.setAttribute("nameP", "Jack_P");
request.setAttribute("nameR", "Jack_R");
session.setAttribute("nameS", "Jack_S");
application.setAttribute("nameA", "Jack_A");
%>
获取响应容器中的值:${nameP} ## ${nameR} ## ${nameS} ## ${nameA} <br>
${abc},不存在时输出空字符串""<br>
<hr>
<!-- 2读取javaBean中的信息-->
<%
User user = new User();
user.setName("Tom");
user.setPwd("1234");
user.setAge(23);
//注意,必须把对象放到容器中EL表达式才能获取到
pageContext.setAttribute("u", user);
%>
注意:EL读取数据时,是根据属性名去取的,而非变量名。<br>
${user}-->WA ## ${u}-->AC  ##  ${u.name} , ${u.age}<br>
<hr>
<!-- 3读取Map中的信息-->
<%
HashMap<String,Object> map = new HashMap<String,Object>();
map.put("name", "Alice");
map.put("age", 18);
map.put("user", user);
//再次强调,必须把对象 map 放到容器中,EL表达式才能获取到
//这次放的reqsuest容器中
request.setAttribute("map", map);
%>
${map.name} ## ${map.age} ## ${map.user.pwd}<br>
也可以这样,但是少用,注意:[]中必须要用 " 或者 ' 把属性名引起来:${map['name']} ## ${map["age"]} ## ${map["user"]["pwd"]}
<hr>
<!-- 4读取List中的信息-->
<%
List<Object> list = new ArrayList<Object>();
list.add("周末");
list.add(20);
list.add(user);
list.add(map);
session.setAttribute("list", list);
%>
${list}<br>
注意:[]中是表示序号,不是属性名,所以不需要用 引号 引起来*** ${list[0]} ## ${list[1]} ## ${list[2].name} ## ${list[3].user.pwd}
</body>
</html>
执行运算
语法:${运算表达式},EL表达式支持如下运算符:
- empty运算符:检查变量是否为null或“空”,很好用!!!
- 二元表达式:${user!=null?user.name : “”} ,很好用!!!
- [ ] 和 . 号运算符
代码示例
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!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>EL表达式技术演示2: 执行运算</title>
</head>
<body>
<h1>EL表达式技术演示2: 执行运算</h1>
1.算术运算:+ 、- 、* 、/ 、 % 等<br>
<%
pageContext.setAttribute("num", 10);
%>
num/2+20=${num/2+20}<br>
2.条件运算: == 、 != 、 > 、 < 、>= 、<= 和逻辑运算 && 、 || <br>
<%
pageContext.setAttribute("num", 10);
pageContext.setAttribute("name", "Tom");
%>
num == 10 :${num == 10} ## name != "Tom": ${name != "Tom"} ## age < 20 && name=="Tom": ${ num < 20 && name == "Tom"}
<br>
3.问号表达式。<br>
<%
pageContext.setAttribute("age", 18);
%>
age < 20 ? "young" : "old" --> ${ age < 20 ? "young" : "old" }
<br>
4.empty 运算符,判断一个属性是否为空.<br>
${empty addr } ## ${empty age } ## ${!empty pwd}
</body>
</html>
获得web开发常用对象
- EL表达式语言中定义了11个隐含对象,使用这些隐含对象可以很方便地获取web开发中的一些常见对象,并读取这些对象的数据。
- 语法:${隐式对象名称} :获得对象的引用
代码示例
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!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>EL表达式技术演示3: 使用它内部的11个隐藏对象:</title>
</head>
<body>
<h1>EL表达式技术演示3: 使用它内部的11个隐藏对象:</h1>
11个隐藏对象:<br>
  1个便于操作其它'jsp的隐藏对象'的对象:pageContext <br>
  4个相关容器:pageScope、requestScope、sessionScope、applicationScope <br>
  6个其它:param 、paramValues 、header 、headerValues 、cookie 、 initParam <br>
<hr>
pageContext:<br>
  项目路径:${pageContext.request.contextPath } <br>
  session的id: ${pageContext.session.id } <br>
<br>
4个相关容器:<br>
<%
pageContext.setAttribute("name", "Jack_P");
//request.setAttribute("name", "Jack_R");
session.setAttribute("name", "Jack_S");
application.setAttribute("name", "Jack_A");
%>
${pageScope.name } ## ${requestScope.name } ## ${sessionScope.name } ## ${applicationScope.name }
<br>
<br>
2个请求参数:param 和 paramValues <br>
区别:param是单值 ,paramValues是多值 <br>
<!-- http://127.0.0.1:8080/EL_Demo/jsps/elDemo3.jsp?name=jack&hobby=movie&hobby=game -->
${param} ## ${param.hobby} <br>
${paramValues} ## ${paramValues.hobby[1]}
<br>
<br>
2个请求头:header 和 headerValues <br>
${header} <br>
${headerValues} <br>
${header.cookie} <br>
<br>
1个 cookie <br>
${cookie.JSESSIONID.value }<br>
header.cookie与cookie区别:<br>
  header.cookie返回的是字符串,而cookie是一个容器。所以cookie可以精确都某个cookie的值,而header.cookie返回的是所有cookie的字符串
<br>
1个 initParam <br>
注意:要获取到initParam需要在web.xml中配置!!!而且获取的是application容器的初始化参数<br>
${initParam }
<div style=" height: 400px">
</div>
</body>
</html>
获取ininParam是辅助的web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" version="3.0">
<display-name>EL_Demo</display-name>
<!-- 初始化参数 -->
<context-param>
<param-name>charset</param-name>
<param-value>utf-8</param-value>
</context-param>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
</web-app>