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

  1. 防止命名冲突,在多个作用域存在同名属性能够正确引用。
  2. 解决一种特殊情况,比如我们在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>

完整war打包下载

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



王明

19

55667788

[email protected]



打印【person对象】:[email protected]

打印【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}

打印这个:{[email protected]}

19

55667788

[email protected]

food1: é??è??

food2: 马é??è?¯

Host is: localhost:8080

or:localhost:8080

Method is: GET

JSESSIONID is: 62E8FAF608E7A23D82CE1ECD0EF32C12

my email is: [email protected]



[email protected]

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("小黄");
        }
    }
}
时间: 2024-08-04 14:12:31

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

Spring Bean Expression Language(EL)

1, Add dependency. <dependency> <groupId>org.springframework</groupId> <artifactId>spring-expression</artifactId> <version>${spring.version}</version> </dependency> 2. Test Cases import org.junit.Test; impor

【Head First Servlets and JSP】笔记21:EL以及&lt;jsp:useBean ....&gt;的补充

1.EL的英文是Expression Language,译成中文就是“表达式语言”.这是一种给前端程序员使用的脚本语言,EL与Java表达式相比并没有什么“天壤之别”,在后端程序员看来多少有点“多此一举”. 2.然而,我们不能强求每一个前端程序员都去学习JAVA,EL相对于JAVA来说学习成本更低,更容易理解. 3.在以前写的代码上实践测试一下,首先把Scriptlet给禁了,(El也是可以禁的) <?xml version="1.0" encoding="UTF-8&

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

一.EL表达式: Expression Language提供了在 JSP 脚本编制元素范围外(例如:脚本标签)使用运行时表达式的功能.脚本编制元素是指页面中能够用于在JSP 文件中嵌入 Java代码的元素.它们通常用于对象操作以及执行那些影响所生成内容的计算 1)语法结构 ${expression} 2)[]与.运算符 EL 提供.和[]两种运算符来存取数据. 当要存取的属性名称中包含一些特殊字符,如.或?等并非字母或数字的符号,就一定要使用 []. 例如:${user.My-Name}应当改为

python基础教程_学习笔记23:图形用户界面

图形用户界面 丰富的平台 在编写Python GUI程序前,需要决定使用哪个GUI平台. 简单来说,平台是图形组件的一个特定集合,可以通过叫做GUI工具包的给定Python模块进行访问. 工具包 描述 Tkinter 使用Tk平台.很容易得到.半标准. wxpython 基于wxWindows.跨平台越来越流行. PythonWin 只能在Windows上使用.使用了本机的Windows GUI功能. JavaSwing 只能用于Jython.使用本机的Java GUI. PyGTK 使用GTK

程序的加载和执行(三)——《x86汇编语言:从实模式到保护模式》读书笔记23

程序的加载和执行(三)--读书笔记23 接着上次的内容说. 关于过程load_relocate_program的讲解还没有完,还差创建栈段描述符和重定位符号表. 分配栈空间与创建栈段描述符 462 ;建立程序堆栈段描述符 463 mov ecx,[edi+0x0c] ;4KB的倍率 464 mov ebx,0x000fffff 465 sub ebx,ecx ;得到段界限 466 mov eax,4096 467 mul dword [edi+0x0c] 468 mov ecx,eax ;准备为

C++学习笔记23,类内函数重载

该博文仅用于交流学习,请慎用于任何商业用途,本博主保留对该博文的一切权利. 博主博客:http://blog.csdn.net/qq844352155 转载请注明出处: 在一个类内,最常见的就是构造函数的重载了.这里我就不介绍了. 先来看看常见的类内重载. //method.cpp #include <iostream> #include <string> using namespace std; class base{ private: int i; string s; publ

OCP读书笔记(23) - 题库(ExamC)

200.Which operation requires that you create an auxiliary instance manually before executing the operation? (Choose all that apply.) A. Backup-based database duplication. B. Active database duplication. C. Tablespace point-in-time recovery. D. No ope

【Head First Servlets and JSP】实践记录01:从有脚本到无脚本

试图章节式的阅读<Head First Servlets and JSP>总感觉不对劲,这本书前后的联系性很强,有点类似于“连续剧”,而不是通常的“知识清单”. 可以建立多态的bean引用吗 使用type,但没有class scope属性默认为“page” 从有脚本到无脚本 1.快速搭建一个测试环境:输入用户名,返回“Hello, 用户名” index.html <!DOCTYPE html> <html lang="en"> <head>

LINUX SHELL脚本攻略笔记[速查]

Linux Shell脚本攻略笔记[速查] 资源 shell script run shell script echo printf 环境变量和变量 pgrep shell数学运算 命令状态 文件描述符和重定向 cat 数组和关联数组 alias date 调试脚本 函数和参数 管道 读取命令输出 read 字段分隔符和迭代器 循环 比较和测试 find xargs tr md5sum sha1sum 对目录进行校验 sort uniq tempfile split bash变量匹配切分 exp