【Head First Servlets and JSP】笔记23:Expression Language(EL) 完全攻略
基本上是《Head First Servlets and JSP》内容的整理、扩充。顺便推荐一个供参考的JSP教程:JSP Tutorial内容很全面,还有一些有趣的实例。
- 完整代码参考
- EL隐式对象汇总
- pageContext使用参考
- EL表达式的基本规则
- 关于EL的一些细节
- 通过EL获得request参数
- 从request得到更多信息
- 获得Request Method?
- xxxxScope有意义吗?
- 通过EL调用函数
- EL与数学运算
1、EL隐式对象汇总。如下所示:

更详细的内容可以参考 JSP 4个域对象-9个内置对象-11个EL隐式对象
2、EL中的“爸爸”——pageContext

3、EL表达式的基本规则
EL表达式的基本格式为${........},下面所说的映射指的的是类似于map(也叫字典)的东西(具有“键”和“值”);而bean指的是例如person、dog这样的对象。
点号


[]是更好的点号


4、使用EL的一些细节
【细节A】


【细节B】

也就是说,如果不是list["xxx"]而是list[xxx]的话,xxx将会被计算!
【细节C】


5、通过EL获得request参数,类似于下面这样的

6、如果想从请求得到更多信息呢?例如说,你想得到服务器主机的信息。链接到代码
7、不能通过
,也不能通过
(EL根本没有request这个隐式对象!),
关键时刻还得靠pageContext!
xxxScope这种东西,只是属性(attribute)的一个映射表罢了!链接到代码
8、如果我们想获取某个person的名字,既可以使用${person.name}(自动查找4个作用域!),也可以使用${requestScope.person.name}(指定作用域查找),
前者更为简单、直观,那么xxxScope有存在的意义吗?
- 防止命名冲突,在多个作用域存在同名属性能够正确引用。
- 解决一种特殊情况,比如我们在Servlet中,或者是JSP脚本中使用右边的句子

在这之后要获得person的名字,类似
这样是行不通的(都是点号的锅!。。),这种情况只有xxxScope可以解决,
这样就ok了。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>小狗领养中心</title>
</head>
<body>
<form action="addDog" method="get" accept-charset="UTF-8">
<p>你的名字:<input type="text" name="name" value="王明" style="width:80px;"></p>
<p>年龄:<input type="text" name="age" value="19" style="width:50px;"></p>
<p>qq:<input type="text" name="qq" value="55667788" style="width:90px;"></p> <hr>
<!-- 下面是演示内容 -->
<p>第一个食物:<input type="text" name="food" value="青菜"></p>
<p>第二个食物:<input type="text" name="food" value="马铃薯"></p>
<p><input type="submit" value="确定领养"></p>
</form>
</body>
</html>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>领养成功</title>
</head>
<body>
<jsp:useBean id="person" type="po.Person" scope="request" />
<jsp:setProperty name="person" property="age" />
<p>成功领养!狗的名字是:${person.dog.name}</p> <hr>
<%-- person 是请求作用域的一个属性,点号右边是“bean性质” --%>
<p>${person.name}</p>
<p>${person.age}</p>
<p>${person.qq}</p>
<p>${person.dog}</p> <hr>
<%-- 表达式左侧还可以是一个EL隐式对象,尝试输出一些东西 --%>
<p>打印【person对象】:${requestScope.person}</p>
<p>打印【Request parameters】:${param}</p>
<p>换种方式打印:${paramValues}</p>
<p>打印【HTTP request headers】:${header}</p>
<p>打印这个:${cookie}</p>
<%-- 点号右边是“映射键” --%>
<p>${param.age}</p>
<p>${param.qq}</p> <%-- 通过JSP直接获得请求参数(Request parameters) --%>
<p>${cookie.JSESSIONID}</p>
<%-- paramValues其实是这么用的 --%>
<p>food1: ${paramValues.food[0]}</p>
<p>food2: ${paramValues.food[1]}</p>
<%-- 得到“host”首部 --%>
<p>Host is: ${header.host}</p>
<p>or:${header["host"]}</p>
<%-- 得到“http”请求方法,这里涉及到一个问题 --%>
<p>Method is: ${pageContext.request.method}</p>
<%-- 打印JSESSIONID --%>
<p>JSESSIONID is: ${cookie.JSESSIONID.value}</p>
<%-- 打印上下文初始化参数值 --%>
<p>my email is: ${initParam.myEmail}</p> <hr>
<%-- pageContext是个例外,它是实实在在的pageContext对象的引用 --%>
<p>${pageContext.findAttribute("person")}</p>
<p>${pageContext.request.queryString}</p> <hr>
<%-- [] 演示 --%>
<p>${person.name}</p>
<p>${person["name"]}</p>
<%-- 打印String数组 --%>
<p>数组:${musicList}</p>
<p>${musicList[0]}</p>
<p>${musicList[2]}</p>
<p>${musicList[99]}</p> <%-- 越界访问不会抛锚,也不会留白 --%>
<p>${musicList["2"]}</p> <%-- 自动完成类型转换 --%>
<%-- 这样是合法的! --%>
<p>${musicMap[J]}</p> </body>
</html>
成功领养!狗的名字是:小黄
王明
po.Dog@50b68c6d
打印【person对象】:po.Person@2909cd1e
打印【Request parameters】:{qq=55667788, name=çæ, age=19, food=éè}
换种方式打印:{qq=[Ljava.lang.String;@a3a764c, name=[Ljava.lang.String;@5a79efe0, age=[Ljava.lang.String;@3e48d526, food=[Ljava.lang.String;@59ce9ecc}
打印【HTTP request headers】:{referer=http://localhost:8080/, accept-language=zh-CN,zh;q=0.8, cookie=JSESSIONID=62E8FAF608E7A23D82CE1ECD0EF32C12, host=localhost:8080, upgrade-insecure-requests=1, connection=keep-alive, cache-control=max-age=0, accept-encoding=gzip, deflate, sdch, br, user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.81 Safari/537.36, accept=text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8}
打印这个:{JSESSIONID=javax.servlet.http.Cookie@1f0baf}
javax.servlet.http.Cookie@1f0baf
food1: éè
food2: 马éè¯
Host is: localhost:8080
or:localhost:8080
Method is: GET
JSESSIONID is: 62E8FAF608E7A23D82CE1ECD0EF32C12
my email is: dasds@163.com
po.Person@2909cd1e
name=%E7%8E%8B%E6%98%8E&age=19&qq=55667788&food=%E9%9D%92%E8%8F%9C&food=%E9%A9%AC%E9%93%83%E8%96%AF
王明
王明
数组:[Ljava.lang.String;@40803f51
music1
music3
music3
青花瓷
9、通过EL调用函数,你需要做的事情如下:

让我们来写一个掷骰子的JSP。(就是打开页面,随机出来一个1~6的数)
ttag library descriptor这部分内容好像有点旧了,费了一番功夫才跑出来。
首先要从oracal下载一个这样的文件web-jsptaglibrary_2_0.xsd(google搜索一下就有了,或者点这里),放在WEB-INF目录下
创建 myFunctions.tld,同样放在WEB-INF目录下,内容如下
<?xml version="1.0" encoding="UTF-8"?>
<taglib 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"
version="2.0">
<tlib-version>1.2</tlib-version>
<short-name>hi</short-name> <function>
<name>rollIt</name>
<function-class>service.DiceRoller</function-class>
<function-signature>
int rollDice()
</function-signature>
</function>
</taglib>
在JSP中声明这个函数,
<%@ taglib prefix="mine" uri="/WEB-INF/myFunctions.tld" %>
使用函数,
<p>${mine:rollIt()}</p>
关于它的参数

10、EL与数学运算




EL可以妥善的处理非法运算



<hr>
<h3>Doing Math</h3>
<%
String num = "2";
request.setAttribute("num", num);
Integer i = new Integer(3);
request.setAttribute("integer", i);
ArrayList list = new ArrayList();
list.add("true");
list.add("false");
list.add("2");
list.add("10");
request.setAttribute("list", list);
%>
<p>${num > 3}</p>
<p>${integer le 12}</p>
<p>${requestScope["nteger"] ne 4 and 6 le num || false}</p>
<p>${list[0] || list["1"] and true}</p>
<p>${num > integer}</p>
<p>${num == integer-1}</p>
<jsp:useBean class="po.Dog" id="myDog">
<jsp:setProperty name="myDog" property="name" value="${list[1]}" />
</jsp:useBean>
<p>${myDog.name and true}</p>
<p>${42 div 0}</p>
<p>${mine:rollIt() le 0}</p>
Doing Math
false
true
false
true
false
true
false
Infinity
false
addDog.java
package service; import po.Dog;
import po.Person; import javax.servlet.*;
import javax.servlet.http.*;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import java.util.Random; public class addDog extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.setCharacterEncoding("utf-8"); Person p = new Person();
p.setName(new String(req.getParameter("name").getBytes("iso8859-1"),"UTF-8")); // 解决form提交中文的乱码问题!
p.setQq(req.getParameter("qq")); p.setDog(next());
req.setAttribute("person", p); // 为了 el [] 的演示需要
String[] music = {"music1", "music2", "music3"};
req.setAttribute("musicList", music); // 演示需要
Map musicMap = new HashMap();
musicMap.put("DJ", "BT");
musicMap.put("J CHOU", "青花瓷");
req.setAttribute("musicMap", musicMap);
req.setAttribute("J", "J CHOU"); RequestDispatcher view = req.getRequestDispatcher("/result.jsp");
view.forward(req, resp);
} @Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
} private Random rand = new Random(47); // 47是一个无关紧要的数字
private Dog next() {
switch (rand.nextInt(3)) {
default:
case 0: return new Dog("大黄");
case 1: return new Dog("富贵");
case 2: return new Dog("小黄");
}
}
}
【Head First Servlets and JSP】笔记23:Expression Language(EL) 完全攻略的更多相关文章
- Spring Bean Expression Language(EL)
1, Add dependency. <dependency> <groupId>org.springframework</groupId> <artifac ...
- 【Head First Servlets and JSP】笔记20:EL以及<jsp:useBean ....>的补充
1.EL的英文是Expression Language,译成中文就是“表达式语言”.这是一种给前端程序员使用的脚本语言,EL与Java表达式相比并没有什么“天壤之别”,在后端程序员看来多少有点“多此一 ...
- EL(Expression Language)和JSTL标签(JSP Standard Tag Library)
一.EL表达式: Expression Language提供了在 JSP 脚本编制元素范围外(例如:脚本标签)使用运行时表达式的功能.脚本编制元素是指页面中能够用于在JSP 文件中嵌入 Java代码的 ...
- Ext.Net学习笔记23:Ext.Net TabPanel用法详解
Ext.Net学习笔记23:Ext.Net TabPanel用法详解 上面的图片中给出了TabPanel的一个效果图,我们来看一下代码: <ext:TabPanel runat="se ...
- JAVA自学笔记23
JAVA自学笔记23 1.多线程 1)引入: 2)进程 是正在运行的程序.是系统进行资源分配和调用的独立单位.每一个进程都有它自己的内存空间和系统资源. 多进程: 单进程的计算机只能做一件事情,而现在 ...
- SQL Expression Language Tutorial 学习笔记二
11. Using Textual SQL 直接使用 SQL 如果实在玩不转, 还是可以通过 test() 直接写 SQL. In [51]: s = text( ...: "SELECT ...
- SQL Expression Language Tutorial 学习笔记一
http://docs.sqlalchemy.org/en/latest/core/tutorial.html Google 翻译了一下 SQLAlchemy Expression Language, ...
- WPF学习笔记-用Expression Design制作矢量图然后导出为XAML
WPF学习笔记-用Expression Design制作矢量图然后导出为XAML 第一次用Windows live writer写东西,感觉不错,哈哈~~ 1.在白纸上完全凭感觉,想象来画图难度很大, ...
- SPRING IN ACTION 第4版笔记-第四章ASPECT-ORIENTED SPRING-004-使用AspectJ’s pointcut expression language定义Pointcut
一. 1.在Spring中,pointcut是通过AspectJ’s pointcut expression language来定义的,但spring只支持它的一部分,如果超出范围就会报Illegal ...
随机推荐
- Engineer in the White Spaces
 Engineer in the White Spaces Michael Nygard A SySTEM ConSiSTS oF inTERdEpEndEnT pRogRAMS. We call ...
- java 遍历String
Java字符串是一系列的Unicode字符序列,但是,它却常常被误认为是char序列.于是,我们经常这样来遍历字符串: package testchar; public class TestChar2 ...
- MathType与Origin是怎么兼容的
MathType作为一款常用的公式编辑器,可以与很多的软件兼容使用.Origin虽然是一款专业绘图与数据分析软件,但是在使用过程中也是可以用到MathType.它可以帮助Origin给图表加上标签,或 ...
- TypeScript 函数 (五)
传递给一个函数的参数个数必须与函数期望的参数个数一致. 参数类别: 必须参数 可选参数 :可选参数必须在参数后面. 默认参数 :当用户没有传递这个参数或传递的值是undefined时. 它们叫做有默认 ...
- git和svn的详细对比
近期就[版本管理工具是否进行切换SVN->Git]的问题进行了讨论,于是对svn和Git进行了相关研究,进而梳理出Git的特点(优.缺点),最后将Git与SVN进行了对比,对比结果详见下方内容. ...
- [USACO5.5]隐藏口令Hidden Password
题目链接:传送门 题目大意:给你一个长度 N 的字符串,5<=N<=5,000,000,将首尾合并成环,断环成链并满足字典序最小,输出此时首字母在原串中的位置-1: 题目思路:最小表示法 ...
- Codeforces Round #364 (Div. 1)B. Connecting Universities
题目链接:传送门 题目大意:n个点构成一棵树,给定 k*2 点,要分成 k 组,使每组点之间的距离之和最大. 题目思路:因为是求距离之和最大,所以我们可以知道这样一个性质.如果以一条边为界,两边的子树 ...
- responsive and functional programming RxJava
RxJava由于使用了多个回调,一开始理解起来可能有点难度,其实多看几遍也就明白了,它的招式套路都是一样的: 首先就是创建Observable,创建Observable有很多种方式,这里使用了Obse ...
- gerrit添加appkey以及简单添加分支
最近团队开放用上gerrit版本项目管理工具,简单说一下appkey配置过程 首先是拿到gerrit分配的账户密码.然后进入到首页,假如是新搭建的应该是没有信息,我这里有一些提交的信息,然后找到右上角 ...
- python中counter()记数
一:定义一个list数组,求数组中每个元素出现的次数 如果用Java来实现,是一个比较复杂的,需要遍历数组list. 但是Python很简单:看代码 a = [1,4,2,3,2,3,4,2] fro ...