1、概念
Expressions Language,表达式语言
格式:${表达式}
其主要用于将域对象中的属性值输出到页面上
示例:
输出request域中的username属性值
<%
request.setAttribute("username", "tomcat");
%>
${username}
2、特点
EL表达式默认是全域查找。
先从page域中查找,如果找不到;再在request域中查找,如果还找不到;再去session域中查找,如果再找不到;最后去application域中查找,如果还是没有,则返回空字符串(”“),不是null
3、精确查找
EL提供了四个Scope对象,这四个对象相当于将域对象中的域单独拿了出来。这样就可以获取指定域中的属性值
pageScope
获取page域中的属性值
requestScope
获取request域中的属性值
sessionScope
获取session域中的属性值
applicationScope
获取application域中的属性值
特殊的key对应的值的获取
${指定域[‘特殊key’]}
这里单引号、双引号都可以
示例:
获取page域中的”ab-cd”对应的属性值
<%
pageContext.setAttribute("ab-cd", "我是value");
%>
${pageScope['ab-cd']}
4、获取JavaBean中的属性值
可以通过【对象.属性名】的方式来获取对应的JavaBean的属性值
Tips:
⑴ 通过此形式获取到的属性值,是通过调用JavaBean中的getXxx方法来获取到的
⑵ 如果获取到的属性值还是一个JavaBean的对象,则还可以继续获取其相应的属性值
⑶ 只要JavaBean中有getXxx方法,则可以直接使用
【对象.xxx】来获取对应的属性值。即将Xxx的首字母小写即可。在EL表达式中要写的是getXxx方法的xxx,这和属性值无关,没有相应的属性值也不会报错。但是没有相应的get方法就会报错:javax.el.PropertyNotFoundException: Property ‘xxx’ not found on type JavaBean的全类名
<h2>测试获取JaveBean的属性值</h2>
【Animal JavaBean】
public class Animal {
private String name;
private Integer age;
private String color;
private Dog dog;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public String getColor() {
return color;
}
public void setColor(String color) {
this.color = color;
}
public Dog getDog() {
return dog;
}
public void setDog(Dog dog) {
this.dog = dog;
}
public Animal() {
}
public Animal(String name, Integer age, String color, Dog dog) {
this.name = name;
this.age = age;
this.color = color;
this.dog = dog;
}
@Override
public String toString() {
return "Animal [name=" + name + ", age=" + age + ", color=" + color + ", dog=" + dog + "]";
}
}
【Dog JavaBean】
public class Dog {
private String name;
private Integer age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public Dog() {
}
public Dog(String name, Integer age) {
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "Dog [name=" + name + ", age=" + age + "]";
}
}
【JSP页面】
<%
Animal animal = new Animal("动物", 4, "白色", new Dog("小白", 2));
pageContext.setAttribute("animal", animal);
%>
<%-- 获取Animal对象 --%>
Animal:${animal}<br /><br />
<%-- 获取Animal对象的color属性 --%>
Animal的color:${animal.color}<hr />
<%-- 获取Dog对象 --%>
Dog:${animal.dog}<br /><br />
<%-- 获取Dog对象的name属性【因为animal的dog属性也是一个JavaBean(Dog类型)】 --%>
Dog的name:${animal.dog.name}
测试是否调用了get方法
在上面的Animal类中添加一个get方法:
public String getWeight() {
return "16";
}
在JSP页面中写:
${animal.weight}
这样会在页面上显示16
再新建一个Animal对象,并添加到域中,再调weight,结果还是16
<%
Animal a = new Animal("动物2", 2, "黑色", new Dog("小黑", 1));
pageContext.setAttribute("a", a);
%>
${a.weight}
显示的结果还是16
由此可见:通过EL来获取JavaBean的属性值,是调用了属性对应的getXxx方法,而且属性不存在也不会报错、EL中调用的是getXxx方法去掉get后再将Xxx首字母大写
5、EL中的11个隐含对象
pageContext
类型:PageConext
作用:它既是JSP中的隐含对象之一,也是EL中的隐含对象之一。通过它可以获取JSP中的其他8个隐含对象。
一般在EL中获取的是:
⑴ 获取request对象
${pageContext.request}
⑵ 获取虚拟路径【/项目名】
${pageContext.request.contextPath}
pageScope
类型:Map<String, Object>
用来获取page域中的属性值
requestScope
类型:Map<String, Object>
用来获取request域中的属性值
sessionScope
类型:Map<String, Object>
用来获取session域中的属性值
applicationScope
类型:Map<String, Object>
用来获取application域中的属性值
param
类型:Map<String, String>
用来获取request中的请求参数。单个value的情况
例如:获取文本框的内容
<input type="text" name="username" value="tomcat" />
${param.username}
paramValues
类型:Map<String, String[]>
用来获取request中的请求参数。同一个name,多个value的情况
例如:获取多选框的值
<input type="checkbox" name="language" value="Java" />Java
<input type="checkbox" name="language" value="cs" />C#
${paramValues.language}
header
类型:Map<String, String>
获取请求头中的指定name的value。单个value的情况
headerValues
类型:Map<String, String[]>
获取请求头中的指定name的value。同一个name,多个value的情况
cookie
类型:Map<String, Cookie>
根据指定的Cookie的名字,获取对应的Cookie对象
initParam
类型:Map<String, String>
根据指定的name,获取在web.xml中配置的context-param里的param-value
示例:根据name获取在web.xml中的对应value值
<context-param>
<param-name>username</param-name>
<param-value>tomcat</param-value>
</context-param>
${initParam.username}
使用示例
虚拟路径:<%=request.getContextPath()%><br />
虚拟路径:${pageContext.request.contextPath}<hr />
<%
pageContext.setAttribute("key", "pageValue");
request.setAttribute("key", "reqValue");
session.setAttribute("key", "sessionValue");
application.setAttribute("key", "appValue");
%>
${pageScope.key}<br />
${requestScope.key}<br />
${sessionScope.key}<br />
${applicationScope.key}<hr />
<%-- 【QueryString】 ?username=abc --%>
<%-- ${pageContext.request.queryString} --%>
<%=request.getParameter("username")%><br />
username: ${param.username}<br />
language: ${paramValues.language}<br /><hr />
UA:${header['User-Agent'] }<br />
Accpet:${headerValues.Accept}<br /><hr />
${cookie.JSESSIONID}<br />
${initParam.username}
6、EL运算符
算数运算符
在EL中可以直接进行加、减、乘、除等运算
empty
${empty 要判断的值}
经常使用empty运算符来判断一个字符串或一个集合是否为空。这里的空不仅指null,还指字符串是一个空串或集合中没有元素。该运算符的返回值为true或false
not empty或 !empty 表示非空
${not empty 要判断的值}
注意:
empty和null不同:
⑴ 当字符串是一个空串(”“)时,使用null判断,返回false;使用empty判断,返回true
⑵ 当集合中没有元素时,使用null判断,返回false;使用empty判断,返回true
empty和null的区别
<%
String str = "";
pageContext.setAttribute("str", str);
%>
str == null ? ${str == null}<br />
empty str ? ${empty str}<br /><hr />
<%
List list = new ArrayList();
pageContext.setAttribute("list", list);
%>
list == null ? ${list == null}<br />
empty list ? ${empty list}
判断非空
<%
pageContext.setAttribute("str", "abc");
pageContext.setAttribute("list", new ArrayList());
%>
not empty str ? ${not empty str}<br />
!empty list ? ${!empty list}