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表达式 java 不识别 java中el表达式_el表达式 java 不识别

注: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)案例效果

el表达式 java 不识别 java中el表达式_javaweb_02

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>

案例效果:

 

el表达式 java 不识别 java中el表达式_java_03