JavaWeb详解(第五篇)之EL表达式简介
Posted 穆瑾轩
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JavaWeb详解(第五篇)之EL表达式简介相关的知识,希望对你有一定的参考价值。
JavaWeb详解(第五篇)之EL表达式简介
1、EL表达式概述
1.1、什么是EL表达式
EL是JSP表达式语言,全称是Expression Language(EL)。 EL表达式使用"${}"表示,用来更方便的读取对象!
1.2、为什么要使用EL表达式?
EL 表达式主要是代替 jsp 页面中的表达式脚本在 jsp 页面中进行数据的输出。EL 表达式在输出数据的时候, 要比 jsp 的表达式脚本要简洁很多 。
EL具有如下特点:
-
可得到PageContext属性值
-
可直接访问JSP的内置对象,如page,request, session,application等
-
运算符丰富,有关系运算符、逻辑运算符、算术运算符等
-
扩展函数可与JAVA类的静态方法对应
使用案例:
1)新建一个e.jsp
<%@ page contentType="text/html;charset=GBK" language="java"%>
<!DOCTYPE html>
<html>
<head>
<title>el.jsp</title>
</head>
<body>
<h1>el.jsp</h1>
<%
request.setAttribute("key", "request");
session.setAttribute("key", "session");
pageContext.setAttribute("key", "pageContext");
%>
使用jsp表达式获取:<%=pageContext.getAttribute("key") %><br>
使用jsp表达式获取不存在的属性:<%=pageContext.getAttribute("key1") %><br>
使用el表达式:${key}<br>
使用el表达式获取不存在的属性:${key1}
</body>
</html>
2)案例效果:
注:EL 表达式在输出 null 值的时候, 输出的是空串。 jsp 表达式脚本输出 null 值的时候, 输出的是 null 字符串。
3)编译后的部分源码
out.write(" 使用jsp表达式获取:");
out.print(pageContext.getAttribute("key") );
out.write("<br>\\r\\n");
out.write(" 使用jsp表达式获取不存在的属性:");
out.print(pageContext.getAttribute("key1") );
out.write("<br>\\r\\n");
out.write(" 使用el表达式:");
//对EL表达式方法调用的支持
out.write((java.lang.String) org.apache.jasper.runtime.PageContextImpl.proprietaryEvaluate("${key}", java.lang.String.class, (javax.servlet.jsp.PageContext)_jspx_page_context, null));
out.write("<br>\\r\\n");
out.write(" 使用el表达式获取不存在的属性:");
out.write((java.lang.String) org.apache.jasper.runtime.PageContextImpl.proprietaryEvaluate("${key1}", java.lang.String.class, (javax.servlet.jsp.PageContext)_jspx_page_context, null));
1.3、EL表达式语法
基本语法:
${表达式}
${"hello world"} //输出字符串常量
${ str } //输出字符串变量str的值
${ 3 + 2 } //输出3+2的结果
${ user.name } //输出user对象的name属性
${ user["name"] } //同上
${sessionScope["user"].name } //同上
2、EL表达式的使用
EL表达式主要是输出域对象的数据。当四个域中都有相同的 key 的数据的时候, EL 表达式会按照四个域的从小到大的顺序去进行搜索, 找到就输出。
在前面我们已经体验过${key}
的使用了。对于没有指定范围的JSP容器会先从page范围找。假如找不到,再依序到request、session、application范围查找顺序(优先级:pageContext>request>session>application),此过程中找到了变量将不再找下去。如果没有找到,自动将 null 转成“”。
那如果我们想要获取指定域中的数据呢?
其实EL隐含了11个对象,它们分别是:
1)与域有关的隐含对象
隐含对象 | 类型 | 说明 |
---|---|---|
PageScope | java.util.Map | 取得Page范围的属性名称所对应的值 |
RequestScope | java.util.Map | 取得Request范围的属性名称所对应值 |
sessionScope | java.util.Map | 取得Session范围的属性名称所对应的值 |
applicationScope | java.util.Map | 取得Application范围的属性名称所的值 |
2)与输入有关的隐含对象
隐含对象 | 类型 | 说明 |
---|---|---|
param | java.util.Map | 如同ServletRequest.getParameter(String name)回传String类型的值 |
paramValues | java.util.Map | 如同ServletRequest.getParameterValues(String name)。回传String []类型的值 |
3)其他隐含对象
隐含对象 | 类型 | 说明 |
---|---|---|
header | java.util.Map | 如同ServletRequest.getHeader(String name)回传String 类型的值 |
headerValues | java.util.Map | 如同ServletRequest.getHeaders(String name)。回传String []类型的值 |
cookie | java.util.Map | 如同HttpServletRequest.getCookies( ) |
initParam | java.util.Map | 如同ServletContext.getInitParameter(String name)。回传String 类型的值 |
PageContext | javax.servlet.ServletContext | 表示此JSP页面上下文 |
2.1、获取域对象数据
与范围有关的隐含对象,都是Map类型的。通过${域对象.key}获取
使用案例:
<%@ page contentType="text/html;charset=GBK" language="java"%>
<!DOCTYPE html>
<html>
<head>
<title>el.jsp</title>
</head>
<body>
<h1>el.jsp</h1>
<%
request.setAttribute("key", "request");
session.setAttribute("key", "session");
pageContext.setAttribute("key", "pageContext");
%>
以前使用jsp表达式获取指定域对象的值:<%=session.getAttribute("key") %><br>
使用el表达式获取指定域对象的值:${sessionScope.key}
</body>
</html>
2.2、获取输入或其他有关的隐含对象
2.2.1、获取输入有关的隐含对象
以前在JSP中获得用户的请求参数:
• request.getParameter(String name)
• request.getParameterValues(String name)
在EL中则可以使用param和paramValues
• ${param.name}
• ${paramValues.name}
2.2.2、其他有关的隐含对象
<body>
<li>${pageContext.request }</li>
<li>${pageContext.response }</li>
<li>${pageContext.page }</li>
<li>请求的参数:${pageContext.request.queryString }</li>
<li>请求的URL:${pageContext.request.requestURL }</li>
<li>WEB 应用的名字${pageContext.request.contextPath }</li>
<li>请求的方式:${pageContext.request.method }</li>
<li>使用的协议:${pageContext.request.protocol }</li>
<li>用户的名字:${pageContext.request.remoteUser }</li>
<li>获取用户的IP地址:${pageContext.request.remoteAddr }</li>
<%-- <li>判断session 是否是新的:${pageContext.session.new }</li> --%>
<li>获得 session 的 id:${pageContext.session.id }</li>
<li>获取主机信息:${pageContext.servletContext.serverInfo }</li>
</body>
2.3、获取JavaBean的属性
使用EL表达式输出 Bean 的普通属性、数组属性、List 集合属性、 map 集合属性。
使用案例:
1)新建一个Person类
package com.cn.domain;
import java.util.List;
import java.util.Map;
public class Person {
private String name;
private String[] phones;
private List<String> cities;
private Map<String,Object> map;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String[] getPhones() {
return phones;
}
public void setPhones(String[] phones) {
this.phones = phones;
}
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;
}
}
2)el.jsp
<%@page import="java.util.*"%>
<%@ page contentType="text/html;charset=GBK" language="java"%>
<!DOCTYPE html>
<html>
<head>
<title>el.jsp</title>
</head>
<body>
<h1>el.jsp</h1>
<%-- 设置JavaBean属性--%>
<jsp:useBean id="person" class="com.cn.domain.Person" scope="page"/>
<%
person.setName("mjx");
person.setPhones(new String[]{"18877777777","1876666666","18655555555"});
List<String> cities = new ArrayList<String>();
cities.add("北京");
cities.add("上海");
cities.add("深圳");
person.setCities(cities);
Map<String,Object>map = new HashMap<>();
map.put("key1","value1");
map.put("key2","value2");
map.put("key3","value3");
person.setMap(map);
%>
以前在jsp中获取对象JavaBean(String)属性:<%=person.getName() %><br>
以前在jsp中获取对象JavaBean(String[])属性:<%=person.getPhones()[0] %><br>
以前在jsp中获取对象JavaBean(List)属性:<%=person.getCities().get(0) %><br>
以前在jsp中获取对象JavaBean(Map)属性:<%=person.getMap().get("key1") %><br>
使用el表达式获取对象属性:${person.name}<br>
使用el表达式获取对象属性:${person.phones[0]}<br>
使用el表达式获取对象属性:${person.cities[0]}<br>
使用el表达式获取对象属性:${person.map.key1}
</body>
</html>
3)案例效果
2.4、EL 表达式的运算符
EL运算符分为四大类:
1)EL 算术运算符;
2)EL 关系运算符;
3)EL 逻辑运算符;
4)EL 其他运算符;
2.4.1、EL 算术运算符
算数运算符 | 说 明 | 范 例 | 结果 |
---|---|---|---|
+ | 加法 | ${ 12 + 18 } | 30 |
- | 减法 | ${ 18 - 8 } | 10 |
* | 乘法 | ${ 12 * 12 } | 144 |
/ 或 div | 除法 | ${ 144 / 12 } 或 ${ 144 div 12 } | 12 |
% 或 mod | 取模 | ${ 144 % 10 } 或 ${ 144 mod 10 } | 4 |
2.4.2、EL 关系运算符
关系运算符 | 说 明 | 范 例 | 结果 |
---|---|---|---|
== 或 eq | 等于 | ${ 5 == 5 } 或 ${ 5 eq 5 } | true |
!= 或 ne | 不等于 | ${ 5 !=5 } 或 ${ 5 ne 5 } | false |
< 或 lt | 小于 | ${ 3 < 5 } 或 ${ 3 lt 5 } | true |
> 或 gt | 大于 | ${ 2 > 10 } 或 ${ 2 gt 10 } | false |
<= 或 le | 小于等于 | ${ 5 <= 12 } 或 ${ 5 le 12 } | true |
>= 或 ge | 大于等于 | ${ 3 >= 5 } 或 ${ 3 ge 5 } | false |
2.4.3、EL 逻辑运算符
逻辑运算符 | 说 明 | 范 例 | 结果 |
---|---|---|---|
&& 或 and | 与运算 | ${ 12 == 12 && 12 < 11 } 或 ${ 12 == 12 and 12 < 11 } | false |
|| 或 or | 或运算 | ${ 12 == 12 || 12 < 11 } 或 ${ 12 == 12 or 12 < 11 } | true |
! 或 not | 取反运算 | ${ !true } 或 ${not true } | false |
2.4.4、EL 其他运算符
运算符 | 说 明 | 范 例 | 结果 |
---|---|---|---|
empty | 验证运算符 | ${empty null}或者${empty “”} | true |
表达式 1? 表达式 2: 表达式 3 | 三元运算 | ${ 1 == 1 ? "对":"错" } | 对 |
. | “.”点运算 | obj.key | |
[] | []中括号运算符 | map['a.a'] |
使用案例:
<%@page import="java.util.*"%>
<%@ page contentType="text/html;charset=GBK" language="java"%>
<!DOCTYPE html>
<html>
<head>
<title>el.jsp</title>
</head>
<body>
<h1>el.jsp</h1>
<%-- 设置JavaBean属性--%>
<jsp:useBean id="person" class="com.cn.domain.Person" scope="page"/>
<%
person.setName("mjx");
person.setPhones(new String[]{"18877777777","1876666666","18655555555"});
List<String> cities = new ArrayList<String>();
cities.add("北京");
cities.add("上海");
cities.add("深圳");
person.setCities(cities);
Map<String,Object>map = new HashMap<>();
map.put("key1","value1");
map.put("key2","value2");
map.put("key3","value3");
person.setMap(map);
%>
算数运算符:${5+5}<br>
关系运算符:${6>1} 或 ${6 gt 1}<br>
逻辑运算符:${!true} 或 ${not true}<br>
验证运算符:${empty null}<br>
三元运算符:${ 1 == 1 ? "对":"错" }<br>
点运算符和中括号运算符:${person.map['key1']}
</body>
</html>
案例效果:
以上是关于JavaWeb详解(第五篇)之EL表达式简介的主要内容,如果未能解决你的问题,请参考以下文章