EL表达式的主要作用

1)获取数据。EL使得获取JavaBean中的数据变得非常简单,也可以替换JSP页面中的脚本元素,从各种类型的web域中获取数据。

2)执行运算。利用EL表达式可以在JSP页面中执行一些基本的算术运算、关系运算、逻辑运算。

3)获取web开发常用对象,EL中定义了11个内置对象可以直接使用。

4)调用Java方法。EL表达式允许用户开发自定义EL函数,从而在JSP页面中通过EL表达式调用Java类的方法。

EL表达式的语法

以“${”开始,以“}”结束。

对于一系列的表达式,其取值将从左向右进行,计算结果的类型为String,并且连接在一起。

如果在定制标签的属性值中使用EL表达式,那么该表达式的取值结果字符串将会强制转换成该属性需要的类型

${标识符}
<!-- 如果 a=2,b=6,c=4,d=6 -->
${a+b}and${c+d} <!-- 返回 8and10 -->

EL表达中的关键字

这些关键字不能作为标识符

div mod               <!-- 算术运算符 -->
eq ne gt ge lt le <!-- 关系运算符 -->
and or not <!-- 逻辑运算符 -->
true false <!-- 逻辑值 -->
instanceof empty null

EL表达式可以返回任意类型的值,包括JavaBean

如果EL表达式的值是一个带有属性的对象,则可以使用“[]”或“.”运算符来访问该属性值。

${Object["propertyName"]}  <!-- 规范形式,任何情形下都能使用 -->
${Object.propertyName} <!-- 仅在propertyName是有效的Java变量名时使用(即字母、数字、下划线、$)-->
${header["host"]} <!-- 正确 -->
${header.host} <!-- 正确 -->
${header["accept-language"]} <!-- 正确 -->
${header.accept-language} <!--错误,accept-language不是有效的Java变量名-->

如果对象的属性也是一个对象,则可以继续使用“[]”或“.”访问第二个对象的属性。

${pageContext["request"]["servletPath"]}
${pageContext["request"].servletPath}
${pageContext.request.["servletPath"]}
${pageContext.request.request}

EL的取值规则

EL表达式的取值是从左向右进行的,对于expr-a["expr-b"],其EL表达式的取值方法如下:

首先计算 expr-a 得到 value-a,如果 value-a 为 null,则返回 null

然后计算 expr-b 得到 value-b,如果 value-b 为 null,则返回 null

如果 value-a 是 java.util.Map,则会查看 value-b 是否为 Map 的一个 key,若是则返回 value-a.get(value-b),若不是,则返回 null

如果 value-a 是 java.util.List 或者 array,分一下三种情况:

a、如果 value-b 强制转换为 int 失败,返回 null;

b、如果 value-a.get(value-b) 抛出 IndexOutOfBoundsException 异常,或者 Array.get(value-a, value-b) 抛出 ArrayIndexOutOfBoundsException 异常,则返回 null

c、否则,若 value-a 是一个 List,返回 value-a.get(value-b);若 value-a 是一个 array,返回 Array.get(value-a, value-b)

若果 value-a 不是一个 Map、List 或者 array,那么 value-a 必须是一个 JavaBean,此时需要将 value-b 强制转换成 String,如果 value-b 是 value-a 的一个可读属性,则要调用该属性的getter()方法从中返回值。

EL表达式取值的原理

在执行 ${标识符} 时,会调用pageContext.findAtrribute()方法,用标识符作为关键字,分别从page、request、session、application四个域中查找相应的对象并返回,找不到则返回空串""

在获取某个对象(包括JavaBean)的属性时,先将该属性的首字母变成大写,然后加上get前缀,拼凑成getter方法,通过反射将该对象构建出来,再对该对象执行getter方法,故JavaBean的属性名要小些,且要有getter方法。

使用EL运算符

算术运算符

+ - * / div % mod
${1+2*3} <!-- 结果为7 -->

逻辑运算符

&& and  <!-- 与 -->
|| or <!-- 或 -->
! not <!-- 非 -->

关系运算符

== eq  <!-- 等于 -->
!= ne <!-- 不等于 -->
> gt <!-- 大于-->
>= ge <!-- 大于等于 -->
< lt <!-- 小于 -->
<= le <!-- 小于等于 -->

条件运算符

${statement ? A : B} <!-- statement为true执行A,false执行B -->
${(sessionScope.loggedIn == null) ? "You have not logged in" : "You have logged in"}

empty 运算符

用来检查某个值是否为null或者empty

${empty X}  <!-- 如果X为null、长度为0的空字符串、空Map、空数组、空集合,将返回True,否则返回False -->

禁用EL表达式

第一种方法:在page指令中将的isELignored属性设为True

第二种方法:在部署描述符(web.xml)中修改<jsp-property-group>元素

<!--  第一种 -->
<%@ page isELIgnored="True" %>
<!-- 第二种 -->
<jsp-config>
<jsp-property-group>
<url-pattern>*.jsp</url-pattern>
<el-ignored>true</el-ignored>
</jsp-property-group>
</jsp-config>

实例

一个JavaBean

package app04a.model;

public class Address {  // 一个JavaBean
private String streetName;
private String streetNumber;
private String city;
private String state;
private String zipCode;
private String country; public String getStreetName() {
return streetName;
}
public void setStreetName(String streetName) {
this.streetName = streetName;
}
public String getStreetNumber() {
return streetNumber;
}
public void setStreetNumber(String streetNumber) {
this.streetNumber = streetNumber;
}
public String getCity() {
return city;
}
public void setCity(String city) {
this.city = city;
}
public String getState() {
return state;
}
public void setState(String state) {
this.state = state;
}
public String getZipCode() {
return zipCode;
}
public void setZipCode(String zipCode) {
this.zipCode = zipCode;
}
public String getCountry() {
return country;
}
public void setCountry(String country) {
this.country = country;
}
}

一个JavaBean

package app04a.model;

public class Employee {  // 一个JavaBean
private int id;
private String name;
private Address address; public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Address getAddress() {
return address;
}
public void setAddress(Address address) {
this.address = address;
}
}

Servlet作为控制器

package app04a.model;

import java.io.IOException;
import java.util.HashMap;
import java.util.Map; import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; @WebServlet(name = "EmployeeServlet", urlPatterns = { "/","/employee" })
public class EmployeeServlet extends HttpServlet { // Servlet充当控制器 负责处理请求
private static final long serialVersionUID = 1L; public EmployeeServlet() {
super();
} @Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
Address address = new Address();
address.setStreetName("Rue D'Anjou");
address.setStreetNumber("5090B");
address.setCity("Brossard");
address.setState("Quebec");
address.setZipCode("A1A b2B");
address.setCountry("Canada"); Employee employee = new Employee();
employee.setId(1099);
employee.setName("Charles Unjeye");
employee.setAddress(address);
request.setAttribute("employee", employee); Map<String, String> capitals = new HashMap<String, String>();
capitals.put("China", "Beijing");
capitals.put("Austria", "Vienna");
capitals.put("Australia", "canberra");
capitals.put("Canada", "Ottawa");
request.setAttribute("capitals", capitals); RequestDispatcher requestDispatcher = request.getRequestDispatcher("/employee.jsp");
requestDispatcher.forward(request, response); // 将请求转发到JSP页面
} @Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}

JSP页面作为视图

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%-- JSP页面作为视图 负责显示 --%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Employee</title>
</head>
<body>
accept-language: ${header["accept-language"] } <br /> <%-- 使用EL隐式对象 --%>
session-id: ${pageContext["session"]["id"] } <br /> <%-- 使用EL隐式对象 --%>
employee: ${requestScope["employee"]["name"] }, ${employee["address"]["city"] } <br /> <%-- 访问JavaBean中的属性 --%>
capital: ${requestScope.capitals["Canada"] } <%-- 访问JavaBean中的属性 --%>
</body>
</html>

测试结果

编写EL函数

一般而言,编写EL函数需要以下三个步骤:

第一步:创建一个包含静态方法的public类。每个类的静态方法表示一个EL函数,这个类可以不需要实现任何借口或继承任何函数,这个类必须放在应用中的/WEB-INF/classes目录或者它的子目录下。

第二步:用fucntion节点在标签库描述器中注册这个函数。

第三步:要使用这个函数,必须将taglib指令中的uri属性指向标签库描述器,并指明使用的前缀。然后就可以在JSP页面中使用如下语法来访问该函数

${prefix:functionName(parameterList) }

function节点是taglib节点的下级节点,其有如下子节点

description         // 可选 标签说明
display-name // 在XML工具中显示的缩写的名字
icon // 可选,在XML工具中使用的icon节点
name // 函数的唯一名字
function-class // 该函数对应实现的java类的全名
fucntion-signature // 该函数对应实现的Java静态方法
example // 可选,使用该函数的实例说明
function-extension // 可以是一个或者多个节点,在XML工具中使用,用于提供该函数的更多细节

实例

创建一个包含静态方法的public类

package app06a.function;

public class StringFunctions {
public static String reverseString(String s) {
return new StringBuffer(s).reverse().toString();
}
}

用fucntion节点在标签库描述器中注册这个函数

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE taglib PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.2//EN" "http://java.sun.com/dtd/web-jsptaglibrary_1_2.dtd" >
<taglib>
<description>Function tag example</description>
<tlib-version>1.0</tlib-version>
<jsp-version>1.0</jsp-version>
<function>
<decription>Reverse a String</decription>
<name>reverseString</name>
<function-class>app06a.function.StringFunctions</function-class>
<function-signature>java.lang.String reverseString(java.lang.String)</function-signature>
</function>
</taglib>

使用这个函数

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib uri="/WEB-INF/functions.tld" prefix="f" %> <!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Testing EL Function</title>
</head>
<body>
${f:reverseString("Hello world") }
</body>
</html>

结果

EL(表达式语言)的更多相关文章

  1. JSP简明教程(四):EL表达式语言、JavaBean、Cookie、Session

    EL表达式语言 EL这是Expression Language.的目的是为了简化JSP句法.来看几个例子来清除. ${test} 它会被翻译成<%=test%> ${test.name} ...

  2. EL表达式语言

    EL (Expression Language) 目的:为了使JSP写起来更加简单.表达式语言的灵感来自于 ECMAScript 和 XPath 表达式语言,它提供了在 JSP 中简化表达式的方法. ...

  3. EL(表达式语言)

    EL(Expression Language):目的是为了简化Jsp页面的语言,使页面看起来更加简洁 基本的语法特点 以“${"开头,以”}“结束 一 与低版本的环境兼容----禁用EL ( ...

  4. 【JSP】EL表达式语言

    EL简介 EL语言原本是JSTL1.0中的技术(所以EL和JSTL配合如此亲密和默契也就是自然的了),但是从JSP2.0开始(JSTL1.1)就分离出来纳入了JSP的标准了.因此EL不需要任何jar包 ...

  5. JSP的EL表达式语言

    以下内容引用自http://wiki.jikexueyuan.com/project/jsp/expression-language.html: JSP表达式语言(EL)可以方便地访问存储在JavaB ...

  6. 11.EL(表达式语言)

    一.EL概述 EL(Expression Language,表达式语言)是JSP2.0 中引入的新内容.通过EL可以简化在JSP中对对象的引用,从而规范页面代码,增加程序的可读性和可维护性. 1.EL ...

  7. EL表达式语言总结

    EL介绍 Expressive Language, JSP2.0引入,简化jsp开发中对对象的引用. 基本语法 ${表达式} 常见用法 根据其访问对象,可大体分成三类:访问数据及其各种表达式,访问EL ...

  8. 表达式语言EL

    表达式语言EL 表达式语言 EL(Expression Language,表达式语言)主要是用在JSP页面中,用来辅助我们产生无脚本的JSP页面,此处的脚本指的是JSP中的Java代码. EL的语法是 ...

  9. java web学习总结(三十一) -------------------EL表达式

    一.EL表达式简介 EL 全名为Expression Language.EL主要作用: 1.获取数据 EL表达式主要用于替换JSP页面中的脚本表达式,以从各种类型的web域 中检索java对象.获取数 ...

  10. 11 JSP/EL表达式/EL函数

    JSP      * 概述: JSP(Java Server Pages)与Java Servlet一样,是在服务器端执行的不同的是先由服务器编译部署成Servlet执行      * JSP的运行原 ...

随机推荐

  1. 3G开发遇到的问题

    1.使用线程时,编译时要加上gcc xxx.c -o xxx -lpthread 2.分离字符串"abc,de,fgh" printf("%s",strtok ...

  2. python遇到的错误

    今天学习文件遇到这个错误. 这是在 text_files\vvvv.txt  之间加一个\ 就可以了,变成  text_files\\vvvv.txt,运行成功

  3. Maximum Likelihood及Maximum Likelihood Estimation

    1.What is Maximum Likelihood? 极大似然是一种找到最可能解释一组观测数据的函数的方法. Maximum Likelihood is a way to find the mo ...

  4. 解题6(OutputNMin)

    题目描述 输入n个整数,输出其中最小的k个. 详细描述: 接口说明 原型: bool GetMinK(unsignedint uiInputNum, int * pInputArray, unsign ...

  5. 8个纯CSS3制作的动画应用及源码

    对于一个复杂的图形或者动画来说,之前我们的处理方式是图片叠加或者利用CSS+JavaScript的方法,然而随着CSS3标准的不断成熟,我们甚至完全可以利用CSS3来绘制一些图片和制作丰富的动画特效. ...

  6. 学习DRF之前须知知识点

    在学习DRF之前~我们要先复习一些知识点~~ FBV和CBV 学习Django的时候~我们已经学习过了CBV以及FBV~~我们来复习一下~~ 什么是FBV和CBV呢~~ FBV 基于函数的视图 CBV ...

  7. 前端、数据库、Django简单的练习

    一.前端 1.前端页面由哪几层构成,分别是什么,作用是什么? 分为:结构层(html),表示层(css),行为层(js). 结构层 超文本标记语言.由HTML或XHTML之类的标记语言负责创建.标签, ...

  8. stm32DMA

    源和目标地址必须按数据传输宽度对齐 支持循环的缓冲器管理 可编程的数据传输数目:最大为65536 每一个通道都有一组寄存器 DMA_CPARx.DMA_CMARx是没有差别的,它们都可以存放外设的地址 ...

  9. 前端框架(kraken、Express、Node、MVC)

    You know my loneliness is only kept for you, my sweet songs are only sang for you. 前端框架相关知识记录. krake ...

  10. ios UIScrolloView在storyboard中添加约束

    1.在storyboard中如果有UINavigationbar 或 UITabar 布局的时候需要在控制器中勾选掉 Under Top Bars 和 Under Bottom Bars 这两个选项. ...