什么是EL?
EL即Expression Language(表达式语言)
jsp的内置表达式语言,从jsp2.0开始可以直接使用
EL的功能
用来代替<%=..%>
EL的语法
${EL表达式}
1.获取四大作用域中的数据
基本用法
获取域中的数据: ${pageScope|requestScope|sessionScope|applicationScope.属性名}
${属性名}(常用) 等同于 pageContext.findAttribute("name") 如果查找不到返回""
在九大内置对象中有四个对象可以存储数据
从小到大排列:
1.pageContext:该对象中存储的数据只能在本页面中进行使用
2.request:该对象中存储的数据只能在请求转发跳转页面的时候共其他页面进行使用
3.session:该对象中存储的数据在不切换浏览器的情况下,可以任何共享
4.application:该对象中存储的数据在不停止服务器的情况下,可以任意共享
pageContext.setAttribute("a", "苹果");
request.setAttribute("b", "西瓜");
session.setAttribute("c", "脐橙");
application.setAttribute("d", "香蕉");
获取四大域数据方法一:
<!-- 方式一 -->
<%=pageContext.getAttribute("a") %><br>
<%=request.getAttribute("b") %><br>
<%=session.getAttribute("c") %><br>
<%=application.getAttribute("d") %><br>
<!-- 方式二 -->
<%=pageContext.getAttribute("a") %><br>
<%=pageContext.getAttribute("b", PageContext.REQUEST_SCOPE) %><br>
<%=pageContext.getAttribute("c", PageContext.SESSION_SCOPE) %><br>
<%=pageContext.getAttribute("d", PageContext.APPLICATION_SCOPE) %><br>
<!-- 方式三 -->
<!-- 快捷查找方法
该方法会通过四大作用域的从小到大的顺序挨个查找,直到找到了为止
-->
<%=pageContext.findAttribute("a") %><br><!-- 找了一次 -->
<%=pageContext.findAttribute("b") %><br><!-- 找了两次 -->
<%=pageContext.findAttribute("c") %><br><!-- 找了三次 -->
<%=pageContext.findAttribute("d") %><br><!-- 找了四次 -->
<!-- 方式四 -->
<!-- el表达式 -->
${a}<br><!-- 找了一次 -->
${b}<br><!-- 找了两次 -->
${c}<br><!-- 找了三次 -->
${d}<br><!-- 找了四次 -->
<%@ 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>
<!-- 在九大内置对象中有四个对象可以存储数据
从小到大排列:
1.pageContext:该对象中存储的数据只能在本页面中进行使用
2.request:该对象中存储的数据只能在请求转发跳转页面的时候共其他页面进行使用
3.session:该对象中存储的数据在不切换浏览器的情况下,可以任何共享
4.application:该对象中存储的数据在不停止服务器的情况下,可以任意共享
-->
<%
pageContext.setAttribute("a", "苹果");
request.setAttribute("b", "西瓜");
session.setAttribute("c", "脐橙");
application.setAttribute("d", "香蕉");
%>
<!-- 方式一 -->
<%=pageContext.getAttribute("a") %><br>
<%=request.getAttribute("b") %><br>
<%=session.getAttribute("c") %><br>
<%=application.getAttribute("d") %><br>
<br><br><br><br>
<!-- 方式二 -->
<%=pageContext.getAttribute("a") %><br>
<%=pageContext.getAttribute("b", PageContext.REQUEST_SCOPE) %><br>
<%=pageContext.getAttribute("c", PageContext.SESSION_SCOPE) %><br>
<%=pageContext.getAttribute("d", PageContext.APPLICATION_SCOPE) %><br>
<br><br><br><br>
<!-- 方式三 -->
<!-- 快捷查找方法
该方法会通过四大作用域的从小到大的顺序挨个查找,直到找到了为止
-->
<%=pageContext.findAttribute("a") %><br><!-- 找了一次 -->
<%=pageContext.findAttribute("b") %><br><!-- 找了两次 -->
<%=pageContext.findAttribute("c") %><br><!-- 找了三次 -->
<%=pageContext.findAttribute("d") %><br><!-- 找了四次 -->
<br><br><br><br>
<!-- 方式四 -->
<!-- el表达式 -->
${a}<br><!-- 找了一次 -->
${b}<br><!-- 找了两次 -->
${c}<br><!-- 找了三次 -->
${d}<br><!-- 找了四次 -->
</body>
</html>
从实体类取值
创建一个实体类:
package com.abc;
public class Dog {
private String name;//名字
private int age;//年龄
private String color;//颜色
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getColor() {
return color;
}
public void setColor(String color) {
this.color = color;
}
public Dog() {
super();
// TODO Auto-generated constructor stub
}
public Dog(String name, int age, String color) {
super();
this.name = name;
this.age = age;
this.color = color;
}
@Override
public String toString() {
return "Dog [name=" + name + ", age=" + age + ", color=" + color + "]";
}
}
创建一个jsp中,将数据保存至实体类,再将实体类存储至四大作用域中,学习el表达式获取数据:
<%@page import="com.abc.Dog"%>
<%@ 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>
<!-- 将多个数据封装在类中,将类存储在四大域中 -->
<%
Dog dog=new Dog("旺财",2,"红色");
request.setAttribute("d1", dog);
%>
<!-- 方式一 -->
<%
Dog d=(Dog)request.getAttribute("d1");
%>
名字:<%=d.getName() %><br>
年龄:<%=d.getAge() %><br>
颜色:<%=d.getColor() %><br>
<br><br><br><br>
<!-- el表达式获得对象中的数据 -->
<!-- el表达式获得数据的时候,指的是存储至四大域中的定义的名称 -->
名字:${d1.name}<br>
年龄:${d1.age }<br>
颜色:${d1.color}<br>
</body>
</html>
获取数组和集合中的数据:
<%@page import="com.abc.Dog"%>
<%@page import="java.util.HashMap"%>
<%@page import="java.util.Map"%>
<%@page import="java.util.Collections"%>
<%@page import="java.util.ArrayList"%>
<%@page import="java.util.List"%>
<%@page import="java.util.Arrays"%>
<%@ 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>
<%
int[] ages={20,18,22,25,27};
application.setAttribute("a1", ages);
List<String> oList=new ArrayList();
oList.add("黄色");
oList.add("红色");
oList.add("绿色");
oList.add("蓝色");
oList.add("白色");
session.setAttribute("ol", oList);
%>
<!-- 方法一 -->
<%
int[] ages1=(int[])application.getAttribute("a1");
List<String> oList1=(List<String>)session.getAttribute("ol");
%>
<%=Arrays.toString(ages1) %>
<!-- landam表达式 -->
<%-- <%=oList1.forEach(s->System.out.print(s)) %><br>
<%=oList1.forEach(System.out::println) %><br> --%>
<br>
<br>
<br>
<!-- 方法二 使用EL表达式获取数据-->
${a1[0]},${a1[1]},${a1[2]},${a1[3]},${a1[4]}<br>
${ol[0] },${ol[1] },${ol[2] },${ol[3] },${ol[4] }<br>
</body>
</html>
获取map中的数据以及混合使用的用法:
<%@page import="com.abc.Dog"%>
<%@page import="java.util.HashMap"%>
<%@page import="java.util.Map"%>
<%@page import="java.util.Collections"%>
<%@page import="java.util.ArrayList"%>
<%@page import="java.util.List"%>
<%@page import="java.util.Arrays"%>
<%@ 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>
<%
Map<String,String> oMap=new HashMap<>();
oMap.put("book1", "Java程序设计");
oMap.put("book2", "MySQL数据库教程");
oMap.put("book3", "Jsp网络编程");
pageContext.setAttribute("books", oMap);
Map<String,String> oMap1=new HashMap<>();
oMap1.put("dog1", "藏獒");
oMap1.put("dog2", "哈士奇");
oMap1.put("dog3", "拉布拉多");
List<Map<String,String>> oList2=new ArrayList<>();
oList2.add(oMap);
oList2.add(oMap1);
application.setAttribute("o", oList2);
List<Dog> oDogs=new ArrayList<>();
oDogs.add(new Dog("小黄",2,"白色"));
oDogs.add(new Dog("大白",1,"黄色"));
oDogs.add(new Dog("大明星",4,"棕色"));
session.setAttribute("g", oDogs);
%>
${books.book1 },${books["book2"] },${books.book3 }<br>
<!-- 获取出第二只狗的名字 -->
${o[1].dog2}<br>
<!-- 取出第三只狗的名字 -->
${g[2].name }
</body>
</html>
这里就练习到这里,初学者需要掌握各种集合,实体类,数组之间的混合存储数据的EL表达式的获取数据的方式,进行灵活运用。
2.执行运算
1.算术运算符
(1)+ - * /
(2)%和mod:%(或与之等同的mod)运算符用来计算模数(余数)。
<!-- el表达式使用算术运算符 -->
求余数:${3 mod 2 }
<br><br>
<%
request.setAttribute("age", 23);
%>
减法:${age - 5}
<br><br>
2.关系运算符
<!-- el表达式使用比较运算符 -->
<!-- 年龄/5大于5 -->
${age/5 gt 5 }
<br><br>
3.逻辑运算符
<!-- el表达式使用逻辑运算符 -->
<!-- 年龄%6>5 && 年龄/4+1<6 -->
${age%6>5 && age/4+1<6}
<br><br>
4.空运算符
- empty
- 如果这个运算符的参数为null,空字符串,空数组,空Map或空集合,则返回true,否则返回false。
<!-- 空运算符 -->
<% int[] nums=null;
application.setAttribute("n", nums);
%>
<!-- 判断某一个数据是否是空值 -->
${empty(n) }
5.三元运算符
<!-- 三元运算符 -->
<!-- 判断年龄-5是否大于18,如果大于显示成年,否则未成年 -->
${age-5>=18?"成年人":"未成年" }
6.EL运算例子
3.获取常见的web对象
当四大作用域中出现存储的不同的数据却具有相同的名称时,el表达式查找数据会优先查找pageContext,那么这样会导致我们项目中获取不到我们想要的数据,这时就需要使用以上表格中的参数:
<%@ page language="java" isELIgnored="false" 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("a", "苹果");
request.setAttribute("a", "西瓜");
session.setAttribute("a", "脐橙");
application.setAttribute("a", "香蕉");
%>
<!-- 如果四大作用域中存储数据出现相同的名称,
而使用EL表达式没办法区分的时候,需要使用以下方式来获得对应的数据 -->
${pageScope.a}<br>
${requestScope.a}<br>
${sessionScope.a}<br>
${applicationScope.a}<br>
</body>
</html>
服务端在获取表单提交的数据时,按照我们前面所学的知识,只能通过request对象获取表单提交的数据,或者使用jsp动作获取,但相比之下代码量还是太多,那么el表达式能更简洁的代码获得表单提交的数据:
studentRegister.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>学生信息注册页面</title>
</head>
<body>
<div align="center">
<form action="five.jsp" method="post">
<!-- 每一个文本框定义的name属性的名称一定要
和Student实体类的全局变量名称一致 -->
<!-- 映射关系 -->
学号:<input type="text" name="id"><br/>
姓名:<input type="text" name="name"><br/>
年龄:<input type="text" name="age"><br/>
性别:<input type="text" name="sex"><br/>
手机号:<input type="text" name="phone"><br/>
家庭地址:<input type="text" name="addr"><br/>
兴趣爱好:<input type="checkbox" name="hobby" value="吃饭">吃饭
<input type="checkbox" name="hobby" value="睡觉">睡觉
<input type="checkbox" name="hobby" value="打豆豆">打豆豆
<input type="checkbox" name="hobby" value="赚钱">赚钱
<input type="submit" value="注册">
</form>
</div>
</body>
</html>
five.jsp
<%@ page language="java" isELIgnored="false" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<% request.setCharacterEncoding("UTF-8"); %>
学号:${param.id }<br>
姓名:${param.name }<br>
性别:${param.sex }<br>
年龄:${param.age }<br>
手机号:${param.phone }<br>
家庭地址:${param.addr }<br>
<!-- String[] s={"吃饭","睡觉","打豆豆","赚钱"} map.put("paramValus",s);-->
兴趣爱好:${paramValues.hobby[0] },${paramValues.hobby[1] },
${paramValues.hobby[2] },${paramValues.hobby[3] }
<br> <br> <br>
${initParam.mmm }
</body>
</html>
以及获得表单提交的多选按钮的参数数据,对应于同一个参数名称不同的数据值。
最后操作一个使用el表达式获得定义在web.xml文件中的<context-param>标签中的共享静态数据中的数据。
本章内容到这里结束!!!