EL表达式(十一个内置对象)


简介:

EL表达式是JSP内置的表达式

EL替代的是java脚本中的<%=.....%>标签,也就是说只能做输出操作

EL有十一个内置对象,除了pageContext外都是map,想要使用其中的值,可以直接使用map.key或map['key']的形式获取value

 

全域查找:

${xxx}

如果xxx不存在则输出空字符串,而不是null;

测试代码:

新建一个JSP:

<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>titletitle>
head>
<body>
<%
    pageContext.setAttribute("xxx", "pageContext");
    request.setAttribute("xxx", "request");
    session.setAttribute("xxx", "session");
    application.setAttribute("xxx", "application");
%>
${xxx}
body>
html>

在输出一次后就将四大域的前面一个注释掉,观察输出值:

第一次输出:

 

第二次输出:

第三次输出:

第四次输出:

可以发现第四次输出与第三次输出一样,原因就是在第三次输出的时候,session已经设置完成,而我并没有进行删除session或者退出浏览器的操作,所以第四次依然会输出session,那么退出一次浏览器再次访问:

输出的就是第四个域的值。

查找指定域的值:

${pageScope.xxx }<br/>
${requestScope.xxx }<br/>
${sessionScope.xxx }<br/>
${applicationScope.xxx }<br/> 

输出结果:

JavaBean导航

首先创建两个相互联系的JavaBean:

Employee类:

package bean;
import java.util.Objects;
public class Employee {
    private String name;
    private double salary;
    private Address address;
    public String getHehe() {
        return "呵呵~wdnmd!";
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public double getSalary() {
        return salary;
    }
    public void setSalary(double salary) {
        this.salary = salary;
    }
    public Address getAddress() {
        return address;
    }
    public void setAddress(Address address) {
        this.address = address;
    }
    @Override
    public String toString() {
        return "Employee [ name=" + name + ", salary=" + salary + ", address=" + address + " ]";
    }
    @Override
    public int hashCode() {
        return Objects.hash(address, name, salary);
    }
    @Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        Employee other = (Employee) obj;
        return Objects.equals(address, other.address) && Objects.equals(name, other.name)
                && Double.doubleToLongBits(salary) == Double.doubleToLongBits(other.salary);
    }
    
}

Address类:

package bean;
import java.util.Objects;
public class Address {
    private String city;
    private String street;
    public Address() {
    }
    public String getCity() {
        return city;
    }
    public void setCity(String city) {
        this.city = city;
    }
    public String getStreet() {
        return street;
    }
    public void setStreet(String street) {
        this.street = street;
    }
    @Override
    public int hashCode() {
        return Objects.hash(city, street);
    }
    @Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        Address other = (Address) obj;
        return Objects.equals(city, other.city) && Objects.equals(street, other.street);
    }
    @Override
    public String toString() {
        return "[ city=" + city + ", street=" + street + " ]";
    }
}

然后再创建一个JSP:<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>

<%@ page import="bean.*" %>
DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>b.jsptitle>
head>
<body>
<%
    Address as = new Address();
    as.setCity("广东");
    as.setStreet("东大街");
    
    Employee em = new Employee();
    em.setName("张三");
    em.setSalary(2000);
    em.setAddress(as);
    
    request.setAttribute("em", em);
%>

<h1>使用EL获取request域中属性信息h1>

${requestScope.em.getAddress().getStreet() }<br/>
${requestScope.em.address.street }<br/>


${em.hehe }<br/> body> html>

输出:

可以发现,只需要指定域中有JavaBean对象存在,那么就只用 . 就能调用其中的方法或属性

而如果JavaBean中只有getXxx()方法,没有xxx属性,也能得到其方法内容。

参数内置对象:

parms操作单值参数、paramValues操作多值参数返回数组:

<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>parms_a.jsptitle>
head>
<body>
<h1>这里是a.jsp资源h1>
${param.username }
${paramValues.hobby }
body> html>
启动服务器访问:http://localhost:8080/day0426/params/a.jsp?username=dasdaqsfas&hobby=sw&hobby=ssw

我在访问地址后面添加了参数,访问界面输出了我添加的参数。

将EL表达式修改为:

${paramValues.hobby[0] }
${paramValues.hobby[1] }

查看输出结果:

请求头内置对象:

header(单值求请头)、headerValues(多值请求头)

<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>titletitle>
head>
<body>
<h1>这里是header的a.jsph1>
${header['User-Agent'] }
${header.Host }
body> html>

启动服务器访问a.jsp:

可以发现输出了浏览器头信息和ip:端口

初始化参数内置对象:

initParam:获取中的参数

在web.xml中配置初始化参数:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd" version="4.0">
  <display-name>day0424display-name>
  <context-param>
  <param-name>aparam-name>
  <param-value>AAAparam-value>
  context-param>
  <context-param>
  <param-name>bparam-name>
  <param-value>BBBparam-value>
  context-param>
  <context-param>
  <param-name>cparam-name>
  <param-value>CCCparam-value>
  context-param>
web-app>

 使用${initParam.a}来获取a对应的值。

a.jsp:

<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>titletitle>
head>
<body>
<h1>这里是initParamh1>
${initParam.a }<br/>
${initParam.b }<br/>
${initParam.c }<br/>
body>
html>

访问a.jsp:

 

cookie相关内置对象

 这个内置对象是Map类型,key是String,但是value是Cookie对象。

访问页面会自动创建一个JSESSIONID在cookie中,所以不用创建新cookie,直接查看:

<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>titletitle>
head>
<body>
<h1>cookie的JSPh1>
<b>
${cookie.JSESSIONID.value }
b>
body>
html>

访问a.jsp:

其中${cookie.JSESSIONID}表达式获取的是一个Cookie对象,所以还需要加上.value才是值。

如果是${cookie.JSESSIONID.name } :

 

pageContext内置对象

这个就是pageContext类型,不是Map类型。

 

<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>titletitle>
head>
<body>
<h1>pageContext的页面h1>
<b>
${pageContext.request.contextPath }
b>
body>
html>

访问a.jsp:

 

${pageContext.request } 可以获取request对象,而${pageContext.request.contextPath } 可以获取项目路径

现在可以很容易就能想到一个问题,那就是项目名的修改,如果是使用这种方式来设置项目名有关路径,那么不论项目名怎么修改,相关路径都能跟着修改,而不需要将每一个相关路径都修改一遍。

例如:

<a href="${pageContext.request.contextPath }/cookie/a.jsp">点击这里a><br/>

<form action="${pageContext.request.contextPath }/AServlet"><br/>
<input type="text" method="post"/><br/>
<input type="submit" value="提交"/><br/>
form>

这样设置就不用担心修改项目名带来的麻烦了。

JSP