文章目录
一、什么是EL表达式,有什么用
EL表达式全称:Expression Language。是表达式语言。
作用:主要用来替代jsp页面中的表达式脚本在jsp页面中进行数据的输出。(具体主要是输出域对象的数据)
优点:在输出数据时,比jsp额表达式脚本要简介得多。
格式/语法(在jsp文件中使用):
${表达式}
二、用法
2.1 最简单的使用
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<%
request.setAttribute("key","123456");
%>
<%--最简单的使用方法,取key的值--%>
key值:${key}
<br>
<%--如果取的值为空,那么不会输出什么null或者undefine--%>
name值:${name}
</body>
</html>
运行结果:
2.2. EL表达式搜索域数据的顺序
说到域,这里说一下,jsp中的域对象主要有四个:
1、pageContext(数据只在当前页面有效,请求转发后无效)
2、request(数据在当前请求有效,请求转发后有效,重定向无效)
3、session(数据在关闭浏览器前有效)
4、application(数据在关闭服务器前有效)
而EL表达式所有域的顺序也是从小到大的,也就是跟上面的顺序一样:pageContext > request > session > application
也就是说,如果现在四个域都存储了一个Attribute叫做key,我们使用EL表达式${key} 会优先输出pageContext的。
2.3. EL表达式输出复杂的Bean对象
假如现在有以下Bean需要输出。
package com.hstc.edu.EL;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
public class Product {
private String name;
private Double[] prices;
private List<String> cities;
private Map<String, Object> map;
@Override
public String toString() {
return "Product{" +
"name='" + name + '\'' +
", prices=" + Arrays.toString(prices) +
", cities=" + cities +
", map=" + map +
'}';
}
public Product(String name, Double[] prices, List<String> cities, Map<String, Object> map) {
this.name = name;
this.prices = prices;
this.cities = cities;
this.map = map;
}
public Product() {
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Double[] getPrices() {
return prices;
}
public void setPrices(Double[] prices) {
this.prices = prices;
}
public List<String> getCities() {
return cities;
}
public void setCities(List<String> cities) {
this.cities = cities;
}
public Map<String, Object> getMap() {
return map;
}
public void setMap(Map<String, Object> map) {
this.map = map;
}
}
那么,我们在jsp下的代码如下(以下代码说明了几乎所有常用的基本或者非基本类型使用EL表达式的输出方式):
最主要的代码如下:
直接输出product:${product}
<br>
只输出product的name属性:${product.name}
<h2>注意:无法使用product.prices直接输出数组的所有值</h2>
<br>
只输出product的prices数组中某一个属性:${product.prices[0]}
<br>
输出product的cities集合:${product.cities}
<br>
输出product的cities集合中个别元素:${product.cities[0]}
<br>
输出product的Map集合:${product.map}
<br>
输出product的Map集合中某个值:${product.map.key1} 或者 ${product.map["key1"]}
<br>
完整的代码如下:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>EL输出复杂的Bean对象</title>
</head>
<body>
<%
Product product = new Product();
product.setName("冰淇淋");
product.setPrices(new Double[]{1.0,1.5,2.0,3.0,5.0});
List<String> cities = new ArrayList<String>();
cities.add("汕头");
cities.add("广州");
cities.add("深圳");
cities.add("上海");
cities.add("北京");
product.setCities(cities);
Map<String ,Object> map = new HashMap<>();
map.put("key1","value1");
map.put("key2","value2");
map.put("key3","value3");
product.setMap(map);
//将product对象存入request
request.setAttribute("product",product);
%>
直接输出product:${product}
<br>
只输出product的name属性:${product.name}
<h2>注意:无法使用product.prices直接输出数组的所有值</h2>
<br>
只输出product的prices数组中某一个属性:${product.prices[0]}
<br>
输出product的cities集合:${product.cities}
<br>
输出product的cities集合中个别元素:${product.cities[0]}
<br>
输出product的Map集合:${product.map}
<br>
输出product的Map集合中某个值:${product.map.key1} 或者 ${product.map["key1"]}
<br>
</body>
</html>
显示结果如下:
2.4. EL表达式的关系运算
2.5. EL表达式的逻辑运算
2.6. EL表达式的算术运算
算术运算符 | 说明 | 范例 | 结果 |
---|---|---|---|
+ | 加法 | ${12 + 18} | 30 |
- | 减法 | ${18 - 8} | 10 |
* | 乘法 | ${12 * 12} | 144 |
/ 或 div | 除法 | ${144 / 2} 或 ${144 div 12} | 12.0 |
% 或 mod | 取模 | ${144 % 10} 或 ${144 mod 10} | 4 |
2.7. empty运算
作用:判断一个数据是否为空,若为空,输出true,否则输出false。
满足数据为空的五种情况:
1、值为null
2、字符串为空串的时候
3、数组长度为0
4、list集合的元素个数为0
5、map集合的元素个数为0
在jsp脚本下使用如下:
${ empty 参数名}
例如:
<%@ page import="java.util.ArrayList" %>
<%@ page import="java.util.HashMap" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<%
request.setAttribute("key1",null);
request.setAttribute("key2","");
request.setAttribute("key3",new String[]{});
request.setAttribute("key4",new ArrayList<Integer>());
request.setAttribute("key5",new HashMap<>());
%>
key1 = ${empty key1}<br>
key2 = ${empty key2}<br>
key3 = ${empty key3}<br>
key4 = ${empty key4}<br>
key5 = ${empty key5}<br>
</body>
</html>
显示如下:
2.8. EL表达式的三元运算
其实就是Java中的
表达式1 ? 表达式2 : 表达式3
比如: 1 == 1 ? true : false
也就是如果1 等于 1 的话,那么就输出true,否则输出false。
具体无非就是加个${}变成:
${1==1?true:false}
2.9. EL表达式的11个隐含对象
变量 | 类型 | 作用 |
---|---|---|
pageContext | PageContextImpl | 它可以获取jsp中的九大内置对象 |
pageScope | Map<String,Object> | 它可以获取pageContext域中的数据 |
requestScope | Map<String,Object> | 它可以获取request域中的数据 |
sessionScope | Map<String,Object> | 它可以获取session域中的数据 |
applicationScope | Map<String,Object> | 它可以获取servletContext域中的数据 |
param | Map<String, String> | 它可以获取请求参数的值 |
paramValues | Map<String,String[]> | 它可以获取请求参数的值,获取多个值的时候使用 |
header | Map<String,String> | 它可以获取请求头的信息 |
headerValues | Map<String,String[]> | 它可以获取请求头的信息,获取多个值的时候使用 |
cookie | Map<String,Cookie> | 它可以获取当前请求的Cookie信息 |
initParam | Map<String, String> | 它可以获取在web.xml中配置的<context-param>的上下文参数 |
这里说一个点:上面提到过一个域的优先级的问题,如果你实在想在一个jsp页面使用多个域,而且起的Attribute的名称又一样,还想跳过这层优先级,那么就可以使用上面的例如requestScope.Attribute的键来获取。
举个例子吧:
现在你的Attribute设置如下:
<%
pageContext.setAttribute("key","pageValue");
request.setAttribute("key","requestValue");
%>
那么获取这两个key 的代码如下:
pageContext.key = ${key} 或者 ${pageScope.key}
<br>
request.key = ${requestScope.key}
显示(为了证明这是对的,特地贴个图):
2.10. EL表达式pageContext对象的作用
主要用于获取以下7个数据:
1、协议
2、服务器ip
3、服务器端口
4、工程路径
5、请求方法
6、客户端ip
7、会话的id编号
具体例子,剑来!直接一波代码强烈输出:
在jsp文件中代码如下:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>pageContext的七大作用</title>
</head>
<body>
<h1>利用EL表达式的pageContext对象获取以下七个数据</h1>
<br>
1、协议:${pageContext.request.scheme}
<br>
2、服务器ip:${pageContext.request.serverName}
<br>
3、服务器端口:${pageContext.request.serverPort}
<br>
4、工程路径:${pageContext.request.contextPath}
<br>
5、请求方法:${pageContext.request.method}
<br>
6、客户端ip:${pageContext.request.remoteHost}
<br>
7、会话的id编号:${pageContext.session.id}
<br>
</body>
</html>
显示如下:(这里因为访问的是自己的电脑,所以客户端的ip是自己的ip)
有人可能会觉得,不是吧老哥,这么长,怎么记,其实有个更容易的写法,我们把request和session放到pageContext域中,修改代码如下:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>pageContext的七大作用</title>
</head>
<body>
<%
pageContext.setAttribute("req",request);
pageContext.setAttribute("ses",session);
%>
<h1>利用EL表达式的pageContext对象获取以下七个数据</h1>
<br>
1、协议:${req.scheme}
<br>
2、服务器ip:${req.serverName}
<br>
3、服务器端口:${req.serverPort}
<br>
4、工程路径:${req.contextPath}
<br>
5、请求方法:${req.method}
<br>
6、客户端ip:${req.remoteHost}
<br>
7、会话的id编号:${ses.id}
<br>
</body>
</html>
运行结果也是一样的:
2.11. EL表达式另外几个隐含对象的用法(param、paramValues、header、headerValues、cookie、initParam)
2.11.1. param、paramValues
首先是param和paramValues,主要用来获取请求参数的值,也就是网页后边加?的参数。比如:
jsp如下:
username = ${param.username}<br>
hobbies = ${param.hobby}<br>
hobbies = ${paramValues.hobby[0]} and ${paramValues.hobby[1]}<br>
那么使用此链接(http://localhost:8080/EL/other.jsp?username=Keeling&hobby=eat&hobby=drink)获得的显示为:
param的获取就不用说了,主要说一下,如果hobby有两个值的话,那么param只能输出第一个值,此时就必须使用paramValues对象
如果直接输出${paramValues.hobby}会怎么样呢,请看
2.11.2. header、headerValues
直接贴代码
获取整个请求头:${header}<br>
获取请求头[User-Agent]的值:${header['User-Agent']}<br>
<%--因为是headerValues所以要取0来得到值,headerValues['Connection']相当于拿到一个数组--%>
获取请求头[Connection]的值:${headerValues['Connection'][0]}<br>
显示:
2.11.3. cookie
获取cookie的名称:${cookie.JSESSIONID.name}<br>
获取cookie的值:${cookie.JSESSIONID.value}<br>
显示:
这个Cookie怎么看呢?打开网页,按F12,打开Network,然后找到当前的网页文件即可查看我们的Cookie的详细信息。
如果要获取他的NMTID值,那么用以下代码,其他的也基本类似:
获取cookie的名称:${cookie.NMTID.name}<br>
获取cookie的值:${cookie.NMTID.value}<br>
但是注意,有特殊字符的名称要用中括号[“”],比如Idea-8296e771(±*/、!~等等都算特殊字符)
2.11.4. initParam
在web.xml中配置:
然后在jsp中获取如下:
${initParam.username}
${initParam.url}
如果要获取所有的数据,那么也可以直接用
${initParam}