简介:
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>
1 | 启动服务器访问:http: //localhost:8080/day0426/params/a.jsp?username=dasdaqsfas&hobby=sw&hobby=ssw |
我在访问地址后面添加了参数,访问界面输出了我添加的参数。
将EL表达式修改为:
1 2 | ${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>
这样设置就不用担心修改项目名带来的麻烦了。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)