• JSP第一篇 -----JSP浅聊EL表达式第一篇: 基础操作,以及域搜索顺序以及EL隐式对象


    本篇主要聊的JSP中的EL表达式

    EL表达式的全称为EXpression Language,而EL表达式存在的意义是什么呢?

    EL表达式主要是代替jsp页面中的表达式脚本在jsp页面中进行数据的输出,EL表达式在输出数据比jsp表单脚本要简洁的多,其可以理解为jQuery对JavaScript的进行封装,而更加简洁的使用脚本。当然也有弊端那就是你想要享受这个简洁的便利,那就需要在记一遍它使用格式或者说用法。

    来一个例子演示一下其简写效果:

    <%@ page contentType="text/html;charset=UTF-8" isErrorPage="true" language="java" %>
    
    
        test
    
    
    
    <%
        //添加了一个属性
        request.setAttribute("name", "宫崎老贼");
    %>
    
    脚本表达式1:<%=request.getAttribute("name")   %>
    
    脚本表达式2:<%=request.getAttribute("name1") %>
    EL表达式:${name}
    EL表达式:${name1}
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22

    效果:

    在这里插入图片描述

    这个可以看到两个:

    • EL表达式的确要简洁的多。
    • EL表达式其不像是脚本表达式那种没有属性就显示NULL的字符串,而是不显示任何数据。

    EL与域属性

    其实在上面通过EL表达式方式很简单,但是其取出的数据是智能取出reuqest中的数据吗,因为前面聊过jsp中有四大域对象:

    域对象描述
    pageContextPageContext重新类的实现类当前JSP页面范围内有效
    requestHttpServletRequest类数据一次请求中有效
    sessionHttpSession类一个会话范围有效,通俗的说就是其生命周期是打开浏览器访问,直到浏览器关闭结束
    applicationServletContext类整个web范围内都有效,简单的说就是web工程不关闭服务器,那其数据一致都存在.

    如果可以取出四个域对象的话,又有一个问题了,那就是如果属性名字一样时候取出那个数据?

    <%@ page contentType="text/html;charset=UTF-8" isErrorPage="true" language="java" %>
    
    
        test
    
    
    
    <%
        //添加了一个属性
        pageContext.setAttribute("name", "pageContext中v胖不会数3");
        request.setAttribute("name", "request中宫崎老贼");
        session.setAttribute("name", "session中用心创造快乐,不充钱快乐nmb");
        application.setAttribute("name", "application中 对游戏我们从来不游戏,没钱没肝玩p游戏");
    %>
    
    EL表达式:${name}
    
    
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    无论上面四个如何放都是输出这个。

    在这里插入图片描述

    然后把pageContext属性注释掉后输出:

    在这里插入图片描述

    然后把pageContext和request属性注释后:

    在这里插入图片描述

    然后就剩下application属性后:

    在这里插入图片描述

    所以可以看出EL表达式其会根据域对象找属性的权限:pageContext > request > session >application

    EL基础操作符号

    毕竟任何一种表达式除了**${}**这个格式外还有一些基础的操作符号,其如下:

    操作符描述
    .访问一个Bean属性或者一个映射条目
    []访问一个数组或者链表的元素
    ( )组织一个子表达式以改变优先级
    +
    -减或负
    *
    / or div
    % or mod取模
    == or eq测试是否相等
    != or ne测试是否不等
    < or lt测试是否小于
    > or gt测试是否大于
    <= or le测试是否小于等于
    >= or ge测试是否大于等于
    && or and测试逻辑与
    || or or测试逻辑或
    ! or not测试取反
    empty测试是否空值

    JSP EL隐含对象

    JSP EL支持下表列出的隐含对象:

    隐含对象描述
    pageScopepage 作用域
    requestScoperequest 作用域
    sessionScopesession 作用域
    applicationScopeapplication 作用域
    paramRequest 对象的参数,字符串
    paramValuesRequest对象的参数,字符串集合
    headerHTTP 信息头,字符串
    headerValuesHTTP 信息头,字符串集合
    initParam上下文初始化参数
    cookieCookie值,不再单独演示了因为header也可以得到
    pageContext当前页面的pageContext,其作用和pageScope相同所以不再单独演示。

    隐含对象其实说白了就是EL表单在封装的时候已经把一些对象进行封装,可以直接被我们调用。

    域Scope对象

    前面聊了EL表达式在域中取出数据的权限排序,当然也可以通过隐式对象进行强调用某个域的数据。

    pageScope,requestScope,sessionScope,applicationScope变量用来访问存储在各个作用域层次的变量。其对应关系如下:

    Scope对象对应的域对象描述
    pageScopepageContextPageContext重新类的实现类当前JSP页面范围内有效
    requestScoperequestHttpServletRequest类数据一次请求中有效
    sessionScopesessionHttpSession类一个会话范围有效,通俗的说就是其生命周期是打开浏览器访问,直到浏览器关闭结束
    applicationScopeapplicationServletContext类整个web范围内都有效,简单的说就是web工程不关闭服务器,那其数据一致都存在.

    来一个例子:

    <%@ page contentType="text/html;charset=UTF-8" isErrorPage="true" language="java" %>
    
    
        test
    
    
    
    <%
        //添加了一个属性
        pageContext.setAttribute("name", "pageContext中v胖不会数3");
        request.setAttribute("name", "request中宫崎老贼");
        session.setAttribute("name", "session中用心创造快乐,不充钱快乐nmb");
        application.setAttribute("name", "application中 对游戏我们从来不游戏,没钱没肝玩p游戏");
    %>
    <%--这个地方吐槽一下,这个真的省略很多吗,除了省略的脚本标签 还有就是前面一直说的可以el表达式直接就是返回而脚本却需要返回对象返回--%>
    脚本表达式 <% out.write(session.getAttribute("name").toString()); %>
    
    EL表达式:${sessionScope.get("name")}
    <%--当然还有一个简化可以使用.--%> EL表达式:${sessionScope.name}
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24

    在这里插入图片描述

    当然其还是封装了很多方法,其四个域的方法封装的很像所以后面就会展开一个说就行了,不再分域而演示。

    现在看一下提供的方法:

    • pageScope拥有的方法

    在这里插入图片描述

    • requestScope的方法:

    在这里插入图片描述

    • sessionScope的方法:

      在这里插入图片描述

    • applicationScope中的方法

    在这里插入图片描述

    所以还是那句话,对于这个四个域Scope去最大的区别不是方法,而是决定把数据放在那个域中。

    而且方法不说的原因是一个,因为都是map的方法:

    在这里插入图片描述

    所以就不展开聊方法了,如果想了解可以看一下map 的常用方法:

    方法描述
    boolean containsKey(Object k)如果此映射包含指定键的映射关系,则返回 true。
    boolean containsValue(Object v)如果此映射将一个或多个键映射到指定值,则返回 true。
    Set entrySet( )返回此映射中包含的映射关系的 Set 视图。
    boolean equals(Object obj)比较指定的对象与此映射是否相等。
    Object get(Object k)返回指定键所映射的值;如果此映射不包含该键的映射关系,则返回 null。
    int hashCode( )返回此映射的哈希码值。
    boolean isEmpty( )如果此映射未包含键-值映射关系,则返回 true。
    Set keySet( )返回此映射中包含的键的 Set 视图。
    Object put(Object k, Object v)将指定的值与此映射中的指定键关联(可选操作)。
    void putAll(Map m)从指定映射中将所有映射关系复制到此映射中(可选操作)。
    Object remove(Object k)如果存在一个键的映射关系,则将其从此映射中移除(可选操作)。
    int size( )返回此映射中的键-值映射关系数。
    Collection values( )返回此映射中包含的值的 Collection 视图。
    replace(Object k, Object newv)将k的值换成newv

    param 和paramValues

    其实两个都是得到参数的。

    • param 得到的是 Request 对象的参数,字符串

    • paramValues 得到是 Request对象的参数,字符串集合

    两者除了都是request请求数据,还有一个共同点那就是也是MAP.

    在这里插入图片描述

    在这里插入图片描述

    现在测试一下:

    ${param}
    
    ${param.get("name")}
    ${paramValues}
    ${paramValues.get("name")}
    ${paramValues.get("name")[0]}
    ${paramValues.get("name")[1]}
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    在这里插入图片描述

    header和headerValues对象

    header和headerValues对象用来访问信息头,header对象返回单一值,而headerValues则返回一个字符串数组。

    其实效果同param 和paramValues的区别,需要了解的http的请求头的参数,如果不动可以看我另一篇文章爬虫基础中聊了这个传送阵

    initParam

    initParam得到上下文的内容,其得到是web.xml如下标签的内容:

       
        <context-param>
            <param-name>nameparam-name>
            <param-value>李四param-value>
        context-param>
    
    • 1
    • 2
    • 3
    • 4
    • 5

    然后无论访问javaweb项目中的那个资源都可以得到这个配置的数据,就是jsp也不例外如下: 在这里插入图片描述

  • 相关阅读:
    react-生命周期与组件传参
    SQL必需掌握的100个重要知识点:联结表
    fcpx插件:82种复古电影胶卷框架和效果mFilm Matte
    MySQL中的日志“binlog”的三种格式这么好玩
    CSS详解(二)
    数据包取证分析笔记
    LabVIEW为可执行文件构建安装程序时找不到运行引擎
    安全运营之通行字管理
    【word密码】为什么word设置只读模式之后,还能编辑?
    基于android的轻餐饮点餐APP(ssm+uinapp+Mysql)
  • 原文地址:https://blog.csdn.net/u011863822/article/details/126185019