1、表达式输出属性

先来看一个简单的表达式小例子

el.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<%
request.setAttribute("attribute", "request");
%>
${attribute}
</body>
</html>

访问el.jsp,页面上会显示request。

${attributeName}就可以输出属性对应的值。

我们再来看一个例子

<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<%
pageContext.setAttribute("attribute", "page");
request.setAttribute("attribute", "request");
session.setAttribute("attribute", "session");
application.setAttribute("attribute", "application");
%>
${attribute} <!--类似 out.print(${attribute}所代表的内容) -->
</body>
</html>

现在设置了四个属性名都是"attribute",只是他们的范围不同。

这时候又会又会输出什么呢?

为什么是page呢?

因为表达式根据属性名获取属性值时,是根据pageScope->resquestScope->applicationScope这样的顺序进行查找的。

如果所有Scope内都没有要寻找的属性,则页面为空白(即输出“ ”空白字符串)。

2.表达式输出指定范围属性

${attributeName}是按照指定的顺序查找,那么我们有没有办法访问指定范围的属性呢?

当然可以,这就要用到

${pageScope.attributeName}  访问page范围attributeName的值

${requestScope.attributeName} 访问request范围attributeName的值

${sessionScope.attributeName} 访问session范围attributeName的值

${applicationScope.attributeName} 访问application范围attributeName的值

el.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<%
pageContext.setAttribute("attribute", "page");
request.setAttribute("attribute", "request");
session.setAttribute("attribute", "session");
application.setAttribute("attribute", "application");
%>
${pageScope.attribute}<br>
${requestScope.attribute}<br>
${sessionScope.attribute}<br>
${applicationScope.attribute}<br>
</body>
</html>

 

3、表达数输出对象属性、集合

表达式不仅可以获取属性的值,而且也可以获取对象集合的值。

<%@ page language="java" import = "java.util.*,com.myclass.*" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<!-- 表达式输出对象属性 -->
<%
Person user = new Person("zhansan","man",20);
session.setAttribute("onLineUser",user);
%>
<!-- onLineUser就想当于 user对象, ${onLineUser.name}相当于out.print(user.name) -->
${onLineUser.name } ${onLineUser.sex } ${onLineUser.age }<br>
${onLineUser}<br> <!-- 表达式输出List -->
<%
List<String> list = new LinkedList<String>();
for(int i = 0; i < 3; i++){
list.add("周" + i);
}
session.setAttribute("list", list);
%>
${list[0]} ${list[1]} ${list[2]}<br><br> <!-- 表达式输出Map -->
<%
Map<Long,Person> mapL = new HashMap<Long,Person>(); //Long和person
mapL.put(new Long(1), new Person("KeyIsLong" + 1, "man", 20));
session.setAttribute("mapL", mapL); Map<Integer,Person> mapI = new HashMap<Integer, Person>();//Integer和person
mapI.put(new Integer(2),new Person("KeyIsInteger"+2, "woman", 20));
session.setAttribute("mapI", mapI); Map<String,String> mapStr = new HashMap<String,String>();//String和person
mapStr.put("1", "KeyIsString");
session.setAttribute("mapStr", mapStr);
%>
<!-- 表达式通过键(long类型)获取值-->
${mapL[1].name} ${mapL[1].sex} ${map[1].age}<br> <!-- 此处map[1]就代表一个Person对象 -->
<!-- 表达式通过键(int类型)获取值-->
${mapI[2].name} ${mapI[2].sex} ${mapI[2].age}<br>
<!-- 表达式通过键(String类型)获取值-->
${mapStr["1"]}<br>
</body>
</html>

我们会发现“KeyIsInteger”这个没有被打印出来,这是应为EL表达式在解析Integer类型数字的时候,会自动把数字转换成Long类型,

后台使用Integer类型作为key值,进行判断的时候Integer与Long对象不相等。导致无法取出key值。将key换成Long就可以取出了。

就相当于放入是 map.put(new Integer(x), xxx); ,但表达式取出时是map.get(new Long(x));

4、表达式的运算符操作

运算操作(+,-,*,/,%):

<%@ page language="java" import = "java.util.*,com.myclass.*" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<table border="2">
<tr>
<td>2+3 = ${2+3}</td> <td>2+3.0 = ${2 + 3.0}</td> <td> 2.0+3.0 = ${2.0+3.0}</td>
</tr>
<tr>
<td>2-3 = ${2-3}</td> <td>2.0-3 = ${2.0-3} </td> <td> 2.0-3.0 = ${2.0-3.0}</td>
</tr>
<tr>
<td>2*3 = ${2*3}</td> <td>2.0*3 = ${2.0 * 3}</td> <td> 2.0*3.0 = ${2.0*3.0}</td>
</tr>
<tr>
<td>2/3 = ${2/3}</td> <td>6 / 2 = ${6 / 2} </td> <td> 6.0/1.0 = ${6.0 / 1.0 }</td>
</tr>
<tr>
<td>2/3 = ${2%3}</td> <td>6 / 2.0 = ${6 % 2.0} </td> <td> 6.0%1.0 = ${6.0 / 1.0 }</td>
</tr>
</table>
</body>
</html>

5、表达式条件运算符(> 、< 、>=、 <=、 ==、 !=):

<%@ page language="java" import = "java.util.*,com.myclass.*" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<table border="2">
<tr>
<td>2.0>2.0 ${2.0>3.0}</td> <td>2>3.0 ${2 > 3.0}</td> <td> 2.0>3.0 ${2.0>3.0}</td>
</tr>
<tr>
<td>2.0<.0 ${2.0<2.0}</td> <td>2.0<3 ${2.0<3} </td> <td> 2.0<.0 ${2.0<3.0}</td>
</tr>
<tr>
<td>2>=2.0 ${2>=2.0}</td> <td>2.0>=2.0 ${2.0 >= 2.0}</td> <td> 2.0>=2 ${2.0>=2}</td>
</tr>
<tr>
<td>2.0<=2.0 ${2.0<=2.0}</td> <td>2.0 <= 2 ${2.0 <= 2} </td> <td> 6.0<=1.0 ${6.0 <= 1.0 }</td>
</tr>
<tr>
<td>2==2 ${2==2}</td> <td>2.0== 2.0 ${2.0== 2.0} </td> <td> 2.0==2 ${2.0== 2 }</td>
</tr>
<tr>
<td>2!=2 ${2!=2}</td> <td>2.0!= 2.0 ${2.0!= 2.0} </td> <td> 2.0!=2 ${2.0!= 2 }</td>
</tr>
</table>
</body>
</html>

6、表达式逻辑运算符(&&、|| )及三目运算符

<%@ page language="java" import = "java.util.*,com.myclass.*" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<%
session.setAttribute("one", 1);
session.setAttribute("two", 2);
%>
<table border="2">
<tr>
<td>true && 3>2 :${true && 3>2 }</td>
<td>one < two && true :${one < two && true} </td>
<td>one < two && false :${ one < two && false}</td>
</tr>
<tr>
<td>true || 3>2 :${true || 3>2 }</td>
<td>one < two || true :${one < two || true} </td>
<td>one < two || false :${ one < two || false}</td>
</tr>
</table>
<!-- 三目运算符 -->
${one < two ? "1小于2" : "2小于1"}
</body>
</html>

7、表达式获取cookie:${cookie}  代表一个存放所有Cookie的map对象。map<xxx,Cookie>

<%@ page language="java" import = "java.util.*,com.myclass.*" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib uri = "http://java.sun.com/jsp/jstl/core" prefix = "c" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body> <c:forEach items = "${cookie}" var = "co"> <!-- 将Cookie所有键值对输出 -->
${co.key } :${co.value} :${co.value.value} <br> <!-- co.key代表key:JSESSIONID,co.value代表对应的Cookie对象 -->
${cookie.JSESSIONID.value} <!-- cookie.JSESSIONID代表map中key为JSESSIONID的Cookie对象,类似map.getKey(JSESSIONID).value -->
<!-- cookie.JSESSIONID.value代表Cookie对象的值 -->
</c:forEach>
</body>
</html>

8、表达式获取请求参数(param):

param代表存放所有请求参数name和value的map对象。

<%@ page language="java" import = "java.util.*,com.myclass.*" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib uri = "http://java.sun.com/jsp/jstl/core" prefix = "c" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
name:${param.name} sex:${param.sex} age:${param.age} <br><!-- 通过key获取value,类似map.getKey(xxx) -->
<c:forEach items="${param}" var = "p"> <!--迭代输出map所有key value-->
${p.key}:${p.value}
</c:forEach>
</body>
</html>

http://localhost:8080/JSP/el.jsp?name=hcf&sex=man&age=20

9、表达式获取一个请求参数所包含的多个值(paramValues)

paramValues:代表所有参数名和值的map对象,map<xxx,String[]>

值部分是一个字符串数组,所以可以储存多个参数。可用于多选按钮中获取值。

<%@ page language="java" import = "java.util.*,com.myclass.*" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib uri = "http://java.sun.com/jsp/jstl/core" prefix = "c" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
${paramValues.name[0]} ${paramValues.name[1]}<br> <!-- key对应多个value -->
${paramValues.age[0]} <!-- key对应单个value -->
</body>
</html>

 http://localhost:8080/JSP/el.jsp?name=hcf&name=zrx&age=20

10、其他运算符:

empty 判空

<%@ page language="java" import = "java.util.*,com.myclass.*" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<%
session.setAttribute("zhansan","zhansan");
session.setAttribute("lisi",null);
%>
zhansanIsEmpty:${empty zhansan}<br> <!-- 不是空返回false -->
lisiIsEmpty:${empty lisi}<br> <!-- 是空返回true -->
wangwuIsEmpty:${empty wangwu}<br>
</body>
</html

11.自定义表达式函数

用户可以自定义表达式函数,调用的函数必须为java类的静态方法,调用方式${prefix:method(params)}

自定义表达式函数主要步骤

  1.编写java类及其静态方法。

  2. .tld文件中配置方法

  3.JSP页面导入方法并使用

Java类及静态方法:自定义EL表达式方法,实际上调用的是Java类中的一个静态方法。

public class ElMethod {

    public static String elOut(String msg) {//表达式方法必须为静态
return "elMethod" + msg;
}
}

创建.tdl文件并配置。配置定义的静态方法。

elMethod.tld

<?xml version="1.0" encoding="UTF-8"?>
<taglib version="2.0" xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee web-jsptaglibrary_2_0.xsd">
<tlib-version>1.0</tlib-version>
<short-name>EL Function</short-name> <uri>/elMethod</uri> <!-- 设置uri地址 --> <!-- 描述一个EL自定义函数 -->
<function>
<description>html标签转义处理方法</description>
<!-- name用于指定自定义函数的名称-->
<name>elOut</name> <!-- 名称 -->
<!-- 指定调用方法所在类 -->
<function-class>com.myclass.ElMethod</function-class>
<!-- 返回值类型 函数名(参数类型1,参数类型2, ...) --> <!-- 设置返回值类型和参数类型 -->
<function-signature>java.lang.String elOut(java.lang.String)</function-signature>
</function>
</taglib>

el.jsp

<%@ page language="java" import = "java.util.*,com.myclass.*" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib uri = "/elMethod" prefix = "el" %> <!-- 引入自定义方法 -->
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
${el:elOut("456")} <!-- 调用自定义方法 -->
</body>
</html>

参考资料:

https://www.cnblogs.com/xdp-gacl/p/3938361.html

https://stackoverflow.com/questions/924451/el-access-a-map-value-by-integer-key

1.6(学习笔记)EL表达式的更多相关文章

  1. java学习笔记—EL表达式(38)

    EL表达式 EL即Expression Language,主要的任务是帮助开发者简化获取域属性. 但是一般情况下需要使用EL和JSTL结合使用. 语法: ${ // 隐含对象|直接写域中的属性 }  ...

  2. 重温JSP学习笔记--El表达式

    el表达式是jsp内置的表达式语言,jsp从jsp2.0开始,就不再提倡使用java脚本,而是用el表达式和动态标签来替代,而el表达式主要替代的是jsp中的<%=....%>,也就是说e ...

  3. Javaweb学习笔记——EL表达式

    一.前言 EL表达式是什么? 简而言之,可以这样理解,EL表达式全名为:Exprexxsion Language,原先是JSTL 1.0为了方便存取数据而定义的语言,到了JSTL 2.0便正式成为标准 ...

  4. Java8学习笔记----Lambda表达式 (转)

    Java8学习笔记----Lambda表达式 天锦 2014-03-24 16:43:30 发表于:ATA之家       本文主要记录自己学习Java8的历程,方便大家一起探讨和自己的备忘.因为本人 ...

  5. 学习笔记-EL

    仅作为学习过程中笔记作用,若有不正确的地方欢迎指正 目标 理解El的作用,熟练使用EL EL表达式与Jsp表达式对比来记 EL表达式的概念,作用,语法 Jsp作用主要是用来实现动态网页的,而动态网页中 ...

  6. struts2学习笔记--OGNL表达式1

    struts2标签库主要使用的是OGNL语言,类似于El表达式,但是强大得多,它是一种操作对象属性的表达式语言,OGNL有自己的优点: 能够访问对象的方法,如list.size(); 能够访问静态属性 ...

  7. 阅读笔记—EL表达式

    表达式语言(EL) 表达式语言是一种在JSP页面中使用的数据访问语言,通过它可以很方便地在JSP页面中访问应用程序数据. 使用EL访问数据 表达式语言的使用形式:              ${exp ...

  8. Java Web学习总结(10)学习总结-EL表达式

    一,EL 表达式概述(EL主要从域中取数据) EL(Express Lanuage)表达式可以嵌入在jsp页面内部,减少jsp脚本的编写,EL出现的目的是要替代jsp页面中脚本的编写. 二,EL从域中 ...

  9. 重温JSP学习笔记--El函数库

    EL函数库(由JSTL提供的) * 导入标签库:<%@ tablib prefix="fn" uri="http://java.sun.com/jsp/jstl/f ...

  10. JavaScript高级程序设计学习笔记--函数表达式

    关于函数声明,它的一个重要特征就是函数声明提升,意思是在执行代码之间会读取函数声明,意思是在执行代码之前会先读取函数声明.这就意味着可以把函数声明放在调用它的语句 后面. sayHi(); funct ...

随机推荐

  1. 怎么让Intellj Idea 把数据库的表映射成hibernate的domain对象

    步骤如下: 第一步:连接数据源: 点击:idea右边的database.如下图所示: 或者你依次点击:view-->Tool windows--->database 然后你将看在如下点击下 ...

  2. 迅雷Bolt的ClipSubBindBitmap函数特别说明

    因为在工作中基于迅雷Bolt开发的是IM产品,需要实现自定义用户头像的功能. 但Bolt中对图像的默认拉伸锯齿效果非常明显,所以自己实现了图像拉伸函数,代码已共享,具体可查看:<迅雷Bolt图像 ...

  3. web上传组件

    uploadify  jquery插件. common-fileipload; common-io ;jar

  4. bzoj3669: [Noi2014]魔法森林 lct版

    先上题目 bzoj3669: [Noi2014]魔法森林 这道题首先每一条边都有一个a,b 我们按a从小到大排序 每次将一条路劲入队 当然这道题权在边上 所以我们将边化为点去连接他的两个端点 当然某两 ...

  5. swift出师作,史丹佛大学游戏制作案例,计算器,小游戏

    这两个案例得好好弄清楚,感觉在任何方面既然能够作为公开课被提到这所名校的课程里面自然有不得不学习的理由,感觉应该去入手一下,毕竟这种课,价格不匪,难以接触,能看到就当再教育了.

  6. 【洛谷 UVA11417】 GCD(欧拉函数)

    我们枚举所有gcd \(k\),求所有\(gcd=k\)的数对,记作\(f(k)\),那么\(ans=\sum_{i=1}^{n}(f(i)-1)*i\).为什么减1呢,观察题目,发现\(j=i+1\ ...

  7. http://www.himigame.com/mac-cocoa-application/893.html

    [Cocoa(mac) Application 开发系列之一]创建第一个application—计算器 终于HTTP与Socket服务器以及cocos2dx之间的通信各种框架成功完成后,现在抽时间学习 ...

  8. Linux环境下通过ODBC访问MSSql Server

    为了解决Linux系统连接MSSql Server的问题,微软为Linux系统提供了连接MSSql Server的ODBC官方驱动.通过官方驱动,Linux程序可以方便地对MSSql Server进行 ...

  9. 查看Linux上的CPU核心数、线程数

    grep "physical id" /proc/cpuinfo|sort -u grep "cpu cores" /proc/cpuinfo|uniq gre ...

  10. [ 总结 ] nginx 安装过程

    本次安装使用源码编译安装: 在安装nginx之前需要先安装三个源码包:pcre.zilb.openssl    pcre:用于rewrite重写    zlib: 用于gzip压缩    openss ...