zoukankan      html  css  js  c++  java
  • 【Head First Servlets and JSP】笔记23:Expression Language(EL) 完全攻略

    基本上是《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了。

    <!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="80px;"></p>
        <p>年龄:<input type="text" name="age" value="19" style="50px;"></p>
        <p>qq:<input type="text" name="qq" value="55667788" style="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

    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}

    19

    55667788

    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("小黄");
            }
        }
    }
  • 相关阅读:
    【nodejs】使用Node.js实现REST Client调用REST API
    [Groovy] Groovy && JNI
    一些很实用的Maven Plugins
    秋天到了
    今天头好疼
    想起那个人的时候
    不知道标题
    生活让我懂得
    显示实现接口和实现接口
    Foreach原理
  • 原文地址:https://www.cnblogs.com/xkxf/p/7054229.html
Copyright © 2011-2022 走看看