zoukankan      html  css  js  c++  java
  • EL 表达式

    1、概述
    2、EL 表达式作用域对象
    3、EL 表达式简化版
    4、EL 中的基础操作符
    5、EL 内置对象
    6、EL 表达式常见异常
    7、isELIgnored 属性
    8、JSP EL 中的函数
    9、EL 总结

    概述

    1、由 Java 技术开发一个 jar 包。
    2、作用降低 JSP 文件开发时 Java 命令开发强度。
    3、Tomcat 服务器本身自带了 EL 工具包( Tomcat 安装地址 /lib/el-api.jar )。
    4、负责在JSP文件上从作用域对象读取指定的共享数据并输出到响应体

    • 作用
      代替响应对象,将 Servlet 中 doGet / doPost 的执行结果写入到响应体。
    • 命令格式:
      ${作用域对象别名.共享数据}

    EL 表达式作用域对象

    JSP 文件可使用的作用域对象
    对象 描述
    ServletContext---application 全局作用域对象
    HttpSession---session 会话作用域对象
    HttpServletRequest---request 请求作用域对象
    PageContext---pageContext 当前页作用域对象(JSP 文件独有的作用域对象,Servlet 中不存在)
    • 关于当前页作用域对象
      1、在当前页作用域对象存放的共享数据仅能在当前 JSP 文件中使用,不能共享给其他 Servlet 或则其他 JSP 文件。
      2、真实开发过程,主要用于 JSTL 标签与 JSP 文件之间数据共享数据,即:
      JSTL ----> pageContext ----> JSP
      3、真实开发中,pageContext 数据由 JSTL 标签命令写入。
    EL 表达式提供作用域对象别名
    JSP EL表达式
    application ${applicationScope.共享数据名}
    session ${sessionScope.共享数据名}
    request ${requestScope.共享数据名}
    pageContext ${pageScope.共享数据名}
    • 代码示例
    <%@ page language="java" contentType="text/html; charset=UTF-8"
             pageEncoding="UTF-8"%>
    
    <%
        application.setAttribute("name", "zhangsan");
        session.setAttribute("age", "11");
        request.setAttribute("home", "CD");
    
        /*这里该用JSTL,出于方便就这样*/
        pageContext.setAttribute("num","123456");
    %>
    
    name:${applicationScope.name}<br/>
    age:${sessionScope.age}<br/>
    home:${requestScope.home}<br/>
    num:${pageScope.num}
    

    在这里插入图片描述

    EL 表达式将引用对象属性写入到响应体
    • 命令格式
      ${作用域对象别名.共享数据名.属性名}
    • 命令作用
      从作用域对象读取指定共享数据关联的引用对象的属性值,并自动将属性的结果写入到响应体。
    • 属性名
      一定要与引用类型属性名完全一致(包括大小写)。
    • EL 表达式无法读取为集合输出
      EL 表达式没有提供遍历集合方法,因此无法从作用域对象读取集合内容输出。
    • 代码示例

    Javabean:

    id;
    name;
    age;
    public Person(int id, String name, int age) {
        this.id = id;
        this.name = name;
        this.age = age;
    }
    get...
    set...
    

    OneServlet:

    public class OneServlet extends HttpServlet {
        @Override
        protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
            Person person = new Person(111, "zhangsan", 99);
            request.setAttribute("person", person);
            request.getRequestDispatcher("/index.jsp").forward(request, response);
        }
    }
    

    index.jsp:

    <%@ page language="java" contentType="text/html; charset=UTF-8"
             pageEncoding="UTF-8"%>
    
    id:${requestScope.person.id}<br/>
    name:${requestScope.person.name}<br/>
    age:${requestScope.person.age}
    

    在这里插入图片描述

    EL 表达式简化版

    • 命令格式
      ${共享数据名}
      省略了前面的作用域对象别名(applicationScope、sessionScope、requestScope、pageScope)。
    • 命令作用
      EL 表达式允许开发人员开发时省略作用域对象别名,简化读取共享数据的难度。
    • 代码示例
    <%@ page language="java" contentType="text/html; charset=UTF-8"
             pageEncoding="UTF-8"%>
    
    id:${requestScope.person.id}<br/>
    name:${requestScope.person.name}<br/>
    age:${requestScope.person.age}
    <hr/>
    简化版<br/>
    id:${person.id}<br/>
    name:${person.name}<br/>
    age:${person.age}
    

    在这里插入图片描述

    作用域优先级

    1、EL 表达式简化版由于没有指定作用域对象,所以在执行时采用“猜”的方式。
    2、EL 表达式可以从 pageContext、request、session、application 四个作用域中取到值,如果4个作用域都有同名属性的话,EL 会按照从高到低的优先级顺序获取共享数据。
    pageContext > request > session > application
    如果在 application 都没有定位成功,则返回 null。

    • 代码示例
    <%@ page language="java" contentType="text/html; charset=UTF-8"
             pageEncoding="UTF-8"%>
    
    <%
        application.setAttribute("name", "application");
        session.setAttribute("name", "session");
        request.setAttribute("name", "request");
        pageContext.setAttribute("name","pageContext");
    %>
    name:${name}
    

    在这里插入图片描述

    存在隐患:

    容易降低程序执行速度,容易导致数据定位错误。

    EL 中的基础操作符

    前提:在 JSP 文件有时需要将读取共享数据进行一番运算之后,将运算结果写入到响应体。

    1、操作

    . 访问一个Bean属性或者一个映射条目
    [] 访问一个数组或者链表的元素
    () 组织一个子表达式以改变优先级

    2、数学运算

    +
    - 减或负
    *
    /or div
    % or mod 取模

    3、关系运算

    == or eq 测试是否相等
    != or ne 测试是否不等
    < or lt 测试是否小于
    > or gt 测试是否大于
    <= or le 测试是否小于等于
    >= or ge 测试是否大于等于

    4、逻辑运算

    && or and 测试逻辑与
    ! or not 测试取反
    empty 测试是否空值

    EL 内置对象

    隐含对象 描述
    pageScope page 作用域
    requestScope request 作用域
    sessionScope session 作用域
    applicationScope application 作用域
    param Request 对象的参数,字符串
    paramValues Request 对象的参数,字符串集合
    header HTTP 信息头,字符串
    headerValues HTTP 信息头,字符串集合
    initParam 上下文初始化参数
    cookie Cookie值
    pageContext 当前页面的 pageContext
    param 和 paramValues 对象

    1、param 和 paramValues 对象用来访问参数值,通过使用 request.getParameter 方法和 request.getParameterValues 方法获得。
    2、举例来说,访问一个名为 order 的参数,可以这样使用表达式:${param.order},或者${param["order"]}
    3、param对象返回单一的字符串,而paramValues对象则返回一个字符串数组。

    param

    1、命令格式:
    ${param.请求参数名}
    (其底层实际调用 request.getParameter()
    2、命令作用
    通过请求对象读取当前请求包中请求参数内容,并将请求参数内容写入到响应体
    3、代码示例
    index.jsp
    发送请求:Http://localhost:8080/myWeb/index.jsp?userName=mike&password=123

    <%
    	String userName = request.getParameter("userName");
    	String password = request.getParameter("password");
    %>
    <%=userName%>
    <%=password%>
    <%--或--%>
    ${param.userName}
    ${param["password"]}
    

    在这里插入图片描述

    paramValues

    1、命令格式
    ${paramValues.请求参数名[下标]}
    (获取请求中的指定参数的所有值,其底层实际调用 request.getParameterValues()
    2、命令作用
    如果浏览器发送的请求参数是:一个请求参数关联多个值。此时可以通过paramVaues读取请求参数下指定位置的值,并写入到响应体。
    3、代码示例
    index.jsp
    发送请求:Http://localhost:8080/myWeb/index.jsp?pageNo=1&pageNo=2&pageNo=3
    (此时pageNo请求参数在请求包以数组形式存在:pageNo:[1,2,3] )

    <%
    	String  array[]= request.getParameterValues("pageNo");
    %>
    第一个值:<%=array[0]%>
    第二个值:<%=array[1]%>
    <%--或--%>
    <br>
    第一个值:${paramValues.pageNo[0]}
    第二个值:${paramValues.pageNo[1]}
    第三个值:${paramValues.pageNo[2]}
    

    在这里插入图片描述

    initParam

    获取初始化参数,其底层调用的是ServletContext.getInitParameter()

    pageContext 对象

    1、pageContext 对象是 JSP 中 pageContext 对象的引用。该 pageContext 与 JSP 内置对象 pageContext 是同一个对象。通过该对象,可以获取到 request、response、session、servletContext、servletConfig 等对象。
    2、注意:这些对象在 EL 里不是内置对象,这些对象只能通过 pageContext 获取。
    3、比如,访问 request 对象传入的查询字符串:
    ${pageContext.request.queryString}
    4、在 EL 中直接${pageContext.request}即可获取 request 对象,其底层调用的是 pageContext.getRequest() 方法。同理,也可以通过类似方法获取其他对象。

    • 常用
      ${pageContext.request.contextPath }
      代表 web 应用下的根,路径可读性更强了。
    <form action="${pageContext.request.contextPath }/regster" method="POST">
    	xxx<input type="text" name="name"/><br>
    	yyy<input type="text" name="age"/><br>
    	<input type="submit" value="提交">
    </form>
    
    Scope 对象

    1、pageScope,requestScope,sessionScope,applicationScope 变量用来访问存储在各个作用域层次的变量。
    2、显式访问在 applicationScope 层的 box 变量,可以这样来访问:
    applicationScope.box

    header 和 headerValues 对象

    1、header 和 headerValues 对象用来访问信息头,通过使用 request.getHeader 方法和 request.getHeaders 方法。
    2、举例来说,要访问一个名为 user-agent 的信息头,可以这样使用表达式:${header.user-agent},或者${header["user-agent"]}
    3、访问user-agent信息头:

    <%@ page import="java.io.*,java.util.*" %>
    <%
        String title = "User Agent Example";
    %>
    <html>
    	<head>
    		<title><% out.print(title); %></title>
    	</head>
    	<body>
    		<center>
    			<h1><% out.print(title); %></h1>
    		</center>
    		<div align="center">
    			<p>${header["user-agent"]}</p>
    		</div>
    	</body>
    </html>
    

    header 对象返回单一值,而 headerValues 则返回一个字符串数组。

    • header
      将请求头名称映射到单个字符串头值(通过调用 ServletRequest.getHeader(String name) 获得)。表达式 ${header.name} 相当于 request.getHeader(name)
    • headerValues
      将请求头名称映射到一个数值数组(通过调用 ServletRequest.getHeaders(String) 获得)。它与头隐式对象非常类似。表达式 ${headerValues.name} 相当于 request.getHeaderValues(name)

    EL 表达式常见异常

    1、javax.el.PropertyNotFoundException:在对象中没有找到指定属性。
    2、EL 不会抛出空指针异常,只会不显示。
    3、EL 不会抛出数组越界异常,只会不显示。

    isELIgnored 属性

    • 在当前 JSP 文件中禁用 EL 表达式
      想要停用对EL表达式的评估的话,需要使用 page 指令将 isELIgnored 属性值设为 true。
      <%@ page isELIgnored ="true|false" %>
      这样,EL 表达式就会被忽略。若设为 false,则容器将会计算 EL 表达式。
    • 在整个项目中禁用 EL 表达式
    <jsp-config>
    <jsp-property-group>
    <url-pattern>*.jsp</url-pattern>
    <el-ignored>true</el-ignored>
    </jsp-property-group>
    </jsp-config>
    

    JSP EL 中的函数

    1、JSP EL 允许在表达式中使用函数。这些函数必须被定义在自定义标签库中。函数的使用语法如下:
    ${ns:func(param1, param2, ...)}
    2、ns 指的是命名空间(namespace),func 指的是函数的名称,param1 指的是第一个参数,param2 指的是第二个参数,以此类推。比如,有函数 fn:length,在 JSTL 库中定义,可以像下面这样来获取一个字符串的长度:
    ${fn:length("Get my length")}
    3、要使用任何标签库中的函数,需要将这些库安装在服务器中,然后使用<taglib>标签在 JSP 文件中包含这些库。

    • 步骤
      1、自定义一个函数。
      2、该类及其函数,需要在扩展名为 .tld 的 xml 文件中注册。(tld:tag library definition(标签库定义))
      3、xml 文件是需要约束的,即需要配置文件头部。这个头部约束可以从以下文件中进行复制:
      在 Tomcat 安装目录下:webappsexamplesWEB-INFjsp2
      文件为:jsp2-example-taglib.tld
      4、这个 .tld 的 xml 文件,需要定义在当前 web 项目的 WEB-INF 目录下,在此目录下创建以 .tld 结尾的 xml 文件
      将 jsp2-example-taglib.tld 中头部复制到创建的 xml 文件中;再将函数注册,还是在 jsp2-example-taglib.tld 底部复制
    • 关于 jsp2-example-taglib.tld 文件
      头部:
      在这里插入图片描述
      尾部:
      在这里插入图片描述
    例子

    将字符串小写转大写。

    • 第一步:
      自定义一个函数。
    package com.aaa;
    
    public class MyEL {
    
        private static MyEL instance;
        public static MyEL getInstance() {
            if(instance==null)
            {
                instance=new MyEL();
            }
            return instance;
        }
    
        //字符串小写变大写
        public static String LowerToUpper(String str) {
            return str.toUpperCase();
        }
    }
    
    • 第二步:
      在扩展名为 .tld 的 xml 文件中注册该类及其函数(配置文件头部及注册函数)。
      MyEL.tld:
    <?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 http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd"
            version="2.0">
    
        <!--定义标签库信息-->
        <description>A tag library exercising SimpleTag handlers.</description>
        <tlib-version>1.0</tlib-version>
        <short-name>MyEL</short-name> <!--标签库名称,一般定义成和文件名一样-->
        <uri>http://tomcat.apache.org/jsp2-example-taglib</uri>
    
        <!--注册函数-->
        <function>
            <description>Converts the string to all caps</description>
            <name>LowerToUpper</name><!--函数名-->
            <function-class>com.aaa.MyEL</function-class><!--方法所在的类-->
            <function-signature>java.lang.String LowerToUpper( java.lang.String )</function-signature><!--方法签名:包括返回值以及方法名、参数-->
        </function>
    
    </taglib>
    
    • 第三步
      使用,使用时需要加上这一段:
      <%@ taglib prefix="MyEL" uri="http://tomcat.apache.org/jsp2-example-taglib" %>
      (导入标签)
      index.jsp:
    <%@ page language="java" contentType="text/html; charset=UTF-8"
             pageEncoding="UTF-8"%>
    
    <%@ taglib prefix="MyEL" uri="http://tomcat.apache.org/jsp2-example-taglib" %>
    <!--tld中的 uri 和标签库名称-->
    
    <%
        String name = "aaa";
    %>
    转大写前:
    <%=name%><br>
    
    转大写后:${MyEL:LowerToUpper("aaa")}
    

    在这里插入图片描述

    EL 总结

    1、EL 表达式不能出现在 Java 代码块、表达式块等 JSP 动态代码部分。
    2、EL 只能从四大域属性空间中获取数据(pageContext、request、session、application)。
    3、EL 不会抛出空指针异常,只会不显示。
    4、EL 不会抛出数组越界异常,只会不显示。
    5、EL 不具有对字符串进行处理的能力(可以使用 JSTL 的 EL 或者自定义 EL 函数)。

  • 相关阅读:
    element-ui upload组件 on-change事件 传自定义参数
    Javascript Object 常用方法大全
    js 数组操作
    js的Dom操作
    js指引提示-下一步-下一步
    图片右上角添加标签
    自己平时遇到的问题---记录篇
    css的书写顺序
    WebSocket使用
    15个常用的javaScript正则表达式
  • 原文地址:https://www.cnblogs.com/yu011/p/14682418.html
Copyright © 2011-2022 走看看