• (十一)El表达式详细介绍


    看之前,最好先看下 el表达式快速入门


    本来将重点讲下 el表达式 能干嘛 ;


    目录


    执行计算

    语法:${运算表达式}

    el表达式支持的运算符:

    • 关系运算符

      等于(== | eq)、不等于(!= | ne)、小于(< | lt)、大于(> | gt)·小于等于(<= |le)、大于等于(>= | ge

    • 逻辑运算符

      交集(&& | and)、并集(|| | or)、非( | not

    • empty 运算符

      检查对象是否为null 或者 "" (空串); 这个特别好用,直接帮我们判断了两种情况 ;

    • 二元表达式

      ${user != null ? user.name : ""}

      这个也很好用;

    • []. 表达式

      这个没有什么要说的,el表达式就是通过 . 或者 [] 来取出下一个值的 ;

    备注el表达式 是不支持拼接字符串的。需要我们自己写el函数来解决这个问题;(什么是el函数后文会讲)


    获得 web 开发常用对象

    el表达式 中定义了 11隐含对象,使用这些隐含对象可以很方便的获取web开发中的一些常用对象,并获取这些对象的数据。

    语法: ${隐式对象名称}获取的是隐式对象的引用 ;

    隐含对象名称 描述
    pageContext 对应于JSP页面中的pageContext对象
    pageScope 代表page域中用于保存属性的Map对象
    requestScope 代表request域中用于保存属性的Map对象
    sessionScope 代表session域中用于保存属性的Map对象
    applicationScope 代表application域中用于保存属性的Map对象
    param 表示一个保存了 一次 所有请求参数的Map对象
    paramValues 表示一个保存了 一次 所有请求参数的Map对象,对于单个请求参数,返回的是一个string[]数组
    header 表示一个保存了 一次 所有http请求头字段的Map对象
    headerValues 表示一个保存了一次 所有http请求头字段的Map对象,对于单个请求头字段,返回的是一个string[]数组
    cookie 表示一个保存了所有cookie对象的Map对象
    initParam 表示一个保存了所有web应用初始化参数的Map对象

    全是Map 对象,有点东西 ;

    备注:之前在el表达式快速入门篇里面,我说过,el表达式获取数据,是从四个域里面依次寻找的;其实这句话是不太准确的,el表达式在获取数据的时候,不是一上来就去四个域里面寻找数据的,而是先判断标识符,是不是el表达式自己定义的隐式对象 ;

    这也就是为什么,在el表达式快速入门那篇博客当中,我们举的例子,不能用pageContext当标识符的原因 ;


    关于 paramparamValues 的用法:

    可能很多人,看了上面的表格,也还是分不清这两个的区别;下面来讲下

    param:获取请求参数的时候,如果有重复的关键字一起被提交 两个name的情况下,只能获取到第一个name的值; 不要问我,为什么只保存第一个name,如果这个都想不通,那你很令我失望!因为,保存param请求参数的是一个Map对象,Map对象的特点,导致了只保存第一个,因为后来的重复值,不会保存 ;我也不知道,你有没有灵性的能看到这句话

    假如想要获取全部的name,则需要使用paramValues

    在取cookie对象的时候,我们得到一个map集合,集合中的key,就是cookie的名字。


    关于 headerheaderValues 的用法:

    与上面的用法一样;

    但是有个特别的地方:如果头字段的名字中有 - ,比如:Accept-Encoding,我们需要使用headerValues 来获取;

    headerValues[Accept-Encoding]

    调用el函数

    Sun 公司自己开发了一套强大的 el 函数库;我们可以使用 el表达式 直接调用它们 ;

    使用需要导入如下标签库:

    <%@taglib prefix="fn" uri="http://java.sun.com/jstl/core_rt" %>

    该标签库中的常用函数讲解:

    • fn:toLowerCase

      将一个字符串中包含的所有字符串中包含的所有 字符串转换为小写形式,并返回转换后的字符串,接受一个字符串类型的参数;

      如果传入空串,则也返回空串;

    • fn:toUpoerCase

      将一个字符串中包含的所有字符串中包含的所有 字符串转换为大写形式,并返回转换后的字符串,接受一个字符串类型的参数;

      如果传入空串,则也返回空串;

    • fn:trim

      删除一个字符串的 首尾的空格,并返回删除空格后的结果字符串,它接收一个字符串,返回一个字符串;

    • fn:length

      返回一个集合或数组大小或返回一个字符串包含的字符串的个数,返回值是 int 类型;

      该函数接收一个参数,这个参数可以是 <c:foreach> 标签的 items 属性支持的任类型,包括java.util.lteratorjava.util.Collectionjava.util.Map 等类的实例对象和字符串;

      如果该函数的参数为 null 或者是 元素个数为 0 的集合或数组,则函数返回0;如果参数是 空字符串,则函数返回0;简单记为:传进来就是0

    • fn:split

      以指定的字符串作为分隔符,将一个字符串分割成字符串并返回这个字符串数组;

      接受两个参数;参数一:表示要切割的字符串;参数二:作为分隔符的字符串 ;

    • fn:join

      将一个字符串作为分隔符,将一个字符串数组中的所有元素合并为一个字符串,并返回合并后的字符串。

      接受2个参数;参数一:要操作的字符串;参数二:作为分隔符的字符串;

    • fn:indexOf

      返回指定字符串在一个字符串中 第一次 出现的索引值,返回值为 int 类型;

      接受2个参数;参数一:源字符串;参数二:目标字符串;

      返回的是目标字符串在源字符串中 第一次 出现的下标,即使目标字符串在源字符串里面出现多次,也只是返回第一次出现的下标 ;

      如果目标字符串不在源字符串里面,则返回 -1

      如果目标字符串是 空串,则总是返回 0

    • fn:contains

      检测一个字符串中是否包含指定的字符串,返回结果是 布尔 类型 ;

      对大小写敏感;

      接受2个参数;参数一:源字符串;参数二:目标字符串;

      如果源字符串中包含目标字符串,则返回 true ;否则,返回 false

      如果目标字符串是 空串,则总是返回 true

      如果 需要忽略大小写 的,则使用 fn:containsIgnoreCase

    • fn:startsWith

      接受2个参数;参数一:源字符串;参数二:目标字符串;

      检测一个源字符串是否以目标字符串开头,返回值为 布尔 类型 ;

      如果目标字符串是 空串,则总是返回 true

      与之对应的是:fn:endsWith,我就不再累赘;

    • fn:replace

      接受3个参数;参数一:源字符串;参数二:要替换的字符串;参数三:替换后的字符串

    • fn:substring

      用于截取字符串;

      接受3个参数;参数一:源字符串;参数二:截取的子字符串的开始索引值;参数三:截取的子字符串的结束索引值

    • fn:substringAfter

      用于截取并返回一个源字符串中的目标字符串 第一次出现之后 的子字符串;

      接受2个参赛;参数一:源字符串;参数二:目标字符串;

      与之对应的是:fn:substringBefore

    基本上字符串的常用操作,Sun的el函数库都包含了;

    如果你发现 JSTL 标签库的函数,没有你想要的,你完全可以 自定义el函数


    自定义el函数

    el表达式允许开发人员开发自定义函数(也就是el函数),以调用java类的方法。

    语法:

    ${prefix: method(params)}
    • el表达式 中调用只能是 Java类的静态方法
    • 这个 java类的静态方法 需要在TLD文件 中描述,才可以被 el表达式 调用

      其中 java类必须是classes (也就是 src 目录)下面的public类;TLD文件 放在 WEB-INF 或其 子目录 下面 ;

    现在你可能会问,我如何编写 TLD文件

    问的好,问的秒!其实笔者也不会写,但是笔者会抄啊! 可能我说出这句话,有的人已经能知道我 师从何人 了 哈哈哈; (当然是师从老方方立勋)了,可惜没见过真人)

    我们打开我们的 lib 文件夹,下面有一个 standard.jar jar包,这个包一定有的,我们使用 JSTL 必须要导入这个包,打开它,里面有一个 META-INF 文件夹,这个文件夹下面全是TLD文件,打开 fn.tld 这个,这里面的才是 el函数 其他的都是 自定义标签 (后面会讲什么是自定义标签)的,把开头留下,再留下一个例子,就OK了

    下面是我打开的 fn.tld 的部分代码

    我们怎么写 TLD 文件,就这些代码,稍微改吧改吧,就是我们自己的 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>JSTL 1.1 core library</description>
      <display-name>JSTL core</display-name>
      <tlib-version>1.1</tlib-version>
      <!-- 这里我们要改下,改成我们自己的简化名,比如笔者,改成了自己的名字缩写 -->
      <!--  <short-name>c</short-name> -->
      <!-- 这样 我们使用自己的el函数 就是 <yaz:xxxx> 了 -->
      <short-name>yaz</short-name>
       <!-- 这里我们也要改下,改成我们自己的uri,比如笔者,改成了自己的网址,随便写一个也行 -->
      <!--  <uri>http://ijava.xin./jsp/jstl/core</uri> -->
      <uri>http://ijava.xin</uri>
    
      <!-- 上面的两个信息,我们在使用自定义的el函数,就这样导入 -->
      <!-- <%@ taglib prefix="yaz" uri="http://www.yaz.cn" %> -->
    
    <!-- 下面是描述 el函数  -->
      <function>
      <!-- 描述信息,删掉删掉 
        <description>
          Tests if an input string contains the specified substring.
        </description>
       -->
    
        <!--  el函数的名字 -->
        <name>contains</name>
        <!-- el函数所在的类 -->
        <function-class>org.apache.taglibs.standard.functions.Functions</function-class>
        <!-- el函数的方法签名,看好了涉及到的类型,都是写全名的,比如 java.lang.String 而不是 String  -->
        <function-signature>boolean contains(java.lang.String, java.lang.String)</function-signature>
          <!-- 举例子 ,删掉删掉 
        <example>
          < c:if test="${fn:contains(name, searchString)}">
        </example>
      -->
      </function>
    </taglib>

    这样在JSP页面中,我们可以用自己自定义的 el 函数了;


    备注:

    el函数 必须写在 el表达式 里面,不要写在标签里面;


  • 相关阅读:
    STL的相关知识
    有关欧拉通路/回路的一些资料整理
    差分约束
    BZOJ 2100: [Usaco2010 Dec]Apple Delivery
    BZOJ 2017: [Usaco2009 Nov]硬币游戏(A Coin Game)
    vijos 1282&1283&1284&1285 佳佳的魔法照片/魔法药水/魔杖/魔法阵
    BZOJ 1660: [Usaco2006 Nov]Bad Hair Day
    BZOJ 1602: [Usaco2008 Oct]牧场行走
    BZOJ 1647: [Usaco2007 Open]Fliptile 翻格子游戏
    BZOJ 1646: [Usaco2007 Open]Catch That Cow
  • 原文地址:https://www.cnblogs.com/young-youth/p/11665716.html
Copyright © 2020-2023  润新知