看之前,最好先看下 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表达式 里面,不要写在标签里面;


(十一)El表达式详细介绍的更多相关文章

  1. JSP EL表达式详细介绍

    一.JSP EL语言定义 E L(Expression Language)  目的:为了使JSP写起来更加简单. 表达式语言的灵感来自于 ECMAScript 和 XPath 表达式语言,它提供了在 ...

  2. JSP EL表达式详细介绍(转)

    转自:http://www.jb51.net/article/20042.htm 为了使JSP写起来更加简单. 表达式语言的灵感来自于 ECMAScript 和 XPath 表达式语言,它提供了在 J ...

  3. JSP中的EL表达式详细介绍

    一.JSP EL语言定义 EL 提供了在 JSP 脚本编制元素范围外使用运行时表达式的功能.脚本编制元素是指页面中能够用于在 JSP 文件中嵌入 Java 代码的元素.它们通常用于对象操作以及执行那些 ...

  4. EL表达式详细教程

    EL 全名为Expression Language EL 语法很简单,它最大的特点就是使用上很方便.接下来介绍EL主要的语法结构: ${sessionScope.user.sex} 所有EL都是以${ ...

  5. java web学习总结(三十一) -------------------EL表达式

    一.EL表达式简介 EL 全名为Expression Language.EL主要作用: 1.获取数据 EL表达式主要用于替换JSP页面中的脚本表达式,以从各种类型的web域 中检索java对象.获取数 ...

  6. Spring官网阅读(十一)ApplicationContext详细介绍(上)

    文章目录 ApplicationContext 1.ApplicationContext的继承关系 2.ApplicationContext的功能 Spring中的国际化(MessageSource) ...

  7. 大数据笔记(三十一)——SparkStreaming详细介绍,开发spark程序

    Spark Streaming: Spark用于处理流式数据的模块,类似Storm 核心:DStream(离散流),就是一个RDD=================================== ...

  8. [转]EL表达式和JSTL表达式实例

    /* **Title:EL表达式和JSTL表达式实例 **Author:Insun **Blog:http://yxmhero1989.blog.163.com/ */ 为了方便写JSP,我们引入了E ...

  9. (十)EL表达式和JSTL标签快速入门

    目录 什么是 el 表达式 示例:使用EL表达式获取pageContext .request.session.application域中的数据: 示例:使用EL表达式获取Bean属性 获取当前WEB应 ...

随机推荐

  1. 1069 The Black Hole of Numbers(20 分)

    For any 4-digit integer except the ones with all the digits being the same, if we sort the digits in ...

  2. Python操作Jira

    目录 认证 项目(Project) 问题(Issue) 配置域(Fields) 关注者/评论/附件 创建/分配/转换问题 搜索 Jira提供了完善的RESTful API,如果不想直接请求API接口可 ...

  3. 用Java实现自动打开浏览器在搜索框中进行搜索

    主要使用了Java的剪切板操作和Robot类 上代码: package pers.jeaven.AutoRobot.main; import java.awt.Desktop; import java ...

  4. shell 脚本同时对远程多台机器执行命令

    脚本1:需要机器之间免密 ssh-copy-id [-i [identity_file]] [user@]machine #!/bin/bash # ------------------------- ...

  5. docker笔记--docker 各系统安装

    在线安装 Docker 在 CentOS/RHEL 中安装 Docker 在终端中运行下面的命令安装 Docker. sudo yum install -y yum-utils sudo yum-co ...

  6. java maven scope compile,provide,system,test,runtime

    在一个maven项目中,如果存在编译需要而发布不需要的jar包,可以用scope标签,值设为provided.如下: <dependency>            <groupId ...

  7. 2018-2019-2 网络对抗技术 20165231 Exp9 Web安全基础

    实验内容 本实践的目标理解常用网络攻击技术的基本原理,做不少于7个题目,共3.5分.包括(SQL,XSS,CSRF).Webgoat实践下相关实验. 实验过程 WebGoat: Webgoat是OWA ...

  8. 运行模型,COM错误,解决问题步骤

    运行模型,COM错误,解决问题步骤 1.数据新建一个,路径短一点,不要有中文 2.所有数据重新导入 3.文档新建 4,问题莫名奇妙解决了

  9. IIS URL Rewriting and ASP.NET Routing

    IIS URL Rewriting and ASP.NET Routing With the release of the URL Rewrite Module for IIS and the inc ...

  10. Matlab基础:关于图像的基本操作

    -- %% 学习目标:学习关于图像的基本操作 %% 通过抖动来增强图像的的色彩对比度 clear all; close all; I = imread('cameraman.tif');%读取灰度图像 ...