基本上是《Head First Servlets and JSP》内容的整理、扩充。顺便推荐一个供参考的JSP教程:JSP Tutorial内容很全面,还有一些有趣的实例。

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有存在的意义吗?

  1. 防止命名冲突,在多个作用域存在同名属性能够正确引用。
  2. 解决一种特殊情况,比如我们在Servlet中,或者是JSP脚本中使用右边的句子

在这之后要获得person的名字,类似这样是行不通的(都是点号的锅!。。),这种情况只有xxxScope可以解决,这样就ok了。

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>小狗领养中心</title>
  6. </head>
  7. <body>
  8. <form action="addDog" method="get" accept-charset="UTF-8">
  9. <p>你的名字:<input type="text" name="name" value="王明" style="width:80px;"></p>
  10. <p>年龄:<input type="text" name="age" value="19" style="width:50px;"></p>
  11. <p>qq:<input type="text" name="qq" value="55667788" style="width:90px;"></p>
  12.  
  13. <hr>
  14. <!-- 下面是演示内容 -->
  15. <p>第一个食物:<input type="text" name="food" value="青菜"></p>
  16. <p>第二个食物:<input type="text" name="food" value="马铃薯"></p>
  17. <p><input type="submit" value="确定领养"></p>
  18. </form>
  19. </body>
  20. </html>
  1. <%@ page contentType="text/html;charset=UTF-8" language="java" %>
  2. <html>
  3. <head>
  4. <title>领养成功</title>
  5. </head>
  6. <body>
  7. <jsp:useBean id="person" type="po.Person" scope="request" />
  8. <jsp:setProperty name="person" property="age" />
  9. <p>成功领养!狗的名字是:${person.dog.name}</p>
  10.  
  11. <hr>
  12. <%-- person 是请求作用域的一个属性,点号右边是“bean性质” --%>
  13. <p>${person.name}</p>
  14. <p>${person.age}</p>
  15. <p>${person.qq}</p>
  16. <p>${person.dog}</p>
  17.  
  18. <hr>
  19. <%-- 表达式左侧还可以是一个EL隐式对象,尝试输出一些东西 --%>
  20. <p>打印【person对象】:${requestScope.person}</p>
  21. <p>打印【Request parameters】:${param}</p>
  22. <p>换种方式打印:${paramValues}</p>
  23. <p>打印【HTTP request headers】:${header}</p>
  24. <p>打印这个:${cookie}</p>
  25. <%-- 点号右边是“映射键” --%>
  26. <p>${param.age}</p>
  27. <p>${param.qq}</p> <%-- 通过JSP直接获得请求参数(Request parameters --%>
  28. <p>${cookie.JSESSIONID}</p>
  29. <%-- paramValues其实是这么用的 --%>
  30. <p>food1: ${paramValues.food[0]}</p>
  31. <p>food2: ${paramValues.food[1]}</p>
  32. <%-- 得到“host”首部 --%>
  33. <p>Host is: ${header.host}</p>
  34. <p>or:${header["host"]}</p>
  35. <%-- 得到“http”请求方法,这里涉及到一个问题 --%>
  36. <p>Method is: ${pageContext.request.method}</p>
  37. <%-- 打印JSESSIONID --%>
  38. <p>JSESSIONID is: ${cookie.JSESSIONID.value}</p>
  39. <%-- 打印上下文初始化参数值 --%>
  40. <p>my email is: ${initParam.myEmail}</p>
  41.  
  42. <hr>
  43. <%-- pageContext是个例外,它是实实在在的pageContext对象的引用 --%>
  44. <p>${pageContext.findAttribute("person")}</p>
  45. <p>${pageContext.request.queryString}</p>
  46.  
  47. <hr>
  48. <%-- [] 演示 --%>
  49. <p>${person.name}</p>
  50. <p>${person["name"]}</p>
  51. <%-- 打印String数组 --%>
  52. <p>数组:${musicList}</p>
  53. <p>${musicList[0]}</p>
  54. <p>${musicList[2]}</p>
  55. <p>${musicList[99]}</p> <%-- 越界访问不会抛锚,也不会留白 --%>
  56. <p>${musicList["2"]}</p> <%-- 自动完成类型转换 --%>
  57. <%-- 这样是合法的! --%>
  58. <p>${musicMap[J]}</p>
  59.  
  60. </body>
  61. </html>

完整war打包下载

成功领养!狗的名字是:小黄


王明

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目录下,内容如下

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <taglib xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  3. xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee web-jsptaglibrary_2_0.xsd"
  4. version="2.0">
  5. <tlib-version>1.2</tlib-version>
  6. <short-name>hi</short-name>
  7.  
  8. <function>
  9. <name>rollIt</name>
  10. <function-class>service.DiceRoller</function-class>
  11. <function-signature>
  12. int rollDice()
  13. </function-signature>
  14. </function>
  15. </taglib>

在JSP中声明这个函数,

  1. <%@ taglib prefix="mine" uri="/WEB-INF/myFunctions.tld" %>

使用函数,

  1. <p>${mine:rollIt()}</p>

关于它的参数

10、EL与数学运算

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

  1. <hr>
  2. <h3>Doing Math</h3>
  3. <%
  4. String num = "2";
  5. request.setAttribute("num", num);
  6. Integer i = new Integer(3);
  7. request.setAttribute("integer", i);
  8. ArrayList list = new ArrayList();
  9. list.add("true");
  10. list.add("false");
  11. list.add("2");
  12. list.add("10");
  13. request.setAttribute("list", list);
  14. %>
  15. <p>${num > 3}</p>
  16. <p>${integer le 12}</p>
  17. <p>${requestScope["nteger"] ne 4 and 6 le num || false}</p>
  18. <p>${list[0] || list["1"] and true}</p>
  19. <p>${num > integer}</p>
  20. <p>${num == integer-1}</p>
  21. <jsp:useBean class="po.Dog" id="myDog">
  22. <jsp:setProperty name="myDog" property="name" value="${list[1]}" />
  23. </jsp:useBean>
  24. <p>${myDog.name and true}</p>
  25. <p>${42 div 0}</p>
  26. <p>${mine:rollIt() le 0}</p>

Doing Math

false

true

false

true

false

true

false

Infinity

false

addDog.java

  1. package service;
  2.  
  3. import po.Dog;
  4. import po.Person;
  5.  
  6. import javax.servlet.*;
  7. import javax.servlet.http.*;
  8. import java.io.IOException;
  9. import java.util.HashMap;
  10. import java.util.Map;
  11. import java.util.Random;
  12.  
  13. public class addDog extends HttpServlet {
  14. @Override
  15. protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
  16. req.setCharacterEncoding("utf-8");
  17.  
  18. Person p = new Person();
  19. p.setName(new String(req.getParameter("name").getBytes("iso8859-1"),"UTF-8")); // 解决form提交中文的乱码问题!
  20. p.setQq(req.getParameter("qq"));
  21.  
  22. p.setDog(next());
  23. req.setAttribute("person", p);
  24.  
  25. // 为了 el [] 的演示需要
  26. String[] music = {"music1", "music2", "music3"};
  27. req.setAttribute("musicList", music);
  28.  
  29. // 演示需要
  30. Map musicMap = new HashMap();
  31. musicMap.put("DJ", "BT");
  32. musicMap.put("J CHOU", "青花瓷");
  33. req.setAttribute("musicMap", musicMap);
  34. req.setAttribute("J", "J CHOU");
  35.  
  36. RequestDispatcher view = req.getRequestDispatcher("/result.jsp");
  37. view.forward(req, resp);
  38. }
  39.  
  40. @Override
  41. protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
  42. doGet(req, resp);
  43. }
  44.  
  45. private Random rand = new Random(47); // 47是一个无关紧要的数字
  46. private Dog next() {
  47. switch (rand.nextInt(3)) {
  48. default:
  49. case 0: return new Dog("大黄");
  50. case 1: return new Dog("富贵");
  51. case 2: return new Dog("小黄");
  52. }
  53. }
  54. }

【Head First Servlets and JSP】笔记23:Expression Language(EL) 完全攻略的更多相关文章

  1. Spring Bean Expression Language(EL)

    1, Add dependency. <dependency> <groupId>org.springframework</groupId> <artifac ...

  2. 【Head First Servlets and JSP】笔记20:EL以及<jsp:useBean ....>的补充

    1.EL的英文是Expression Language,译成中文就是“表达式语言”.这是一种给前端程序员使用的脚本语言,EL与Java表达式相比并没有什么“天壤之别”,在后端程序员看来多少有点“多此一 ...

  3. EL(Expression Language)和JSTL标签(JSP Standard Tag Library)

    一.EL表达式: Expression Language提供了在 JSP 脚本编制元素范围外(例如:脚本标签)使用运行时表达式的功能.脚本编制元素是指页面中能够用于在JSP 文件中嵌入 Java代码的 ...

  4. Ext.Net学习笔记23:Ext.Net TabPanel用法详解

    Ext.Net学习笔记23:Ext.Net TabPanel用法详解 上面的图片中给出了TabPanel的一个效果图,我们来看一下代码: <ext:TabPanel runat="se ...

  5. JAVA自学笔记23

    JAVA自学笔记23 1.多线程 1)引入: 2)进程 是正在运行的程序.是系统进行资源分配和调用的独立单位.每一个进程都有它自己的内存空间和系统资源. 多进程: 单进程的计算机只能做一件事情,而现在 ...

  6. SQL Expression Language Tutorial 学习笔记二

    11. Using Textual SQL 直接使用 SQL 如果实在玩不转, 还是可以通过 test() 直接写 SQL. In [51]: s = text( ...: "SELECT ...

  7. SQL Expression Language Tutorial 学习笔记一

    http://docs.sqlalchemy.org/en/latest/core/tutorial.html Google 翻译了一下 SQLAlchemy Expression Language, ...

  8. WPF学习笔记-用Expression Design制作矢量图然后导出为XAML

    WPF学习笔记-用Expression Design制作矢量图然后导出为XAML 第一次用Windows live writer写东西,感觉不错,哈哈~~ 1.在白纸上完全凭感觉,想象来画图难度很大, ...

  9. SPRING IN ACTION 第4版笔记-第四章ASPECT-ORIENTED SPRING-004-使用AspectJ’s pointcut expression language定义Pointcut

    一. 1.在Spring中,pointcut是通过AspectJ’s pointcut expression language来定义的,但spring只支持它的一部分,如果超出范围就会报Illegal ...

随机推荐

  1. Grodno 2015 (Urozero May 2015 Day 5) D Triangles

    给出$P(<=10^9)$, 求有多少个有序三元组$(a, b, c),\ gcd(a, b, c) = 1,\ a + b + c <= P$且以它们构成的三角形中存在某个角是另外一个角 ...

  2. 【BZOJ】1857: [Scoi2010]传送带(三分)

    http://www.lydsy.com/JudgeOnline/problem.php?id=1857 好神奇的三分.. 第一次写三分啊sad..看了题解啊题解QAQ 首先发现无论怎么走一定是在AB ...

  3. smartJS 0.1 API 讲解 - Trigger

    上篇介绍了PromiseEvent,本篇介绍Trigger - 基于Promise的aop的体现:(感觉自己的对这些命名一直都很挫,也懒得想了,所以就凑合的用) Trigger 在目标对象上加入触发器 ...

  4. 关于OBJC

    http://www.objc.io/ objc这个站点是:关于objective-c语言的最佳实践和高阶技术的期刊. 看了几期非常不错,所以计划每天抽出时间翻译一篇文章和大家一起分享.

  5. hdu 4294(bfs)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4294 思路:题目的意思是说,给你n,k,则求出n的正整数倍数,使得这个数字在k进制下表示的时候需要的不 ...

  6. UITabBarItem如何更改高度

    本文转载至 http://www.cocoachina.com/bbs/read.php?tid=255361 我目前有个UITabBar,改了它的高度.但是我切换页签后,这个UITabBar样式又变 ...

  7. 【BZOJ3439】Kpm的MC密码 Trie树+可持久化线段树

    [BZOJ3439]Kpm的MC密码 Description 背景 想Kpm当年为了防止别人随便进入他的MC,给他的PC设了各种奇怪的密码和验证问题(不要问我他是怎么设的...),于是乎,他现在理所当 ...

  8. 《从零开始学Swift》学习笔记(Day 62)——Core Foundation框架之内存托管对象与非托管对象

    原创文章,欢迎转载.转载请注明:关东升的博客 内存托管对象 Swift中调用Core Foundation函数获得对象时候,对象分为:内存托管对象和内存非托管对象. 内存托管对象就是由编译器帮助管理内 ...

  9. Powershell调用RemoteExchange.ps1

    If ((Get-PSSnapin | where {$_.Name -match "Microsoft.Exchange.Management.PowerShell.E2010" ...

  10. 隐藏显示终端的光标(shell echo,linux c printf)

    https://www.cnblogs.com/niocai/archive/2011/11/11/2245727.html 一.使用shell 的 echo 命令实现. echo -ne <c ...