随笔都是学习笔记
随笔仅供参考,为避免笔记中可能出现的错误误导他人,请勿转载。

简介:

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

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

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

隐含对象描述
pageScope page 作用域
requestScope request 作用域
sessionScope session 作用域
applicationScope application 作用域
param Request 对象的参数,字符串
paramValues Request对象的参数,字符串集合
header HTTP 信息头,字符串
headerValues HTTP 信息头,字符串集合
initParam 上下文初始化参数
cookie Cookie值
pageContext 当前页面的pageContext

全域查找:

${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>title</title>
</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.jsp</title>
</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/>


<!-- 下面输出只有get方法没有成员属性的内容 --> ${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.jsp</title>
</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>title</title>
</head>
<body>
<h1>这里是header的a.jsp</h1>
${header['User-Agent'] }<br/>
${header.Host }<br/>
</body>
</html>

启动服务器访问a.jsp:

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

 

初始化参数内置对象:

initParam:获取<context-param>中的参数

在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>day0424</display-name>
  <context-param>
  <param-name>a</param-name>
  <param-value>AAA</param-value>
  </context-param>
  <context-param>
  <param-name>b</param-name>
  <param-value>BBB</param-value>
  </context-param>
  <context-param>
  <param-name>c</param-name>
  <param-value>CCC</param-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>title</title>
</head>
<body>
<h1>这里是initParam</h1>
${initParam.a }<br/>
${initParam.b }<br/>
${initParam.c }<br/>
</body>
</html>

访问a.jsp:

 

cookie相关内置对象

 这个内置对象是Map<String,Cookie>类型,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>title</title>
</head>
<body>
<h1>cookie的JSP</h1>
<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>title</title>
</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>

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

 

posted on 2022-04-26 13:08  时间完全不够用啊  阅读(278)  评论(0编辑  收藏  举报