EL表达式
jsp的核心语法:jsp表达式<%= %> 和jsp脚本<% %>
jsp开发原则:尽量在jsp页面中少写甚至布鞋java代码。使用EL表达式替换掉jsp表达式。
EL表达式作用:向浏览器输出域对象中的变量或表达式计算的结果。
语法:${域对象中的变量或表达式}
1.输出基本数据类型变量
1.1 从4个域对象中获取
${域对象中的变量 }
例如:
<body>
<%
String name1 = "变量中的数据";
pageContext.setAttribute("name2", "page域中的数据");
pageContext.setAttribute("name3", "request域中的数据",pageContext.REQUEST_SCOPE);
session.setAttribute("name4", "session域中的数据");
application.setAttribute("name5", "application域中的数据");
%>
<hr/>
jsp表达式:<%=pageContext.findAttribute("name1") %><br/>
jsp表达式:<%=pageContext.findAttribute("name2") %><br/>
jsp表达式:<%=pageContext.findAttribute("name3") %><br/>
jsp表达式:<%=pageContext.findAttribute("name4") %><br/>
jsp表达式:<%=pageContext.findAttribute("name5") %><br/>
<hr/>
EL表达式替换jsp表达式:${name1}<br/>
EL表达式替换jsp表达式:${name2}<br/>
EL表达式替换jsp表达式:${name3}<br/>
EL表达式替换jsp表达式:${name4}<br/>
EL表达式替换jsp表达式:${name5}<br/>
<hr/>
<%-- ${name3} 等价于
pageContext.findAttribute(name3);
自动在四个域中搜索数据, 查询顺序: page域 -> request域 -> session域- > context域(application域)
--%>
</body>
1.2指定域对象中获取
${域.变量}
域范围:pageScope/requestScope/sessionScope/applicationScope
例如:
<body>
<%
String name1 = "变量中的数据";
pageContext.setAttribute("name2", "page域中的数据");
pageContext.setAttribute("name3", "request域中的数据",pageContext.REQUEST_SCOPE);
session.setAttribute("name4", "session域中的数据");
application.setAttribute("name5", "application域中的数据");
%>
<hr/>
EL表达式指定域获取:${pageScope.name2 }<br/>
EL表达式指定域获取:${requestScope.name3 }<br/>
EL表达式指定域获取:${sessionScope.name4 }<br/>
EL表达式指定域获取:${applicationScope.name5 }<br/>
<hr/>
<%-- ${requestScope.name3 } 等价于
pageContext.getAttribute(name3, pageContext.REQUEST_SCOPE)
--%>
jsp表达式指定域获取:<%=pageContext.getAttribute("name2", pageContext.PAGE_SCOPE) %><br/>
jsp表达式指定域获取:<%=pageContext.getAttribute("name3", pageContext.REQUEST_SCOPE) %><br/>
jsp表达式指定域获取:<%=pageContext.getAttribute("name4", pageContext.SESSION_SCOPE) %><br/>
jsp表达式指定域获取:<%=pageContext.getAttribute("name5", pageContext.APPLICATION_SCOPE) %><br/>
</body>
整体Demo:
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"
session="true"
%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">
<title>My JSP 'el.jsp' starting page</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
<!--
<link rel="stylesheet" type="text/css" href="styles.css">
-->
</head>
<body>
<%
String name1 = "变量中的数据";
pageContext.setAttribute("name2", "page域中的数据");
pageContext.setAttribute("name3", "request域中的数据",pageContext.REQUEST_SCOPE);
session.setAttribute("name4", "session域中的数据");
application.setAttribute("name5", "application域中的数据");
%>
<hr/>
jsp表达式:<%=pageContext.findAttribute("name1") %><br/>
jsp表达式:<%=pageContext.findAttribute("name2") %><br/>
jsp表达式:<%=pageContext.findAttribute("name3") %><br/>
jsp表达式:<%=pageContext.findAttribute("name4") %><br/>
jsp表达式:<%=pageContext.findAttribute("name5") %><br/>
<hr/>
EL表达式替换jsp表达式:${name1}<br/>
EL表达式替换jsp表达式:${name2}<br/>
EL表达式替换jsp表达式:${name3}<br/>
EL表达式替换jsp表达式:${name4}<br/>
EL表达式替换jsp表达式:${name5}<br/>
<hr/>
<%-- ${name3} 等价于
pageContext.findAttribute(name3);
--%>
EL表达式指定域获取:${pageScope.name2 }<br/>
EL表达式指定域获取:${requestScope.name3 }<br/>
EL表达式指定域获取:${sessionScope.name4 }<br/>
EL表达式指定域获取:${applicationScope.name5 }<br/>
<hr/>
<%-- ${requestScope.name3 } 等价于
pageContext.findAttribute(name3);
--%>
jsp表达式指定域获取:<%=pageContext.getAttribute("name2", pageContext.PAGE_SCOPE) %><br/>
jsp表达式指定域获取:<%=pageContext.getAttribute("name3", pageContext.REQUEST_SCOPE) %><br/>
jsp表达式指定域获取:<%=pageContext.getAttribute("name4", pageContext.SESSION_SCOPE) %><br/>
jsp表达式指定域获取:<%=pageContext.getAttribute("name5", pageContext.APPLICATION_SCOPE) %><br/>
</body>
</html>
Student类:
package com.cn.entity;
public class Student {
private int id;
private String name1;//注意这里是name1
private char sex;
private int age;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {//注意这里是getName
return name1;
}
public void setName(String name) {
this.name1 = name;
}
public char getSex() {
return sex;
}
public void setSex(char sex) {
this.sex = sex;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public Student(int id, String name, char sex, int age) {
super();
this.id = id;
this.name1 = name;
this.sex = sex;
this.age = age;
}
}
效果:
2.输出对象的属性值
${对象.XXXX}
.XXXX相当于 .getXXXX()方法
注意:其中,XXXX为对象对应类中属性的get方法getXXXX()的XXXX的小写,而不是属性名。
否则会出现如下异常:
例如:
<%@ page
language="java"
import="java.util.*, com.cn.entity.Student"
pageEncoding="UTF-8"
%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">
<title>My JSP 'el2.jsp' starting page</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
<!--
<link rel="stylesheet" type="text/css" href="styles.css">
-->
</head>
<body>
<%
//保存对象数据
Student stu = new Student(001, "木丁西", '男', 24);
//放入域对象中
pageContext.setAttribute("stu", stu);
%>
<%-- 使用el表达式获取对象--%>
学生对象:${stu}<br/>
编号:${stu.id}<br/><%--注意这里的.id,并不是调用属性(Student类中,属性私有的private),而是调用get方法getId()--%>
姓名:${stu.name }<br/>
性别:${stu.sex }<br/>
年龄:${stu.age }<br/>
<hr/>
<h3>等价于:</h3>
学生对象:<%=(Student)pageContext.getAttribute("stu") %><br/>
编号:<%=((Student)pageContext.getAttribute("stu")).getId() %><br/>
编号:<%=((Student)pageContext.getAttribute("stu", pageContext.PAGE_SCOPE)).getId() %><br/>
编号:<%=((Student)pageContext.getAttribute("stu", pageContext.PAGE_SCOPE)).getName() %><br/>
姓名:<%=((Student)pageContext.getAttribute("stu")).getName() %><br/>
性别:<%=((Student)pageContext.getAttribute("stu")).getSex() %><br/>
年龄:<%=((Student)pageContext.getAttribute("stu")).getAge() %><br/>
<%--
${stu.id} 等价于
<%=((Student)pageContext.getAttribute("stu", pageContext.PAGE_SCOPE)).getId() %>
--%>
</body>
</html>
效果如下:
3.输出集合对象
获取集合对象:${List集合对象名}
获取List集合中的第index个对象:${List集合对象名[索引值] } 注意:这里的中括号[索引值]等价于调用list.get(索引值)方法
(假如List集合中存储的值为对象)获取List集合中的第index个对象中的属性值:${List集合对象名[index].xxx} 注意:注意这里的.XXX,并不是调用第index个对象中的属性名,而是调用该对象的get方法getXxx()中Xxx的小写xxx
获取Map集合中对应key值的value值:${Map集合对象名[key] }
注意:[key]相当于调用了get(key)方法
(假如Map集合中存储的值为对象)获取Map集合中key值对应的的对象中的属性值:${Map集合对象名[key].xxx}
Demo如下:
<%@ page
language="java"
import="java.util.*, com.cn.entity.Student"
pageEncoding="UTF-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">
<title>My JSP 'el3.jsp' starting page</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
<!--
<link rel="stylesheet" type="text/css" href="styles.css">
-->
</head>
<body>
<hr/><hr/>
<h1>EL表达式获取List集合对象</h1>
<%
//创建Student对象
Student stu1 = new Student(1, "木丁西", '男', 24);
Student stu2 = new Student(2, "小龙女", '女', 14);
Student stu3 = new Student(3, "张馨予", '女', 28);
Student stu4 = new Student(4, "刘先生", '男', 35);
//创建集合对象
List<Student> list = new ArrayList();
list.add(stu1);
list.add(stu2);
list.add(stu3);
list.add(stu4);
//保存集合对象到page域对象中。
pageContext.setAttribute("list", list);
%>
<%-- 使用EL表达式获取集合对象 --%>
EL表达式获取集合对象:${list }<br/>
EL表达式获取集合中的第1个对象:${list[0] }<br/>
<%--
注意这里的中括号[]等价于调用get(索引值)方法
--%>
--|EL表达式获取集合中的第1个对象中的属性值:${list[0].id }-${list[0].name }-${list[0].sex }-${list[0].age }<br/>
<%--
注意这里的.id,并不是调用属性(Student类中,属性私有的private),而是调用get方法getId()中Id的小写
--%>
EL表达式获取集合中的第2个对象:${list[1] }<br/>
--|EL表达式获取集合中的第1个对象中的属性:${list[1].id }-${list[1].name }-${list[1].sex }-${list[1].age }<br/>
EL表达式获取集合中的第3个对象:${list[2] }<br/>
--|EL表达式获取集合中的第1个对象中的属性:${list[2].id }-${list[2].name }-${list[2].sex }-${list[2].age }<br/>
EL表达式获取集合中的第4个对象:${list[3] }<br/>
--|EL表达式获取集合中的第1个对象中的属性:${list[3].id }-${list[3].name }-${list[3].sex }-${list[3].age }<br/>
<hr/>
<h3>上面的等价于</h3>
jsp表达式获取集合对象:
<%
List<Student> stuList= (List<Student>)pageContext.getAttribute("list", pageContext.PAGE_SCOPE);
%><%= stuList %><br/>
jsp表达式获取集合中的第1个对象:<%= stuList.get(0) %><br/>
--|jsp表达式获取集合中的第1个对象中的属性值:<%=stuList.get(0).getId()%>-<%=stuList.get(0).getName()%>-<%=stuList.get(0).getSex()%>-<%=stuList.get(0).getAge()%><br/>
jsp表达式获取集合中的第2个对象:<%= stuList.get(1) %><br/>
--|jsp表达式获取集合中的第2个对象中的属性值:<%=stuList.get(1).getId()%>-<%=stuList.get(1).getName()%>-<%=stuList.get(1).getSex()%>-<%=stuList.get(1).getAge()%><br/>
jsp表达式获取集合中的第3个对象:<%= stuList.get(2) %><br/>
--|jsp表达式获取集合中的第3个对象中的属性值:<%=stuList.get(2).getId()%>-<%=stuList.get(2).getName()%>-<%=stuList.get(2).getSex()%>-<%=stuList.get(2).getAge()%><br/>
jsp表达式获取集合中的第4个对象:<%= stuList.get(3) %><br/>
--|jsp表达式获取集合中的第4个对象中的属性值:<%=stuList.get(3).getId()%>-<%=stuList.get(3).getName()%>-<%=stuList.get(3).getSex()%>-<%=stuList.get(3).getAge()%><br/>
<hr/><hr/>
<h1>EL表达式获取Map集合对象</h1>
<%
//创建Map集合对象
Map<String, Student> map = new HashMap();
//添加数据到 Map结合中
map.put("001", stu1);
map.put("002", stu2);
map.put("003", stu3);
map.put("004", stu4);
//保存集合对象到page域对象中。
pageContext.setAttribute("map", map);
%>
<%-- 使用EL表达式获取Map集合对象 --%>
EL表达式获取集合对象:${map }<br/>
EL表达式获取集合中的第1个对象:${map["001"]}<br/>
--|EL表达式获取集合中的第1个对象中的属性:${map["001"].id }-${map["001"].name }-${map["001"].sex }-${map["001"].age }<br/>
EL表达式获取集合中的第2个对象:${map["002"]}<br/>
--|EL表达式获取集合中的第2个对象中的属性:${map["002"].id }-${map["002"].name }-${map["002"].sex }-${map["002"].age }<br/>
EL表达式获取集合中的第3个对象:${map["003"]}<br/>
--|EL表达式获取集合中的第3个对象中的属性:${map["003"].id }-${map["003"].name }-${map["003"].sex }-${map["003"].age }<br/>
EL表达式获取集合中的第4个对象:${map["004"]}<br/>
--|EL表达式获取集合中的第4个对象中的属性:${map["004"].id }-${map["004"].name }-${map["004"].sex }-${map["004"].age }<br/>
<hr/>
<h3>上面的等价于</h3>
jsp表达式获取集合对象:
<%
Map<String, Student> stuMap = (Map<String, Student>)pageContext.getAttribute("map", pageContext.PAGE_SCOPE);
%><%= stuMap %><br/>
jsp表达式获取集合中的第1个对象:<%= stuMap.get("001") %><br/>
--|jsp表达式获取集合中的第1个对象中的属性值:<%=stuMap.get("001").getId()%>-<%=stuMap.get("001").getName()%>-<%=stuMap.get("001").getSex()%>-<%=stuMap.get("001").getAge()%><br/>
jsp表达式获取集合中的第2个对象:<%= stuMap.get("002") %><br/>
--|jsp表达式获取集合中的第2个对象中的属性值:<%=stuMap.get("002").getId()%>-<%=stuMap.get("002").getName()%>-<%=stuMap.get("002").getSex()%>-<%=stuMap.get("002").getAge()%><br/>
jsp表达式获取集合中的第3个对象:<%= stuMap.get("003") %><br/>
--|jsp表达式获取集合中的第3个对象中的属性值:<%=stuMap.get("003").getId()%>-<%=stuMap.get("003").getName()%>-<%=stuMap.get("003").getSex()%>-<%=stuMap.get("003").getAge()%><br/>
jsp表达式获取集合中的第4个对象:<%= stuMap.get("004") %><br/>
--|jsp表达式获取集合中的第4个对象中的属性值:<%=stuMap.get("004").getId()%>-<%=stuMap.get("004").getName()%>-<%=stuMap.get("004").getSex()%>-<%=stuMap.get("004").getAge()%><br/>
</body>
</html>
效果如下:
4. 表达式计算
4.1 算数表达式
4.2 比较运算
4.3 逻辑运算
4.4 判空(null 或 空字符串)
Demo如下:
<%@ page language="java" import="java.util.*, com.cn.entity.Student" pageEncoding="UTF-8"
session="true"
%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">
<title>My JSP 'el.jsp' starting page</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
<!--
<link rel="stylesheet" type="text/css" href="styles.css">
-->
</head>
<body>
<%--
EL表达式计算
--%>
<%-- 1.算数表达式 --%>
10+5:${10+5 }<br/>
10-5:${10-5 }<br/>
10*5:${10*5 }<br/>
10/5:${10/5 }<br/>
<hr/>
<%--
2.比较运算
> < >= <= == !=
--%>
10>5:${10>5 }<br/>
10<5:${10<5 }<br/>
10==5:${10==5 }<br/>
10!=5:${10!=5 }<br/>
<hr/>
<%--
3.逻辑运算
&& || !
--%>
true && true - ${true && true }<br/>
true && false - ${true && false }<br/>
true || true - ${true || true }<br/>
true || false - ${true || false }<br/>
!true - ${!true }<br/>
!false - ${!false }<br/>
<hr/>
<%--
4.判空(null 或 空字符串)
empty 变量
--%>
<%
//String name = "木丁西";
//String name = "";
String name = null;
pageContext.setAttribute("name", name);
%>
name是否为空:${name == null }<br/>
name是否为空:${name == "" }<br/>
name是否为空或null:${name == null || name == "" }<br/>
<%-- 简化写法 --%>
name是否为空或null:${empty name}<br/>
</body>
</html>
效果如下: