JSP技术的重要功能是用于在浏览器的页面显示数据,那么从某地取出数据就变得十分重要了,于是就诞生了EL表达式。EL表达式的目的就是:取得数据,将其显示在浏览器的页面上!
Table of Contents
什么是EL表达式
什么是EL表达式:
- Express Lanuage
- 是为了简化咱们的JSP代码,具体一点就是为了简化在JSP里面写的那些Java代码。
- 使开发者尽可能少的在JSP里编写Java代码;
EL表达式的核心功能:
- 从四个域对象中取出数据;
- 计算输出表达式的值
写法格式:${表达式 }
- 如果从作用域中取值,会先从小的作用域开始取,如果没有,就往下一个作用域取。
- 一直把四个作用域取完都没有,就没有显示。
尽管在JSP中,也有相应的写法可以取得并输出域对象中的数据,但是其过于冗余和复杂,所以使用EL表达式来使得这种对数据的取得和输出变得容易!
从域中取出数据:
Servlet代码:request.getAttribute(“name”);
JSP脚本:<%=request.getAttribute(“name”)%>
EL表达式替代上面的脚本:${requestScope.name};
第一个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>
<% //在JSP中写Java代码(在实际开发中要尽量避免)
pageContext.setAttribute("name","kyle"); //向域对象"page"中放一个键值对:key=name, value=kyle
pageContext.setAttribute("age", 23); //向域对象"page"中放一个键值对:key=age,value=23
%>
<h3> 使用EL表达式从page域对象中取出值: </h3> <br/>
name: ${pageScope.name } <br/>
age: ${pageScope.age } <br/>
</body>
</html>
执行结果:
取值操作
EL表达式的主要目的就是获得数据并输出,而在Web的回话中,存放数据有四个地方(即四个域对象):page、request、session、application。
EL最主要的作用是获得四大域中的数据,格式${EL表达式}
- EL获得pageContext域中的值:${ pageScope.name } 获取该域中键为“name”的值
- EL获得request域中的值:${requestScope.name }
- EL获得session域中的值:${sessionScope.name }
- EL获得application域中的值:${ applicationScope.name }
- EL从四个域中获得某个值${name}
取出4个域对象中存放的值
特性:
- 从域中取值,得先存值。
- 如果没有指定内置对象,先从page里面找,没有去request找,去session,去application。
取出4个作用域中存放的值
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<%
pageContext.setAttribute("name", "page");
request.setAttribute("name", "request");
session.setAttribute("name", "session");
application.setAttribute("name", "application");
%>
按普通手段取值<br>
<%= pageContext.getAttribute("name")%>
<%= request.getAttribute("name")%>
<%= session.getAttribute("name")%>
<%= application.getAttribute("name")%>
<br>使用EL表达式取出作用域中的值
<br>
${ pageScope.name }
${ requestScope.name }
${ sessionScope.name }
${ applicationScope.name }
</body>
</html>
- 获取请求中的某个参数:param;使用示例:“${param.请求名}”
- 获取请求中的某个参数名的参数值:paramValues;使用示例:“${paramValues.请求名}”
- 获取请求中的请求头:header;使用示例:“${header.请求头名}”
- 获取请求中的请求头中的值:headerValues
- 获取Cookie:${cookie.Cookie的名字}
- 获取initParams变量:${initParams.名}
- 获取pageContext变量:${pageContext.名}
<!-- File Name: hello.jsp -->
<%@ page language="java" import="java.util.Enumeration" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>EL表达式</title>
</head>
<body>
获取某个参数的请求名:${param.请求名 }
获取该个请求名对应的值:${paramValue.请求名 }
<!--
等价于Servlet或JSP中的:
request.getParameter(请求名);
request.getParameterValues(请求名);
-->
</body>
</html>
取出域中所存的数组
取出域中所存的数组
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<%
String[] a = { "aa", "bb", "cc", "dd" };
pageContext.setAttribute("array", a);
%>
使用EL表达式取出作用域中数组的值<br>
${array[0] }, ${array[1] }, ${array[2] }, ${array[3] }
</body>
</html>
取出域中所存的集合
取出域中所存的集合
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@page import="java.util.ArrayList"%>
<%@page import="java.util.List"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<%
List list = new ArrayList();
list.add("11");
list.add("22");
list.add("33");
list.add("44");
//pageContext.setAttribute("li", list);
session.setAttribute("li", list);
%>
使用EL表达式取出作用域中集合的值<br>
${li[0] } , ${li[1] },${li[2] },${li[7] }
</body>
</html>
取出域中Map集合的值
取出域中Map集合的值
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@page import="java.util.Map"%>
<%@page import="java.util.HashMap"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<%
Map map = new HashMap();
map.put("name", "zhangsna");
map.put("age",18);
map.put("address","北京..");
map.put("address.aa","深圳..");
//pageContext.setAttribute("map", map);
application.setAttribute("m", map);
%>
使用EL表达式取出作用域中Map的值
<br>
${applicationScope.m.name }, ${m.age }, ${m.address }, ${m["address.aa"] }
</body>
</html>
输出对象的值
EL实现输出对象的值
Student类文件:
package kyle;
public class Student {
private String name1;
private int age;
public String getName() {
return name1;
}
public void setName(String name) {
this.name1 = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public Student(String name, int age) {
super();
this.name1 = name;
this.age = age;
}
public Student() {
super();
}
}
JSP文件:
<%@ page language="java" import="java.util.*,kyle.*"
pageEncoding="utf-8"%>
<!DOCTYPE html>
<html>
<head>
<title>从四个域中获取数据</title>
</head>
<body>
<%
//准备对象
Student student = new Student("eric",20);
//放入域中
pageContext.setAttribute("student1",student); //保持参数的两个名字一致;
%>
<%--使用EL获取对象 --%>
${student1.name} - ${student1.age }
${student1 } //输出的是该类的toString()方法;
<%--
${student1.name} 等价于(点意味着调用getXX()方法,而不是调用该类的属性;故要在Student类里面要对name实现getXx方法)
<%=((Student)pageContext.findAttribute("student1")).getName()%>
--%>
</body>
</html>
表达式的计算
EL表达式计算
<%@ page language="java" import="java.util.*,kyle.*"
pageEncoding="utf-8"%>
<!DOCTYPE html>
<html>
<head>
<title>EL表达式获取List的值</title>
</head>
<body>
<%--1)算术表达式 + - * / --%>
${10+5 }<br/>
${10*5 }<hr/>
<%-- 2)比较运算 > < >= <= == != --%>
${10>5 }<br/>
${10<5 }<br/>
${10!=10 }<hr/>
<%-- 3)逻辑运算 && || ! --%>
${true && false }<br/>
${true || false }<br/>
${!false }<br/>
<%--4)判空 null 或 空字符串: empty --%>
<%
//String name = "eric";
//String name = null;
String name = ""; //空字符串
pageContext.setAttribute("name",name);
%>
判断null: ${name==null }<br/>
判断空字符: ${name=="" }<br/>
判空:${name==null || name=="" } //判断是否为空 或者 是否为null;
另一种判空写法: ${empty name } //等价于上一种写法
</body>
</html>