el表达式,只用于jsp页面中。
el表达式的最初提出来的时候的作用:
1. 可以从域对象中获取数据。比较简单。
${获取域对象内容的表达式}
pageContext
request
session
application
2.第二种用法,在el表达式中写各种运算。
算数运算
比较运算
逻辑运算
三元运算
1、使用el表达式获取域对象里面的值
application
session
request
pageContext page
(1)el表达式使用在jsp页面中,不能在html中使用,servlet中。
(2)写法: ${域对象名称}
(3)使用el表达式获取四个域对象里面的值
(4)el表达式
= 代码
<%
//我们可以通过域对象设置值。
request.setAttribute(“aaa”, “AAA”);
session.setAttribute(“bbb”, “BBB”);
pageContext.setAttribute(“ccc”, “CCC”);
application.setAttribute(“ddd”, “DDD”);
//之前取值的方式。
String value = (String) request.getAttribute(“aaa”);
%>
<-- 通过el表达式来获取 域对象设置的参数值。如何获取。 -->
<-- el表达式通过域对象的名字,直接就能获取到值,而且不涉及 强制类型转换的问题。 -->
${aaa}
${bbb}
${ccc}
${ddd}
(4)如果使用el表达式获取的名称不存在,返回空字符串 “”,不会出现空指针异常
el在表达式在底层已经为我们做了强制转换了,不需要我们手动做。
他能够提高代码的安全性,显示效果能够友好展示。
如果使用传统方式getAttribute获取名称不存在,返回null,容易出现空指针异常
(5)使用el表达式获取域对象名称相同的,获取的是域范围最小的里面的值
<%
//我们可以通过域对象设置值。
request.setAttribute(“andy”, “AAA”);
session.setAttribute(“andy”, “BBB”);
pageContext.setAttribute(“andy”, “CCC”);
application.setAttribute(“andy”, “DDD”);
//之前取值的方式。
String value = (String) request.getAttribute(“andy”);
out.println(value);
%>
<-- 通过el表达式来获取 域对象设置的参数值。如何获取。 -->
<-- el表达式通过域对象的名字,直接就能获取到值,而且不涉及 强制类型转换的问题。 -->
<-- 通过我们把所有域对象的名字都设置成了 相同的名字之后,发现访问到的 是page 对象所设置的 值 -->
${andy}
${andy}
${andy}
${andy}
<-- 如何来解决这个问题? 可以通过域对象+Scope的方式来访问。 --> ${requestScope.andy}
${sessionScope.andy}
<-- 注意: 在el表达式中获取pageContext 对象,用的是page -->
${pageScope.andy}
${applicationScope.andy}
结论:四个作用域由小到大的排序是:
pageContext < request < session < application
2、使用el表达式获取域对象里面数组、集合(list、map)、对象属性的值
(1)使用el表达式获取域对象里面的数组的值
= 使用数组的下标得到里面的值,数组下标从0开始
= ${域对象名称[数组的下标] }
= 代码
<%
//定义一个字符串数组。
String[] arr = {“aaa”,“bbb”,“ccc”};
//把数组对象,作为request域对象的参数进行保存。
request.setAttribute(“arr”, arr);
%>
<-- 通过el表达式,获取存入的数组的元素值。 -->
${arr[0]}
${arr[1]}
${arr[2]}
= 如果获取的数组的下标不存在,返回是空字符串 “”
//之前我们通过java代码的方式访问不存在的数组的索引对应元素的时候,会报:数组角标越界异常。
//out.println(arr[10]); // java.lang.ArrayIndexOutOfBoundsException: 10
<-- 通过el表达式访问,不存在的数组的角标的时候,不会报错,显示空字符串 “” -->
${arr[10]}
(2)使用el表达式获取域对象里面list集合的值
= 使用list集合的下标获取里面的值,list下标从0开始的
= ${域对象名称[list集合的下标]}
= 代码
<%
//创建一个list集合
List list = new ArrayList();
list.add(“AAA”);
list.add(“BBB”);
list.add(“CCC”);
list.add(“DDD”);
//通过域对象,将list集合存入域对象参数中。
request.setAttribute(“list100”, list);
%>
<-- el表达式获取值 -->
<-- 使用传统方式遍历list,有四种方式
普通for:根据下标得到,下标从0开始
迭代器
增强for
list迭代器
–>
<-- 通过el表达式来获取list集合,并获取里面的值。 -->
${list100[0] }
${list100[1] }
${list100[2] }
${list100[3] }
= 如果获取list集合的下标不存在,返回是空字符串 “”
= 向域对象里面放set集合,使用el表达式不可以获取域对象里面set集合的值
== list和set的区别:list是有序的,set是无序的
(3)使用el表达式获取域对象里面map集合的值
= 根据map的key名称得到对应的value值
= 写法:
域名称
.
k
e
y
名称
=
另外写法:
{域名称.key名称} = 另外写法:
域名称.key名称=另外写法:{域名称[“key名称”]}
= 代码
<%
//创建一个map 集合,map是有序的集合,可以用hashMap treeMap‘
Map map = new HashMap();
map.put(“aaa”, “AAA”);
map.put(“bbb”, “BBB”);
map.put(“ccc”, “CCC”);
map.put(“ddd”, “DDD”);
// 把map集合放入域对象中。
request.setAttribute(“map100”, map);
%>
<-- 通过el表达式来获取map集合中的元素。 元素名字找值,通过key找value–>
${map100.aaa}
<-- 如果用el表达式直接访问的是我们存入的map集合的名字,难么就会直接打印出来这个集合。 -->
${map100}
= 如果key的名称不存在,返回是空字符串 “”
= 如果map集合的key的类型是int类型,使用el表达式不能获取里面的值,报错
例如: ${map[3]} // 如果map集合的key 是int 类型。用.获取会报错。[]获取获取不到。
(4)使用el表达式获取域对象里面的对象的属性值
= 使用名称.对象里面的属性的名称得到值
= ${域对象名称.属性的名称}
= 代码
<-- 使用el表达式获取域对象里面对象的属性的值 -->
<%
//创建对象
User user = new User();
user.setUsername(“东方不败”);
user.setPassword(“999”);
//把user对象放到域对象里面
request.setAttribute(“user100”, user);
%>
<-- el表达式获取值 -->
${user100.username }
${user100.password }
= 如果获取的域对象里面的对象的属性名称不存在,报错
3、el表达式的其他操作
3.1 运算的操作
(1)算术的运算 + - …
(2)关系的运算 < > <= >=…
(3)逻辑的运算 && ||…
3.2 empty运算符
(1)判断对象是否为空
= ${user == null}
= ${empty user}
= ${user != null}
= ${not empty user}
3.3 三元表达式
三元表达式类似于,if(){}else{}
(1)${user != null ? user.name : “”}
= 如果user对象不为空,获取user的name值,否则返回空字符串
= ${ not empty user ? user.name : “”}
3.4 在el表达式中有11个隐含对象
(2)pageContext隐含对象:对应于jsp中pageContext内置对象,获取其他的八个内置对象
JSTL标签 (是一个标签库。)
jstl标签库
1、jstl标签库的简介
1.1 jstl:JavaServerPages Standard Tag Library,jsp的标准的标签库
1.2 使用jstl标签库,可以和jsp指令taglib一起使用,替代页面中<% %>
(1)jstl版本 1.0 1.1 1.2
1.3 要使用jstl标签库,导入jstl的jar包(两个jar包)
(1)jstl标签库使用在jsp页面中,需要jsp页面中引入标签库,使用taglib指令引入
= <%@ taglib uri=“jstl标签库的路径” prefix=“jstl标签库的别名” %>
= 找到引入的jar包里面,找到META-INF的c.tld文件,找到
c
http://java.sun.com/jsp/jstl/core
= <%@ taglib uri=“http://java.sun.com/jsp/jstl/core” prefix=“c” %>
(2)写法:
= <c:标签库的名称 属性=“属性值”>
1.4 jstl的入门案例
(1)代码
<-- 嵌入java代码 -->
<%
int m = 10;
if(m == 10) {
%>
m等于10
<% } else { %>m不等于10
<% } %><hr/>
<!-- 使用jstl标签库,把java代码换成jstl表示出来 -->
<!-- 定义一个变量 ,使用jstl里面set标签实现,向域对象里面设置一个值 -->
<c:set var="a" value="20"></c:set>
<!-- 条件判断,使用jstl里面的if标签实现 -->
<c:if test="${a==10 }">
a等于10
a不等于10
2、jstl的if标签
2.1 进行条件判断的标签
2.2 写法 <c:if test=“判断的条件”>
2.3 在jstl中没有 <c:else>标签
2.4 代码
<-- 条件判断,使用jstl里面的if标签实现 -->
<c:if test=“${a==10 }”>
a等于10
a不等于10
3、jstl的forEach标签
3.1 遍历的操作的标签
3.2 使用forEach标签获取域对象里面数组、集合(list、set、map)、多个对象的属性值
3.3 写法:<c:forEach var=“每次遍历的值” items=“域对象里面 ${名称}”>
3.4 使用forEach标签获取域对象里面的数组的值
(1)代码
<-- 使用jstl的foreach标签获取域对象里面的数组的值 -->
<%
//创建数组,把数组放到域对象里面
String[] arr = {“lucy”,“mary”,“jack”};
request.setAttribute(“arr”, arr);
%>
<-- 使用el表达式获取 -->
${arr[0] }
<hr/>
<!-- 使用foreach标签获取 -->
<!--
使用增强for循环
for(String a : arr) {}
–>
<c:forEach var=“a” items=“${arr }”>
${a }
</c:forEach>
3.5 使用jstl的forEach标签获取域对象里面的集合中的值
(1)获取域对象里面list集合里面的值
= 代码
<-- 使用jstl的forEach标签获取域对象里面的list集合的值 -->
<%
//创建list集合
List list = new ArrayList();
list.add(“aaaa”);
list.add(“bbbb”);
list.add(“cccc”);
//把list集合放到域对象里面
request.setAttribute(“list”, list);
%>
<-- 使用el表达式获取里面list的值 -->
${list[0] }
<hr/>
<!-- 使用forEach标签获取值 -->
<!--
for(String l : list) {}
–>
<c:forEach var=“l” items=“${list }”>
${l }
</c:forEach>
(2)获取域对象里面set集合里面的值
= 使用el表达式不能获取域对象里面的set集合中的值,因为set集合无序的,不能通过下标获取
= 代码
<-- 使用jstl里面的forEach标签获取域对象里面的set集合的值 -->
<%
//创建set集合,把set集合放到域对象里面
Set set = new HashSet();
set.add(“WWW”);
set.add(“QQQ”);
set.add(“TTT”);
request.setAttribute(“set”, set);
%>
<-- 使用el表达式获取 -->
<%--
s
e
t
[
0
]
−
−
<
−
−
使用
f
o
r
E
a
c
h
标签获取
−
−
>
<
c
:
f
o
r
E
a
c
h
v
a
r
=
"
s
e
t
"
i
t
e
m
s
=
"
{set[0] } --%> <-- 使用forEach标签获取 --> <c:forEach var="set" items="
set[0]−−<−−使用forEach标签获取−−><c:forEachvar="set"items="{set }">
${set }
</c:forEach>
(3)获取域对象里面map集合里面的值
= 使用el表达式获取域对象里面map集合值,根据map的key得到value
= 代码
<-- 使用jstl的foreach标签获取域对象里面map集合值 -->
<%
//创建map,把map集合放到域对象里面
Map<String,String> map = new HashMap<String,String>();
map.put(“aaa”, “AAA”);
map.put(“bbb”, “BBB”);
map.put(“ccc”, “CCC”);
request.setAttribute(“map”, map);
%>
<-- 使用el表达式获取值 -->
${map.aaa }
<hr/>
<!-- 使用foreach标签获取值 -->
<c:forEach var="m" items="${map }">
${m.key } , ${m.value }
</c:forEach>
3.6 使用jstl的forEach标签获取域对象里面多个对象的属性的值
(1)如何把多个对象放到域对象里面
= 可以先把多个对象放到集合里面(list),再把list集合放到域对象里面
= 代码
<-- 把多个对象放到域对象里面 -->
<%
//创建多个对象
User user1 = new User();
user1.setUsername(“东方不败”);
user1.setPassword(“999”);
User user2 = new User();
user2.setUsername(“岳不群”);
user2.setPassword(“444”);
User user3 = new User();
user3.setUsername(“林平之”);
user3.setPassword(“666”);
//把多个对象放到list集合里面
List list = new ArrayList();
list.add(user1);
list.add(user2);
list.add(user3);
//把list集合放到域对象里面
request.setAttribute(“list”, list);
%>
= 获取多个对象的属性值的代码
<-- 使用jstl的foreach标签获取域对象里面多个对象的属性的值 -->
<-- 使用foreach标签获取值 -->
<c:forEach var=“user” items=“${list }”>
${user.username } :: ${user.password }
</c:forEach>