1、JSP表达式语言(EL)用于在jsp从访问存储在JavaBean中的数据,例如

User ID: ${user.userId}<br />

  这里的${user.userId}就是JSP EL表达式,效果就是:

User ID: 19358

  19358是userId的数据

2、语法

  • 立即执行  

    立即执行EL表达式将在页面渲染的时候,被JSP引擎解析和执行。这就意味着EL表达式将在JSP引擎中发现它,并在继续执行其他页面部分之前执行它,就类似c语言中的宏那样,下面的例子中EL表达式将会立即执行,其中expr是一个EL表达式

${expr}

    美元符号和两个花括号定义了EL表达式的边界,在括号中的所有的内容都会作为EL表达式执行。所以如果我们需要使用美元符号就需要进行转义

  • 延迟执行

    延迟执行EL表达式是统一表达式的一部分主要用于满足JavaServer Faces的需要。下面的例子将是一个延迟执行的EL表达式

#{expr}

3、添加EL表达式

  EL表达式可以直接用在JSP的任何位置,除了少数特殊情况。首先不能用在任何指令中,因为编译JSP时,指令将会被执行,但是EL表达式是在渲染JSP时执行,所以这里的EL表达式是无法正常工作的。

  另外,JSP声明<%!%>、脚本<%%>或者表达式<%=%>中的EL表达式也是无效的。

  除此之外,EL表达式可以添加在任意的位置

  • 简单文本中
User ID: ${expr}
  • 标准的HTML标签中
<input type="text" name="something" value="${expr}"/>
  • JSP标签中
<c:url value ="/something/${expr}/${expr}"/>

4、基础操作符

操作符 描述
. 访问一个Bean属性或者一个映射条目
[] 访问一个数组或者链表的元素
( ) 组织一个子表达式以改变优先级
+
- 减或负
*
/ or div
% or mod 取模
== or eq 是否相等
!= or ne 是否不等
< or lt 是否小于
> or gt 是否大于
<= or le 是否小于等于
>= or ge 是否大于等于
&& or and
|| or or
! or not 取反
empty 是否空值

5、对象属性和方法

  EL表达式通过.进行JavaBean中属性的简化语法,假设现在有一个类user,有名为userId的类

${user.userId}

  如果使用这个表达式来访问userId字段,这是行不通的因为这里的.实际寻找的是userId属性而非字段,也就是说将调用的是user.getuserId()类似的JavaBean标准访问方法。

  如果没有这样的标准方法,应该这样进行访问

${user["userId"]}

6、EL函数

  JSP EL允许您在表达式中使用函数。这些函数必须被定义在自定义标签库中。函数的使用语法如下:

${ns:func(param1, param2, ...)}

  其中ns是命名空间,func是函数名,param1、param2...是参数

  比如,有函数fn:length,在JSTL库中定义,可以像下面这样来获取一个字符串的长度:

${fn:length("Get my length")}

7、lambda表达式

  lambda表达式就是一个匿名函数,EL lambda就是用箭头操作符->分割左侧的表达式参数和右侧的表达式,以下是两个有效的EL lambda表达式

${(a -> a + 5) (4)}
${((a,b) -> a + b) (3, 5)}

  还可以这样使用:

${v = (a , b) -> a +b; v(3, 5)}

8、集合

  • map

  现假设有一个map拥有键username和ueseId,那么可以使用中括号访问这两个键的键值

${map["username"]}
${map["userId"]}

  也可以使用.

${map.username}
${map.userId}
  • list

  假设有一个list,它包含了三个值"green"、"red"、"blue",按照0到2d的顺序一存储,那么可以只有访问

${list[0]}
${list[1]}
${list[2]}

  不能使用.

9、试用

  先新建一个类User,每个字段都将拥有相应的set和get方法

public class User {
private long userId;
private String username;
private String firstname;
private String lastname;
private Map<String,Boolean> permission = new Hashtable<>(); public long getUserId() {
return userId;
} public void setUserId(long userId) {
this.userId = userId;
} public String getUsername() {
return username;
} public void setUsername(String username) {
this.username = username;
} public String getFirstname() {
return firstname;
} public void setFirstname(String firstname) {
this.firstname = firstname;
} public String getLastname() {
return lastname;
} public void setLastname(String lastname) {
this.lastname = lastname;
} public Map<String, Boolean> getPermission() {
return permission;
} public void setPermission(Map<String, Boolean> permission) {
this.permission = permission;
}
}

  然后是Servlet:

@WebServlet(
name = "ELServlet",
urlPatterns = "/EL"
)
public class ELServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
User user = new User();
user.setUserId(19358L);
user.setUsername("Username");
user.setFirstname("Firstname");
user.setLastname("Lastname"); Hashtable<String,Boolean> permissions = new Hashtable<>();
permissions.put("user", true);
permissions.put("moderator", true);
permissions.put("admin", false);
user.setPermission(permissions); req.setAttribute("user",user);
req.getRequestDispatcher("/WEB-INF/jsp/view/EL.jsp")
.forward(req,resp);
}
}

  最后是JSP

<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>User</title>
</head>
<body>
User ID: ${user.userId}<br />
Username: ${user.username}(${user.username.length()} characters)<br/>
Full Name: ${user.lastname += "," += user.firstname}
<br/><br/>
<b>Permissons (${fn:length(user.permission)})</b><br/>
User: ${user.permission["user"]}<br/>
Moderator: ${user.permission["moderator"]}<br/>
Admin: ${user.permission["admin"]}<br/>
</body>
</html>

  需要注意的地方有user.username.length()这里相等于使用的是String的length方法,user.lastname += "," += user.firstname这里也是简单的使用 += 进行字符串的拼接fn:length(user.permission),这里调用fn:length函数输出permission的长度。

  结果:
  

10、使用隐含的EL变量

  JSP EL支持下表列出的隐含对象:

隐含对象 描述
pageScope page 作用域
requestScope request 作用域
sessionScope session 作用域
applicationScope application 作用域
param Request 对象的参数,字符串
paramValues Request对象的参数,字符串集合
header HTTP 信息头,字符串
headerValues HTTP 信息头,字符串集合
initParam 上下文初始化参数
cookie Cookie值
pageContext 当前页面的pageContext

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

  1. 【jsp】详解JSP表达式语言(EL)

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

  2. JSP 表达式语言

    JSP 表达式语言 JSP表达式语言(EL)使得访问存储在JavaBean中的数据变得非常简单.JSP EL既可以用来创建算术表达式也可以用来创建逻辑表达式.在JSP EL表达式内可以使用整型数,浮点 ...

  3. JSP表达式语言(EL)

    JSP表达式语言(EL)使得访问存储在JavaBean中的数据变得非常简单.JSP  EL既可以用来创建算术表达式也可以用来创建逻辑表达式.在JSP  EL表达式内可以使用整数型.浮点型.字符串.常量 ...

  4. 表达式语言EL

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

  5. 表达式语言EL简单学习

    Jsp2.0最重要的特性就是表达式语言EL.jsp用户可以用它来访问应用程序数据. EL表达式以${开头并以}结束. ${expresion}     ${x+y} 它也常用来连接两个表达式,取值将从 ...

  6. JSP-Runoob:JSP 表达式语言

    ylbtech-JSP-Runoob:JSP 表达式语言 1.返回顶部 1. JSP 表达式语言 JSP表达式语言(EL)使得访问存储在JavaBean中的数据变得非常简单.JSP EL既可以用来创建 ...

  7. 06.十分钟学会表达式语言EL

    一. 概念:MVC设计模式一个主要好处就是让jsp中的代码越来越来少,而且规定只能出现三种代码:接收属性,判断语句,迭代输出.但是,在开发中,jsp输出至少还是需要接受VO对象的,这时候为了避免导入V ...

  8. Java EE之表达式语言EL(上)

    1.了解表达式语言 表达式语言(EL)用于在不使用脚本.声明或者表达式的情况下,在JSP页面中渲染数据. EL曾是JSTL 1.0规范(与JSP 1.2)中的一部分,并且只可以用作JSTL标签的特性. ...

  9. Java EE之表达式语言EL(下)

    1.在EL表达式中使用作用域变量 表达式语言对作用域变量的支持,以及它解析变量的方式都使它变得非常有用. 1.1 EL表达式的隐式变量 EL表达式的作用域中定义了11个隐式变量. 当EL表达式引用了一 ...

随机推荐

  1. Spring Boot + Elasticsearch 实现索引的日常维护

    全文检索的应用越来越广泛,几乎成了互联网应用的标配,商品搜索.日志分析.历史数据归档等等,各种场景都会涉及到大批量的数据,在全文检索方面,方案无外乎Lucene.Solr.Elasticsearch三 ...

  2. Java 类加载之匿名类和主类相互依赖问题

    Qestion /** * ClassInitializedOrder for : Java Classload Order Test * * @author <a href="mai ...

  3. weex起步

    weex文档地址: http://weex-project.io/cn/guide/index.html weex的文档过于简单,加上js语法 & android & ios本身也有很 ...

  4. RabbitMQ实战(三)-高级特性

    0 相关源码 1 你将学到 如何保证消息百分百投递成功 幂等性 如何避免海量订单生成时消息的重复消费 Confirm确认消息.Return返回消息 自定义消费者 消息的ACK与重回队列 限流 TTL ...

  5. struct模块(用于对象的压缩)

    6.27自我总结 struct模块 1.struct模块中的函数 函数 return explain pack(fmt,v1,v2-) string 按照给定的格式(fmt),把数据转换成字符串(字节 ...

  6. C#4.0新增功能01 动态绑定 (dynamic 类型)

    连载目录    [已更新最新开发文章,点击查看详细] C# 4 引入了一个新类型 dynamic. 该类型是一种静态类型,但类型为 dynamic 的对象会跳过静态类型检查. 大多数情况下,该对象就像 ...

  7. Java面试题 从源码角度分析HashSet实现原理?

    面试官:请问HashSet有哪些特点? 应聘者:HashSet实现自set接口,set集合中元素无序且不能重复: 面试官:那么HashSet 如何保证元素不重复? 应聘者:因为HashSet底层是基于 ...

  8. 把Asp.net Core程序代码部署到Ubuntu(不含数据库)

    今天记录一下第一次把.net core 程序发布到linux系统.linux用的是ubuntu Server 18.04版本.运行的IDE是vs 2019,发布出来是.net core 2.2版本. ...

  9. 分享一个 Linux 环境下,强力的Python 小工具

    场景 Linux 用户,经常需要在终端查看一些数据,从文件里看 或者网络协议获取数据并查看. 比如,查看文件里的json数据:比如,查看etcd里存下的数据. 如果直接看cat 或者 curl 得到的 ...

  10. .net持续集成sonarqube篇之项目管理与用户管理

    系列目录 删除项目 在学习阶段,我们可能需要经常删除已构建的项目,在sonarqube中想要删除一个项目有两个入口,都在Administration导航栏内. 在项目内部的管理界面删除 如果项目处于打 ...