语法格式:
${EL表达式}
EL表达式通常由两部分组成:对象和属性。可以使用“点操作符”或“中括号[ ]操作符”来操作对象的属性,如下:
package entity;
public class Student {
private int stuNo;
private String stuName;
private Address address;
public int getStuNo() {
return stuNo;
}
public void setStuNo(int stuNo) {
this.stuNo = stuNo;
}
public String getStuName() {
return stuName;
}
public void setStuName(String stuName) {
this.stuName = stuName;
}
public Address getAddress() {
return address;
}
public void setAddress(Address address) {
this.address = address;
}
}
------------------------------------------------
package entity;
public class Address {
private String homeAddress;
private String schoolAddress;
public String getHomeAddress() {
return homeAddress;
}
public void setHomeAddress(String homeAddress) {
this.homeAddress = homeAddress;
}
public String getSchoolAddress() {
return schoolAddress;
}
public void setSchoolAddress(String schoolAddress) {
this.schoolAddress = schoolAddress;
}
}
---------------------------------
package servlet;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import entity.Address;
import entity.Student;
/**
* Servlet implementation class StudentServlet
*/
@WebServlet("/StudentServlet")
public class StudentServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
public StudentServlet() {
super();
// TODO Auto-generated constructor stub
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
doPost(request, response);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
Student student = new Student();
student.setStuName("小安妮");
student.setStuNo(30);
Address address = new Address();
address.setHomeAddress("杭州西湖");
address.setSchoolAddress("中科大");
student.setAddress(address);
request.setAttribute("student", student);
request.getRequestDispatcher("jsp/stu.jsp").forward(request, response);
}
}
------------------------------------------
<%@ page language="java" import="entity.Student" import="entity.Address" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
以上是使用传统的Scriptlet接受对象,并将对象的属性显示到前台,如果使用EL表达式来实现,就会简单许多:
<%@ page language="java" import="entity.Student" import="entity.Address" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
使用EL可以将JSP中的Java代码彻底消除,并且不用再做强制的类型转换,整体的JSP代码就会简单许多。
EL表达式操作符:
1.点操作符
${requestScope.student},表示在request作用域内查找student对象;${requestScope.student.stuNo},表示在request作用域内查找student对象的stuNo属性。
2.中括号[ ]操作符
(1)如果属性名称中包含一些特殊字符,如“ . ”、“ ?”、“ - ”等,就必须使用中括号操作符。如不能写成 ${requestScope.scholl-name},而必须改为${requestScope["scholl-name"]}
(2)如果要动态取值时,也必须使用中括号操作符。例如,String data = "school"(data是一个变量),那么只能用${requestScope[data]}。需要注意的是,中括号里面的值:如果加了双引号则表示一个常量,如 ${requestScope["school"]},表示获取school的属性值;而如果不加上双引号,则表示一个变量,如${requestScope[data]},表示获取data所表示的school的属性值,即等价于${requestScope["school"]},所以在使用中括号获取属性值时,一定要注意是否加引号,除了双引号,也可以使用单引号,其作用是一样的。
(3)访问数组。如果要访问request作用域的一个对象名为names的数组,就可以通过中括号来表示索引,如${requestScope.names[0]}、${requestScope.names[1]}等
(4)点操作符和中括号操作符还可以用来获取Map中的属性值:
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
Map
countries.put("US", "美国");
countries.put("CN", "中国");
request.setAttribute("countries", countries);
request.getRequestDispatcher("jsp/stu.jsp").forward(request, response);
}
4.关系运算符
EL表达式还能进行一些简单的运算,如下所示:
含义 关系运算符 示例 结果
大于 >(或gt) ${2>1}或$(2 gt 1) true
大于或等于 >= (或ge) ${2>=1}或${2 ge 1} true
等于 == (或eq) ${2==1}或${2 eq 1} false
小于或等于 <=(或le) ${2<=1}或${2 le 1} false
小于 <(或lt) ${2<1}或${2 lt 1} false
不等于 !=(或ne) ${2!=1}或${2 ne 1} true
逻辑运算符
EL表达式能够进行的逻辑运算,如下:
含义 关系运算符 示例 结果
逻辑或 ||(或or) true||false (或true or false) true
逻辑与 &&(或and) true&&false (或true and false) false
逻辑非 !(或not) !true (或not true) false
5.Empty操作符
用来判断一个之是否为null或不存在。
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setAttribute("test", "test");
request.setAttribute("dog", null);
request.getRequestDispatcher("jsp/stu.jsp").forward(request, response);
}
之前不存在的变量temp和值为空的变量dog,用empty操作符运算输出的结果为true,而之前存在的变量,但未被赋值,则为false
6.EL表达式的隐式对象
"隐式对象"又称“内置对象”。之前JSP里的request,session,application等都是JSP的隐式对象,这些“隐式对象”可以不用实例化就可以直接使用。同样的,在EL表达式中也存在一些隐式对象,按照使用途径的不同,EL隐式对象分为作用域访问对象、参数访问对象和JSP隐式对象。
1.四个作用域访问对象
${requestScope.student.stuNo}中的requestScope表示request作用域。即在使用EL表达式来获取一个变量的同时,可以指定改变量的作用域。EL表达式提供了四个可选的作用域对象:
对象名 作用域
pageScope 把pageContext作用域中的数据映射为一个Map类的对象
requestScope 把request作用域中的数据映射为一个Map类的对象
sessionScope 把session作用域中的数据映射为一个Map类的对象
applicationScope 把application作用域中的数据映射为一个Map类的对象
pageScope 、requestScope 、sessionScope 和 applicationScope都可以看成Map型变量,要获取其中的数据就可以使用点操作符或中括号操作符。另外,如果不指定作用域,EL表达式就会依次从pageScope -->requestScope -->sessionScope ---> applicationScope的范围内寻找。例如EL表达式在解析${student}时,就会先在pageContext作用域中查找是否有student属性,如果有则直接获取,如果没有则再会去request作用域中查找是否有student属性,以此类推。
2.参数访问对象
在JSP中,可以使用request.getParameter()和request.getParameterValues()来获取表单中的值(或地址栏、超链接中附带的参数值)。对应的,EL表达式可以通过param、paramValues来获取这些值,如下:
对象名 示例 作用
param ${param.userName} 等价于request.getParameter("userName")
paramValues ${paramValues.hobbies} 等价于request.getParameterValues("hobbies")
3.JSP隐式对象
pageContext是JSP的一个隐式对象,同时也是EL表达式的隐式对象。因此,pageContext是EL表达式与JSP之间的一个桥梁。在EL表达式中,可以通过pageContext来获取JSP的内置对象和ServletContext对象,如下:
EL表达式 获取对象
${pageContext.page} 获取page对象
${pageContext.request} 获取request对象
${pageContext.response} 获取response对象
${pageContext.session} 获取session对象
${pageContext.out} 获取out对象
${pageContext.exception} 获取exception对象
${pageContext.servletContext} 获取servletContext对象
还可以获取这些对象的getXxx()方法:例如${pageContext.request.studentNo}就表示访问request对象的getStudentNo()方法。可以发现,在使用时EL去掉了方法中的get和“()”,并将首字母改为了小写。
小结:
语法:${EL表达式}
其中,${ }中的“EL表达式”可以是一个作用域访问对象、参数访问对象或JSP隐式对象pageContext三者之一。并且EL表达式可以向HTML一样直接写在JSP页面中,而不用“<%...%>”括起来。