为什么要学习EL表达式和JSTL表达式??
答:前面我们了解了mvc的 开发模式,其中有一点,前端页面要和后端的java 分离。jsp作为一个VIEW,尽量只做展示数据的工作。但是有时候我们需要在jsp中写少量的java代码,这时我们就可以用EL表达式和JSTL表达式替换掉少量的JAVA代码
EL表达式
一. 概念:Expression Language 表达式语言
二. 作用:替换和简化jsp页面中java代码的编写
三. 语法:${表达式}
四. 注意:
- jsp默认支持el表达式的。如果要忽略el表达式
- 设置jsp中page指令中:isELIgnored=“true” 忽略当前jsp页面中所有的el表达式
- \${表达式} :忽略当前这个el表达式
五. 使用:
1. 运算:
- 运算符:
- 算数运算符: + - * /(div) %(mod)
- 比较运算符: > < >= <= == !=
- 逻辑运算符: &&(and) ||(or) !(not)
- 空运算符: empty
emptyd 的使用
* 功能:用于判断字符串、集合、数组对象是否为null或者长度是否为0
* ${empty list}:判断字符串、集合、数组对象是否为null或者长度为0
* ${not empty str}:表示判断字符串、集合、数组对象是否不为null 并且 长度不为0
2. 获取值
(1). el表达式只能从域对象中获取值
(2). 语法:
1. ${域名称.键名}:从指定域中获取指定键的值
* 域名称:
1. pageScope --> pageContext
2. requestScope --> request
3. sessionScope --> session
4. applicationScope --> application(ServletContext)
* 举例:在request域中存储了name=张三
* 获取:${requestScope.name}
2. ${键名}:表示依次从最小的域中查找是否有该键对应的值,直到找到为止。
直接找name1,我们会找到request,也就印证了 ${键名}:表示依次从最小的域中查找是否有该键对应的值,直到找到为止。
3. 获取对象
el表达式 是通过 对象的属性来获取值的。什么是对象的属性呢?
做一个简单的解释:属性就是 setter或者getter方法 ,去掉set 和 get,剩余的部分首字母变为小写(getName -> Name -> name ,name就是对象的属性)
此时有一个疑惑? 成员变量 难道不等同于属性吗?答案在下文中
(1)做一个实例
先创建一个People对象类
public class People {
private String name;
private int age;
private Date bir;
public String getName() {
return name;
}
public int getAge() {
return age;
}
public Date getBir() {
return bir;
}
public void setName(String name) {
this.name = name;
}
public void setAge(int age) {
this.age = age;
}
public void setBir(Date bir) {
this.bir = bir;
}
}
然后再jsp页面中获取
<html>
<head>
<title>Title</title>
</head>
<body>
<%
People p1 = new People();
p1.setName("张三");
p1.setAge(23);
p1.setBir(new Date());
request.setAttribute("p1",p1);
%>
<%--直接打印是地址值--%>
${requestScope.p1} <br>
<%--通过属性获取值--%>
${requestScope.p1.name}<br>
${p1.age}<br>
${p1.bir}<br>
</body>
</html>
打印结果:
提出一个问题,如果我只想获得生日的月份要怎么操作?? 解答思路:是否记得Date中有个getmouth方法?那mouth也是 Date对象的一个属性啦
外国人的月份是从0开始的,他们的6月,相当于我们的七月。
再提出一个问题,我想把日期格式化输出成中文模式,思路是什么?? 解答思路:我们了解了属性的机制,如果我们可以把格式化DATE变成people对象的一个属性,就可以完成。我们只要把方法变为属性。在people类中创建getChinadate 的格式化日期方法,那么chinadate就会变成people类的一个属性
结果
所以成员变量是属性,但是属性不等同于成员变量
4. 获取list,map集合中的对象
(1) List集合:${域名称.键名[索引]}
我们分别创建两个list,一个是引用类型的list,一个是字符串类型的
分别获取
结果
(2)Map集合:
- ${域名称.键名.key名称}
- ${域名称.键名[“key名称”]}
实例如下
红色圈圈里面是获取map里面的list中的属性
打印结果如下:
5. 隐式对象:
- el表达式中有11个隐式对象
- pageContext:
* 获取jsp其他八个内置对象
* ${pageContext.request.contextPath}:动态获取虚拟目录