EL表达式

语法格式:

${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"%>




Insert title here


        <%
            //类没有引入,记得在JSP文件最上面引入Student类 import="entity.Student"
           Student student = (Student)request.getAttribute("student");
           String stuName = student.getStuName();
           int stuNo = student.getStuNo();
           Address address = student.getAddress();
           String schoolAddress = address.getSchoolAddress();
           String homeAddress = address.getHomeAddress();
           out.print("学号:"+student.getStuNo()+"
");
           out.print("姓名:"+student.getStuName()+"
");
           out.print("学校:"+address.getSchoolAddress()+"
");
           out.print("家庭地址:"+address.getHomeAddress());
        %>       

EL表达式_第1张图片

以上是使用传统的Scriptlet接受对象,并将对象的属性显示到前台,如果使用EL表达式来实现,就会简单许多:

<%@ page language="java" import="entity.Student" import="entity.Address" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>




Insert title here


    
                                学生对象:${requestScope.student}

                                学号:${requestScope.student.stuNo}

                                 姓名:${requestScope.student.stuName}

                                 学校:${requestScope.student.address.schoolAddress }

                                 家庭住址:${requestScope.student.address.homeAddress }

EL表达式_第2张图片

使用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 = new HashMap();
         countries.put("US", "美国");
         countries.put("CN", "中国");
         request.setAttribute("countries", countries);
         request.getRequestDispatcher("jsp/stu.jsp").forward(request, response);
    }

 


        US:${countries.US}

        CN:${countries["CN"] }                

EL表达式_第3张图片

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变量:${empty temp }

                   变量dog为空:${empty dog }

                   变量test已经被赋值:${empty test }                            

EL表达式_第4张图片

 

之前不存在的变量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页面中,而不用“<%...%>”括起来。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

你可能感兴趣的:(EL表达式)