EL表达式
1.初识JavaBean
1.1 什么是javaBean:
它是java开发中常用的组件,其实就是一个java类,它的作用就是封装数据。
书写JavaBean需要满足五个规范:
>>>1.这个java类,被public修饰
>>>2.这个java类要提供公共的无参数的构造方法
>>>3.要提供私有的属性
>>>4.要给私有的属性提供公共的set或者get方法
>>>5.要实现Serializable接口
比如:
public class Book implements Serializable{
private String id;
private String name;
public Book(){};
public void set----
public String get—
}
1.2 访问JavaBean的属性:
类的成员变量和属性的一个关系:
在普通的java类里面,成员变量可以说成就是属性。
在JavaBean里面,成员变量和属性就有了区别。
在JavaBean 里面什么是成员变量呢? 比如:private String id; 那么id就是成员变量
在JavaBean 里面什么是属性?就是get或者set后面的字段名称(字段名称的首字母小写),就是属性。
比如:
public class Student {
//一下就是javaBean的四个成员变量
private String sid;//目的就是为了接收外界传递过来的值
private String name;
public Student() {
}
//属性由get或者set方法后面的字段首字母小写就是属性,属性就是id
public String getId() {
return sid;
}
public void setId(String id) {//写方法,给student写一个id
this.sid = id;
}
//属性就是name
public void setName(String name) {
this.name = name;
}
}
上面的Student的属性就是id ,name。成员变量就是sid,name.
1.3 BeanUtils 工具
BeanUtils 工具是由apache软件基金会提供的一套封装数据到JavaBean的工具类,使用简单方便,
BeanUtils是第三方的工具(插件),所以需要导入jar包。
常用的api:
>>> 1.向javaBean的属性设置值:
setProperty(javaBean对象,javaBean的属性,javaBean属性的值);
>>> 2.获取javaBean属性的值:
getProperty(javaBean对象,javaBean的属性);
>>> 3.向javaBean的属性设置值:
populate(javaBean对象,map对象);
注意:map的对象的key(就是javaBean属性名称),必须和javaBean的属性名一致,才能给javaBean的属性设置值。
提交的表单数据想封装到javaBean对象里面,要求表单name属性的值,必须和javaBean属性名称一一对应。
2.EL 表达式
1.1 初识 EL 表达式
EL在开发中,通常是用来获取域对象中保存的值,基本语法:${域对象的名称}。
比如说: request.setAttribute(“key”,“value123”):
k
e
y
,
获
取
的
值
就
是
v
a
l
u
e
123
如
果
域
对
象
的
名
称
写
错
了
,
使
用
e
l
表
达
式
获
取
值
,
获
取
的
是
"
"
.
1.2
E
L
表
达
式
中
的
标
识
符
在
e
l
书
写
过
程
中
,
会
用
一
些
符
号
来
标
记
变
量
、
函
数
名
等
,
这
些
符
号
称
之
为
标
识
符
。
书
写
规
范
:
1.
不
能
以
数
字
开
头
2.
不
能
包
含
e
l
中
的
关
键
字
:
a
n
d
,
o
r
等
3.
不
能
使
用
e
l
表
达
式
的
隐
式
对
象
。
4.
不
能
包
含
特
殊
符
号
,
比
如
正
斜
杠
等
1.3
E
L
中
的
变
量
基
本
格
式
:
{key},获取的值就是value123 如果域对象的名称写错了,使用el表达式获取值,获取的是"". 1.2 EL表达式中的标识符 在el书写过程中,会用一些符号来标记变量、函数名等,这些符号称之为标识符。 书写规范: 1.不能以数字开头 2.不能包含el中的关键字:and , or 等 3.不能使用el表达式的隐式对象。 4.不能包含特殊符号,比如正斜杠等 1.3 EL中的变量 基本格式:
key,获取的值就是value123如果域对象的名称写错了,使用el表达式获取值,获取的是"".1.2EL表达式中的标识符在el书写过程中,会用一些符号来标记变量、函数名等,这些符号称之为标识符。书写规范:1.不能以数字开头2.不能包含el中的关键字:and,or等3.不能使用el表达式的隐式对象。4.不能包含特殊符号,比如正斜杠等1.3EL中的变量基本格式:{域对象的名称},这个域对象的名称可以理解为就是el中的变量,
那这个变量就不需要定义了,可以直接使用。
1、EL简介
1)语法结构
${expression}
2)[]与.运算符
EL 提供.和[]两种运算符来存取数据。
当要存取的属性名称中包含一些特殊字符,如.或?等并非字母或数字的符号,就一定要使用 []。
例如:
u
s
e
r
.
M
y
−
N
a
m
e
应
当
改
为
{user.My-Name}应当改为
user.My−Name应当改为{user[“My-Name”] }
如果要动态取值时,就可以用[]来做,而.无法做到动态取值。例如:
s
e
s
s
i
o
n
S
c
o
p
e
.
u
s
e
r
[
d
a
t
a
]
中
d
a
t
a
是
一
个
变
量
3
)
变
量
E
L
存
取
变
量
数
据
的
方
法
很
简
单
,
例
如
:
{sessionScope.user[data]}中data 是一个变量 3)变量 EL存取变量数据的方法很简单,例如:
sessionScope.user[data]中data是一个变量3)变量EL存取变量数据的方法很简单,例如:{username}。它的意思是取出某一范围中名称为
username的变量。
因为我们并没有指定哪一个范围的username,所以它会依序从Page、Request、Session、
Application范围查找。
假如途中找到username,就直接回传,不再继续找下去,但是假如全部的范围都没有找到时,
就回传null。
属性范围在EL中的名称
Page PageScope
Request RequestScope
Session SessionScope
Application ApplicationScope
4) 1–EL表达式用
表
示
,
可
用
在
所
有
的
H
T
M
L
和
J
S
P
标
签
中
作
用
是
代
替
J
S
P
页
面
中
复
杂
的
J
A
V
A
代
码
.
2
−
−
E
L
表
达
式
可
操
作
常
量
变
量
和
隐
式
对
象
.
最
常
用
的
隐
式
对
象
有
{}表示,可用在所有的HTML和JSP标签中作用是代替JSP页面中复杂的JAVA代码. 2--EL表达式可操作常量 变量 和隐式对象. 最常用的 隐式对象有
表示,可用在所有的HTML和JSP标签中作用是代替JSP页面中复杂的JAVA代码.2−−EL表达式可操作常量变量和隐式对象.最常用的隐式对象有{param}和${paramValues}.
${param}表示返回请求参数中单个字符串的值.
p
a
r
a
m
V
a
l
u
e
s
表
示
返
回
请
求
参
数
的
一
组
值
.
p
a
g
e
S
c
o
p
e
表
示
页
面
范
围
的
变
量
.
r
e
q
u
e
s
t
S
c
o
p
e
表
示
请
求
对
象
的
变
量
.
s
e
s
s
i
o
n
S
c
o
p
e
表
示
会
话
范
围
内
的
变
量
.
a
p
p
l
i
c
a
t
i
o
n
S
c
o
p
e
表
示
应
用
范
围
的
变
量
.
止
.
J
S
P
2.0
中
默
认
的
启
用
E
L
语
言
.
4
−
−
E
L
语
言
可
显
示
逻
辑
表
达
式
如
{paramValues}表示返回请求参数的一组 值.pageScope表示页面范围的变量.requestScope表示请求对象的变量. sessionScope表示会话 范围内的变量.applicationScope表示应用范围的变量. 止.JSP2.0中默认的启用EL语言. 4-- EL语言可显示 逻辑表达式如
paramValues表示返回请求参数的一组值.pageScope表示页面范围的变量.requestScope表示请求对象的变量.sessionScope表示会话范围内的变量.applicationScope表示应用范围的变量.止.JSP2.0中默认的启用EL语言.4−−EL语言可显示逻辑表达式如{true and false}结果是false 关系表达式如${5>6} 结
果是false 算术表达式如 ${5+5} 结果是10
5–EL中的变量搜索范围是:page request session application 点运算符(.)和"[ ]"都是
表示获取变量的值.区别是[ ]可以显示非词类的变量
2、EL隐含对象
1)与范围有关的隐含对象
与范围有关的EL 隐含对象包含以下四个:pageScope、requestScope、sessionScope 和
applicationScope;
它们基本上就和JSP的pageContext、request、session和application一样;
在EL中,这四个隐含对象只能用来取得范围属性值,即getAttribute(String name),却不能取得
其他相关信息。
例如:我们要取得session中储存一个属性username的值,可以利用下列方法:
session.getAttribute(“username”) 取得username的值,
在EL中则使用下列方法
${sessionScope.username}
2)与输入有关的隐含对象
与输入有关的隐含对象有两个:param和paramValues,它们是EL中比较特别的隐含对象。
例如我们要取得用户的请求参数时,可以利用下列方法:
request.getParameter(String name)
request.getParameterValues(String name)
在EL中则可以使用param和paramValues两者来取得数据。
${param.name}
${paramValues.name}
2.web域相关的对象
域作用范围从小到大:pageContext--->request--->session--->application(servletContext)
el表达式获取域对象中的值:如果域对象的名称相同,获取的是域作用范围最小的值。
和pageContext对象的findAttribute方法的效果是一样的。
3.param 和 paramValues 对象: 获取表单提交的数据。
比如:
num1:<input type="text" name="num1" /><br/>
num2:<input type="text" name="num" /><br/>
num3:<input type="text" name="num" /><br/>
<input type="submit" value="提交" /> <input type="reset" value="重填" />
<hr/>
num1:${param.num1 }<br/>
num2:${paramValues.num[0] }<br/>
num3:${paramValues.num[1] }
4. Cookie 对象:获取cookie的名称,获取cookie的值
比如:
<% response.addCookie(new Cookie("userName","itcast")); %>
获取cookie对象:${cookie.userName }<br/>
获取cookie的名称:${cookie.userName.name }<br/>
获取cookie的值:${cookie.userName.value }<br/>
三、EL表达式搜索域数据的顺序
EL表达式主要是输出域对象中的数据,当四个域对象都有同一个key的值时,EL表达式会按照四个域对象的范围从小到大进行搜索,找到就输出,与四个域对象声明的先后顺序无关
代码演示:在web目录下创建Test.jsp
<body>
<%
//向四个域对象中都保存相同key的值
request.setAttribute("key", "request");
session.setAttribute("key", "session");
application.setAttribute("key", "application");
pageContext.setAttribute("key", "pageContext");
%>
<%-- 使用EL表达式输出key的值 --%>
${key}
</body>
四、EL表达式输出Java类的属性
代码演示:创建Person类
public class Person {
//输出Person类中普通属性,数组属性,list集合属性和map集合属性
private String name;
private String[] phones;
private List<String> cities;
private Map<String, Object> map;
//注意:没有声明age属性
public int getAge() {
return 18;
}
//以及全参、空参构造器,各属性的getter/setter方法
}
代码演示:在web目录下创建Test.jsp
<body>
<%
Person person = new Person();
person.setName("JayChou");
person.setPhones(new String[]{"123","456","789"});
//给cities属性赋值
List<String> cities = new ArrayList<String>();
cities.add("北京");
cities.add("上海");
cities.add("深圳");
person.setCities(cities);
//给map属性赋值
Map<String,Object> map = new HashMap<>();
map.put("key1","value1");
map.put("key2","value2");
map.put("key3","value3");
person.setMap(map);
pageContext.setAttribute("p", person);
%>
<%--EL表达式中对象名.属性名不找属性的值,而是找名字对应的getXxx方法,没有此方法会报错--%>
输出Person:${ p }<br/>
输出Person的name属性:${p.name} <br>
输出Person的phones数组地址值:${p.phones} <br>
输出Person的phones数组属性值:${p.phones[2]} <br>
输出Person的cities集合中的元素值:${p.cities} <br>
输出Person的List集合中个别元素值:${p.cities[2]} <br>
输出Person的Map集合: ${p.map} <br>
输出Person的Map集合中某个key的值: ${p.map.key1} <br>
<%-- 注意,即使没有age属性,但因为有getAge方法,也可得出结果 --%>
输出Person的age值:${p.age} <br>
</body>
运行结果:
五、EL表达式的运算
语法:${运算表达式},EL表达式支持以下运算符
-
关系运算
-
逻辑运算
-
算数运算
-
empty运算
empty运算可以判断一个数据是否为空,若为空,输出true,不为空,输出false
以下几种情况为空(在原本的key之前加empty关键字):
(1)值为null、空串
(2)值为Object类型的数组且长度为0 (注:其他类型的长度为0的数组值为非空)
(3)List、Map集合元素个数为0 -
三元运算
表达式 1?表达式 2:表达式 3
表达式1为真返回表达式2的值,表达式1为假返回表达式3的值
代码演示:在web目录下创建Test.jsp
<body>
<%
//1、值为null值时
request.setAttribute("emptyNull", null);
//2、值为空串时
request.setAttribute("emptyStr", "");
//3、值是Object类型数组,长度为零的时候
request.setAttribute("emptyArr", new Object[]{});
//4、list集合,元素个数为零
List<String> list = new ArrayList<>();
request.setAttribute("emptyList", list);
//5、map集合,元素个数为零
Map<String,Object> map = new HashMap<String, Object>();
request.setAttribute("emptyMap", map);
//6、其他类型数组长度为0
request.setAttribute("emptyIntArr", new int[]{});
%>
${ empty emptyNull } <br/>
${ empty emptyStr } <br/>
${ empty emptyArr } <br/>
${ empty emptyList } <br/>
${ empty emptyMap } <br/>
${ empty emptyIntArr} <br/>
<%-- 三元运算 --%>
${ 12 != 12 ? "相等":"不相等" }
</body>