EL表达式
介绍:
EL(Expression Language) 目的:为了使JSP写起来更加简单。
表达式语言的灵感来自于 ECMAScript 和 XPath 表达式语言,它提供了在 JSP 中简化表达式的方法。它是一种简单的语言,基于可用的命名空间(PageContext 属性)、嵌套属性和对集合、操作符(算术型、关系型和逻辑型)的访问符、映射到 Java 类中静态方法的可扩展函数以及一组隐式对象。
EL 提供了在 JSP 脚本编制元素范围外使用运行时表达式的功能。脚本编制元素是指页面中能够用于在 JSP 文件中嵌入 Java 代码的元素。它们通常用于对象操作以及执行那些影响所生成内容的计算。JSP 2.0 将 EL 表达式添加为一种脚本编制元素。
作用:
1, 获取数据:EL表达式用来替换jsp页面中的脚本表达式,他可以从各种类型的web作用域中检索Java对象,例如:访问javabean的属性,List集合,Map集合以及数组等来获取数据。
2, 执行运算:EL表达式可以在jsp页面执行一些基本的关系运算,逻辑运算和算术运算。
3, 获取web开发对象:EL表达式定义了一些隐式对象,利用这些提供的隐式对象,可以很轻松的获取对常用对象的引用,从而获得这些对象中的数据。
用法:
EL表达式的结构
${expresson}
例如:表达式A+B用EL表达式表示为${A+B}
[]与.运算符
EL 提供.和[]两种运算符来存取数据。
当要存取的属性名称中包含一些特殊字符,如.或?等并非字母或数字的符号,就一定要使用 []。
例如:
${user.stu_number}应当改为${user["stu_number"] },使用.运算符来访问它会导致异常发生。
如果要动态取值时,用[]来做,而.无法做到动态取值。
例如:
${sessionScope.user[data]}中data 是一个变量
除此之外,EL表达式中一般使用.运算符来访问其属性,因为他比较简便快捷。
最常见的我们要访问HttpSession时:
${pageContext.session}
当要获取session的id标识时:
${pageContext.session.id}
我们可以看到,使用EL表达式确实很便捷。
EL表达式操作符
算术型 | +、-、*、/、div、%、mod |
逻辑型 | and、&&、or、||、!、not |
关系型 | ==、eq、!=、ne、<、lt、>、gt、<=、le、>=、ge |
EL表达式还可以进行三目运算
如:${count?A:B}。
表示:如果count的计算结果是true,则输出结果是A,否则输出B。
常用场景:欢迎您:${user!=null ?user.username : '游客' }
这里首先判断user是否为空,不为空则去取username,为空则显示一个默认的昵称;如果不加判断直接取username,则容易出现空指针。
EL提供了判空运算符:empty
如:${empty username}
表示:判断jsp作用域中是否存在username,如果没有则返回true。(注意,这里是不存在返回的是true)。
EL表达式隐式对象
1, pageContext
用于访问 JSP 隐式对象,如请求、响应、会话、输出、servletContext 等。
pageContext对象表示当前jsp页面中的javax.servlet.jsp.PageContext,他可以访问所有其他jsp的对象。
如下,列出其可以访问的jsp对象
request | HttpServletRequest |
response | HttpServletResponse |
session | HttpSession(有开关的:page指令的session属性的取值) |
application | ServletContext |
config | ServletConfig |
page | this(当前Servlet对象) |
exception | java.lang.Throwable(有开关:page指令的isErrorPage属性改为true) |
out | JspWriter |
pageContext为EL表达式的内置隐式对象,而通过它可以访问jsp中的九大内置对象,,那么间接的我们可以使用pageContext隐式的获取jsp中的其他内置对象了。
例如,${pageContext.response} 为页面的响应对象赋值。
2, param
将请求参数名称映射到单个字符串参数值(通过调用 ServletRequest.getParameter (String name) 获得);getParameter(String) 方法返回带有特定名称的参数。
例如:表达式 ${param .name}相当于Servlet中的request.getParameter (name)
3, paramValues
将请求参数名称映射到一个数值数组(通过调用ServletRequest.getParameter (String name) 获得);它与 param 隐式对象非常类似,但它检索一个字符串数组而不是单个值。
例如:表达式 ${paramvalues.name} 相当于 request.getParamterValues(name)。
4, header
将请求头名称映射到单个字符串头值(通过调用ServletRequest.getHeader(String name) 获得)。
例如:表达式 ${header.name} 相当于 request.getHeader(name)。
5, headerValues
将请求头名称映射到一个数值数组(通过调用ServletRequest.getHeaders(String) 获得)。它与头隐式对象非常类似。
例如:表达式${headerValues. name} 相当于 request.getHeaderValues(name)。
6, cookie
将 cookie 名称映射到单个cookie 对象。向服务器发出的客户端请求可以获得一个或多个 cookie。
例如:表达式 ${cookie. name.value} 返回带有特定名称的第一个 cookie 值。
(如果请求包含多个同名的 cookie,则应该使用${headerValues. name} 表达式。)
7, initParam
将上下文初始化参数名称映射到单个值(通过调用 ServletContext.getInitparameter(String name) 获得)。
例如:获取username的上下文参数值,使用${initParam.username}
EL表达式的4个Scope
pageScope | 将页面范围的变量名称映射到其值。例如,EL 表达式可以使用 ${pageScope.objectName} 访问一个 JSP 中页面范围的对象,还可以使用 ${pageScope .objectName. attributeName} 访问对象的属性。 |
requestScope | 将请求范围的变量名称映射到其值。该对象允许访问请求对象的属性。例如,EL 表达式可以使用 ${requestScope. objectName} 访问一个 JSP 请求范围的对象,还可以使用 ${requestScope. objectName. attributeName} 访问对象的属性。 |
sessionScope | 将会话范围的变量名称映射到其值。该对象允许访问会话对象的属性。例如: ${sessionScope. name} |
applicationScope | 将应用程序范围的变量名称映射到其值。该隐式对象允许访问应用程序范围的对象。 |
EL表达式在最早的时候必须配合JSTL标签库才能使用。但在jsp2.0之后jsp容器已经可以独立的解析EL表达式了,但现在的开发中,EL表达式我们通常会拿来配合JSTL来使用,这样也会让jsp页面写起来更加简单。
JSTL标签库
介绍:
JSTL(JSP StandardTagLibrary,JSP标准标签库)是一个不断完善的开放源代码的JSP标签库,是由apache的jakarta小组来维护的。JSTL只能运行在支持JSP1.2和Servlet2.3规范的及其以上容器上,如tomcat 7.x。在JSP 2.0中也是作为标准支持的。
使用:
首先我们要引入jar,这里我们要引入两个jar ,jstl-1.2.jar和standard-1.1.2.jar,然后将这两个jar放入到WEB-INF下的lib文件夹中。然后在我们的jsp页面上要引入<%@ tagliburi="http://Java.sun.com/jsp/jstl/core"prefix="c"%>
JSTL标签中的五大类
标签库 | 作用 | URL | 前缀 |
核心 | 包含web应用的常见工作,包括循环、输入、输出等 | c | |
国际化 | 语言区域、消息、数字和日期的格式化 | fmt | |
XML | 访问XML文件 | x | |
访问数据库 | sql | ||
函数 | 集合长度,字符串操作 | http://java.sun.com/jsp/jstl/functions | fn |
1, 核心标签库<这个用到最多>
引用核心标签库的语法
JSTL 核心标签库(C标签)标签共有14个,功能上分为4类
1.表达式控制标签:out、set、remove、catch
2.流程控制标签:if、choose、when、otherwise
3.循环标签:forEach、forTokens
4.URL操作标签:import、url、redirect、param
标签作用介绍
<c:out> | 在JSP中显示数据 |
<c:set> | 保存数据 |
<c:remove> | 删除数据 |
<c:catch> | 处理产生错误的异常状况,并且将错误信息储存起来 |
<c:if> | 与我们在一般程序中用的if一样 |
<c:choose> | 本身只当做<c:when>和<c:otherwise>的父标签 |
<c:when> | <c:choose>的子标签,用来判断条件是否成立 |
<c:otherwise> | <c:choose>的子标签,接在<c:when>标签后,当<c:when>标签判断为false时被执行 |
<c:import> | 检索一个绝对或相对 URL,然后将其内容暴露给页面 |
<c:forEach> | 基础迭代标签,接受多种集合类型 |
<c:forTokens> | 根据指定的分隔符来分隔内容并迭代输出 |
<c:param> | 用来给包含或重定向的页面传递参数 |
<c:redirect> | 重定向至一个新的URL. |
<c:url> | 使用可选的查询参数来创造一个URL |
举例
forEach标签
Import标签
URL,param标签
Choose,when,otherwise标签
If标签
2, 国际化标签库
引用国际化标签库的语法
标签作用介绍
<fmt: setLocale> | 设置全局的 Locale 信息,包括语言和国家代码 |
<fmt:bundle> | 用于绑定资源文件在它的标签体内 |
<fmt:setBundle> | 允许将资源配置文件保存为一个变量。 |
<fmt:message> | 从指定的资源文件中把指定的键值取出来 |
<fmt:param> | 为格式化文本串中的占位符设置参数值,只能嵌套在<fmt:message>标签内使用 |
<fmt:requestEncoding> | 用于定义字符编码 |
<fmt:timezone> | 设定时区,时区设定在标签体内起作用 |
<fmt:setTimeZone> | 允许将时区设置保存为一个变量,结合属性 var 使用 |
<fmt:formatNumber> | 根据 Locale 格式化数字,货币和百分比 |
<fmt:parseNumber> | 用来将字符串类型的数字, 货币或百分比转换成数字类型 |
<fmt:formatData> | 用来格式化日期 |
<fmt:parseDate> | 将字符串类型的时间转换为日期类型 |
3, XML标签库
引用XML标签库的语法
标签作用介绍
<x:out> | 与<%= ... >,类似,不过只用于XPath表达式 |
<x:parse> | 解析 XML 数据 |
<x:set> | 设置XPath表达式 |
<x:if> | 判断XPath表达式,若为真,则执行本体中的内容,否则跳过本体 |
<x:forEach> | 迭代XML文档中的节点 |
<x:choose> | <x:when>和<x:otherwise>的父标签 |
<x:when> | <x:choose>的子标签,用来进行条件判断 |
<x:otherwise> | <x:choose>的子标签,当<x:when>判断为false时被执行 |
<x:transform> | 将XSL转换应用在XML文档中 |
<x:param> | 与<x:transform>共同使用,用于设置XSL样式表 |
4, 数据库标签库
引用数据库标签库的语法
标签作用介绍
<sql:setDataSource> | 指定数据源 |
<sql:query> | 运行SQL查询语句 |
<sql:update> | 运行SQL更新语句 |
<sql:param> | 将SQL语句中的参数设为指定值 |
<sql:dateParam> | 将SQL语句中的日期参数设为指定的java.util.Date 对象值 |
<sql:transaction> | 在共享数据库连接中提供嵌套的数据库行为元素,将所有语句以一个事务的形式来运行 |
5, 函数标签库
引用函数标签库的语法
标签作用介绍
fn:contains() | 测试输入的字符串是否包含指定的子串 |
fn:containsIgnoreCase() | 测试输入的字符串是否包含指定的子串,大小写不敏感 |
fn:endsWith() | 测试输入的字符串是否以指定的后缀结尾 |
fn:escapeXml() | 跳过可以作为XML标记的字符 |
fn:indexOf() | 返回指定字符串在输入字符串中出现的位置 |
fn:join() | 将数组中的元素合成一个字符串然后输出 |
fn:length() | 返回字符串长度 |
fn:replace() | 将输入字符串中指定的位置替换为指定的字符串然后返回 |
fn:split() | 将字符串用指定的分隔符分隔然后组成一个子字符串数组并返回 |
fn:startsWith() | 测试输入字符串是否以指定的前缀开始 |
fn:substring() | 返回字符串的子集 |
fn:substringAfter() | 返回字符串在指定子串之后的子集 |
fn:substringBefore() | 返回字符串在指定子串之前的子集 |
fn:toLowerCase() | 将字符串中的字符转为小写 |
fn:toUpperCase() | 将字符串中的字符转为大写 |
fn:trim() | 移除首位的空白符 |
ps:JSTL标签用法最重要的是Core标签库,这个重点记一下,其余的用到了过来翻翻看看怎么写就可以了