EL表达式
JSTL一般配合EL表达式一起使用,实现jsp中不出现java代码段;
EL(Expression Language)表达式语言:用于计算和输出存储在标志位置(page、request、session、application)的java对象的值,然后对它们执行简单操作;EL是JSP2.0规范的一部分,只要容器支持Servlet2.4/JSP2.0,就可以在JSP2.0网页中直接使用EL。通常与 JSTL 标记一起作用,能用简单而又方便的符号来表示复杂的行为。
EL基本格式
EL表达式的格式:用美元符号($)定界,内容包括在花括号({})中;例如:点号记法:${BeanName.beanProperty};数组记法:${BeanName[“beanProperty”]}
也可以将多个表达式与静态文本组合在一起以通过字符串并置来构造动态属性值。例如:Hello {loginInfoBean.suser} ${loginInfoBean.spwd}
pageContext:PageContext类的对象,页面上下文对象。是Javaweb四大域对象之一,其他三个域对象分别是session,request,application.Servlet只能使用session,request,application三大域对象,而JSP则可以使用全部的这四大域对象。
EL语法组成
EL隐藏对象,常用
使用EL的时候,默认会以一定顺序(pageContext、request、session、application)搜索四个作用域,将最先找到的变量显示出来。
EL存取器
存取器用来检索对象的特性或集合的元素。存取器: 通过 “[]” 或 “.” 符号获取相关数据
获取输出bean中的suser属性值:${userBean.suser}或 ${userBean[“suser”]}
获取map中key为id对应的值:${mcType[“id”]}
3) EL运算符
开启和关闭EL表达式
开启方法:在servlet2.4之后默认方法为false,即可以不写或写成,<%@ page isELIgnored=”false” %>
关闭方法:<%@ page isELIgnored="true" %>
还有一种批量禁用EL的方法,可以在WEB-INF/web.xml中使用jsp-property-group标签批量禁用el,web.xml中进行如下配置。
提供JSP脚本编制元素范围外(例如:脚本标签)使用运行时表达式的能力。脚本编制元素是指页面中能够用于在JSP文件中嵌入Java代码的元素。它们通常用于对象操作以及执行那些影响所生成内容的计算。
为了使JSP写起来更加简单,表达式语言的灵感来自于ECMAScript和XPath表达式语言,提供了在JSP中简化表达式的方法,让Jsp的代码更加简化。
EL表达式的的隐式对象
EL提供四个与范围有关的隐式对象,对应存取范围
pageScope:范围和JSP的page相同,只限于当前页面;requestScope:范围和JSP的request相同,范围限于一次请求;sessionScope:范围和JSP的session相同,范围为一次会话;applicationScope:从服务器一开始执行服务,到服务器关 闭为止。在EL中,四个隐含对象只能单纯用来取得对应范围内的属性值
(10)使用EL表达式的好处
1)代替复杂代码,省去条件判断
2)简单访问Bean的属性:${user.name}
3)使用EL表达式可以输出MVC中的内容,代码简单
例如:Servlet的 doPost()或doGet()方法中,保存在作用域范围内
数据,可以在其它的JSP页面获取。如Servlet中有如下代码:
request.getSession().setAttribute(“loginedUser”,user);
在JSP页面中可以这样获取:${loginedUser.name}
(11)EL显示Form表单请求参数信息
EL提供了两个与输入有关的隐含对象:param 和paramValues,用于获取<form></form>表单提交的信息,用来解析request中的参数格式:${param.参数名}或${paramValues.参数名},等同于Java中的request.getParameter(“参数名”)或request.getParameterValues(“参数名”)
(12)EL的功能
1)EL的功能
2)与<jsp:getProperty />类似
3)简化<jsp:getProperty />
4)精确的访问存储对象
5)Bean属性的简略记法
6)空值取代错误消息
JSTL标签库
相关概念
JSTL(JSP Standard TagLibrary,JSP标准标签库)是一个不断完善的开放源代码的JSP标签库,是由apache的jakarta小组来维护的。JSTL1.0 由四个定制标记库(core、format、xml 和 sql)和一对通用标记库验证器组成。如果要使用JSTL,则必须引用jstl.jar和 standard.jar两个包。
JSTL标签库分类
JSTL标准标签库内的标签
JSP指令是通知JSP引擎如何处理该JSP页面,不是针对程序员的。
共有三种指令
1)page指令errorPage="url" 表示该页面出错后跳转到哪个页面
include指令 <$@ include file="被包含的jsp页面"$>
在翻译成servlet是将被包含的jsp页面中的内容翻译成servlet中了,即多个jsp只会翻译成一个Servlet 我们通常将 。include指令包含的jsp页面叫静态包含,就是说编译时包含。
taglib指令
core 标记库提供了定制操作,通过限制了作用域的变量管理数据,以及执行页面内容的迭代和条件操作。它还提供了用来生成和操作 URL 的标记。
format 标记库定义了用来格式化数据(尤其是数字和日期)的操作。它还支持使用本地化资源束进行JSP页面的国际化。
xml 库包含一些标记,这些标记用来操作通过XML表示的数据,而 sql 库定义了用来查询关系数据库的操作。
两个 JSTL 标记库验证器允许开发人员在其 JSP 应用程序中强制使用编码标准。
(1)核心标签
核心标签是最常用的JSTL标签。引用核心标签库的语法如下:JSTL的核心标签库标签共13个,从功能上可以分为4类:表达式控制标签、流程控制标签、循环标签、URL操作标签。使用这些标签能够完成JSP页面的基本功能,减少编码工作。
1)表达式控制标签:out标签、set标签、remove标签、catch标签。
2)流程控制标签:if标签、choose标签、when标签、otherwise标签。
3)循环标签:forEach标签、forTokens标签。
4)URL操作标签:import标签、url标签、redirect标签。
在JSP页面引入核心标签库的代码为:
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
下面将按照功能分类,分别讲解每个标签的功能和使用方式。
1) 表达式控制标签
表达式控制分类中包括<c:out>、<c:set>、<c:remove>、<c:catch>4个标签,现在分别介绍它们的功能和语法。
a.<c:out>标签
【功能】:用来显示数据对象(字符串、表达式)的内容或结果。
在使用Java脚本输出时常使用的方式为:
<% out.println(“字符串”)%>
<%=表达式%>
使用<c:out>标签就可以实现以上功能。
<c:out value=”字符串”>
<c:out value=”EL表达式”>
提示:JSTL的使用是和EL表达式分不开的,EL表达式虽然可以直接将结果返回给页面,但有时得到的结果为空,<c:out>有特定的结果处理功能,EL的单独使用会降低程序的易读性,建议把EL的结果输入放入<c:out>标签中。
<c:out>标签的使用有两种语法格式。
【语法1】:
<c:out value=”要显示的数据对象” [escapeXml=”true|false”] [default=”默认值”]>
【语法2】:
<c:out value=”要显示的数据对象” [escapeXml=”true|false”]>默认值
b.<c:set>标签
功能:主要用于将变量存取于JSP范围中或JavaBean属性中。
<c:set>标签的编写共有4种语法格式。
语法1:存值,把一个值放在指定(page、session等)的map中。
<c:set value=”值1” var=”name1” [scope=”page|request|session|application”]>
含义:把一个变量名为name1值为“值1”的变量存储在指定的scope范围内。
含义:把一个变量名为name2,值为值2的变量存储在指定的scope范围内。
语法3:<c:set value=”值3” target=”JavaBean对象” property=”属性名”/>
含义:把一个值为“值3”赋值给指定的JavaBean的属性名。相当与setter()方法。
提示:从共能上分语法1和语法2(未写)、语法3和语法4(未写)的效果是一样的只是把value值放置的位置不同至于使用那个根据个人的喜爱,语法1和语法2是向scope范围内存储一个值,语法3和语法4是给指定的JavaBean赋值。
c.<c:remove>标签
<c:remove>标签主要用来从指定的JSP范围内移除指定的变量。
【语法】:
<c:remove var=”变量名” [scope=”page|request|session|application”]/>
其中var属性是必须的,scope可以以省略。
d.<c:catch>标签:用来处理JSP页面中产生的异常,并将异常信息存储。
【语法】:<c:catch var=”name1”>
容易产生异常的代码
</c:catch>
【参数说明】:
var表示由用户定义存取异常信息的变量的名称。省略后也可以实现异常的捕获,当就不能显示的输出异常信息。
(2).流程控制标签
流程控制标签主要用于对页面简单业务逻辑进行控制。流程控制标签包含有4个:<c:if>标签、<c:choose>标签、<c:when>标签和<c:otherwise>标签。下面将介绍这些标签的功能和使用方式。
1)<c:if>标签
<c:if>同程序中的if作用相同,用来实现条件控制。
【语法1】:
<c:if test=”条件1” var=”name” [scope=”page|request|session|application”]>
【语法2】:
<c:if test=”条件2” var=”name”[scope=”page|request|session|application”]>
【参数说明】:
(1)test属性用于存放判断的条件,一般使用EL表达式来编写。
(2)var指定名称用来存放判断的结果类型为true或false。
(3)scope用来存放var属性存放的范围。
【使用场景】:在开发中经常会出现不同用户的权限,首先对用户名进行判断(包括进行数据库验证,该功能可以由JavaBean实现,使用EL表达式得到一个布尔型的结果),把判断的结果存放在不同的JSP范围内(比如常用的session内),这样在每个页面都可以得到该用户的权限信息,根据不同权限的用户显示不同的结果。
2).<c:choose>、<c:when>和<c:otherwise>标签
这3个标签通常情况下是一起使用的,<c:choose>标签作为<c:when>和<c:otherwise>标签的父标签来使用。
【语法1】:
[html] view plain copy print?
1. <c:choose>
2. <c:when>
3. …..//业务逻辑1
4. </c:when>
5. <c:otherwise>
6. …..//业务逻辑2
7. </c:otherwise>
8. ….//业务逻辑3
9. </c:choose>
10. 【语法2】:
11. <c:when text=”条件”>
12. 表达式
13. </c:when>
14. 【语法3】:
15. <c:otherwise>
16. 表达式
17. </c:otherwise>
<c:choose>
<c:when>
…..//业务逻辑1
</c:when>
<c:otherwise>
…..//业务逻辑2
</c:otherwise>
….//业务逻辑3
</c:choose>
【语法2】:
<c:whentext=”条件”>
表达式
</c:when>
【语法3】:
<c:otherwise>
表达式
</c:otherwise>
【参数说明】:
(1)语法1为3个标签的嵌套使用方式,<c:choose>标签只能和<c:when>标签共同使用。
(2)语法2为<c:when>标签的使用方式,该标签都条件进行判断,一般情况下和<c:choose>共同使用。
(3)<c:otherwise>不含有参数,只能跟<c:when>共同使用,并且在嵌套中只允许出现一次。
(3) 循环标签
循环标签主要实现迭代操作。主要包含两个标签:<c:forEach>和<c:forTokens>标签,我们主要是看<c:forEach>标签
该标签根据循环条件遍历集合(Collection)中的元素。
【语法】:
<c:forEach var=”name” items=”Collection” varStatus=”StatusName” begin=”begin” end=”end” step=”step”>
本体内容
</c:forEach>
【参数解析】:
(1)var设定变量名用于存储从集合中取出元素。
(2)items指定要遍历的集合。
(3)varStatus设定变量名,该变量用于存放集合中元素的信息。
(4)begin、end用于指定遍历的起始位置和终止位置(可选)。
(5)step指定循环的步长。
其中varStatus有4个状态属性(见表9-2)。
表9-2 varStatus的4个状态
属性名
类型
说明
index
int
当前循环的索引值
count
int
循环的次数
frist
boolean
是否为第一个位置
last
boolean
是否为第二个位置
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
标签
描述
用于在JSP中显示数据,就像<%= ... >
用于保存数据
用于删除数据
用来处理产生错误的异常状况,并且将错误信息储存起来
与我们在一般程序中用的if一样
本身只当做<c:when>和<c:otherwise>的父标签
<c:choose>的子标签,用来判断条件是否成立
<c:choose>的子标签,接在<c:when>标签后,当<c:when>标签判断为false时被执行
检索一个绝对或相对 URL,然后将其内容暴露给页面
基础迭代标签,接受多种集合类型
根据指定的分隔符来分隔内容并迭代输出
用来给包含或重定向的页面传递参数
重定向至一个新的URL.
使用可选的查询参数来创造一个URL
(2)格式化标签
JSTL格式化标签用来格式化并输出文本、日期、时间、数字。引用格式化标签库的语法如下:<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
标签
描述
使用指定的格式或精度格式化数字
解析一个代表着数字,货币或百分比的字符串
使用指定的风格或模式格式化日期和时间
解析一个代表着日期或时间的字符串
绑定资源
指定地区
绑定资源
指定时区
指定时区
显示资源配置文件信息
设置request的字符编码
(3)SQL标签
JSTL SQL标签库提供了与关系型数据库(Oracle,MySQL,SQL Server等等)进行交互的标签。引用SQL标签库的语法如下:
<%@taglib prefix="sql" uri="http://java.sun.com/jsp/jstl/sql"%>
标签
描述
指定数据源
运行SQL查询语句
运行SQL更新语句
将SQL语句中的参数设为指定值
将SQL语句中的日期参数设为指定的java.util.Date 对象值
在共享数据库连接中提供嵌套的数据库行为元素,将所有语句以一个事务的形式来运行
JSTL提供了<sql:query>、<sql:update>、<sql:param>、<sql:dateParam>和<sql:transaction>这5个标签,通过使用SQL语言操作数据库,实现增加、删除、修改等操作。下面将介绍这5个标签的功能和使用方式。
1)<sql:query>标签用来查询数据。
【语法】:
[html] view plain copy print?
1. <sql:query sql=”sqlQuery” var=”name” [scope=”page|request|session|application”]
2.
3. [dataSource=”dateSource”]
4.
5. [maxRow=”maxRow”]
6.
7. [startRow=”starRow”]/>
<sql:querysql=”sqlQuery” var=”name” [scope=”page|request|session|application”]
[dataSource=”dateSource”]
[maxRow=”maxRow”]
[startRow=”starRow”]/>
【属性说明】:见表9-16。
表9-16 <sql:query>标签属性说明
参数名
说明
EL
类型
必须
默认值
sql
查询数据的SQL语句
是
String
是
无
dataSource
数据源对象
是
String
Javax.sql.DataSoutce
否
无
maxRow
设定最多可以暂存数据的行数
是
String
否
无
startRow
设定从那一行数据开始
是
String
否
无
var
指定存储查询结果的变量名
否
String
是
无
scope
指定结果的作用域
否
String
否
page
使用<sql:query>必须指定数据源,dataSource是可选的,如果未给定该属性标签会在page范围内查找是否设置过数据源,如果没有找到将抛出异常。
一般情况下使用<sql:setDateSource>标签设置一个数据源存储在session范围中,当需要数据库连接时使用dataSource属性并实现数据库的操作。
<sql:query>的var属性是必须的用来存放结果集,如果没有指定scope范围则默认为page,即在当前页面我们可以随时输出查询结果。结果集有一系列的属性如表9-17所示。
maxRows和startRow属性用来操作结果集,使用SQL语句首先吧数据放入内存中,检查是否设置了startRow属性,如果设置了就从starRow指定的那一行开始取maxRows个值,如果没有设定则从第一行开始取。
表9-17 结果集参数说明
属性名
类型
说明
rowCount
int
结果集中的记录总数
Rows
Java.util.Map
以字段为索引查询的结果
rowsByIndex
Object[]
以数字为作索引的查询结果
columnNames
String[]
字段名称数组
limitedByMaxRows
boolean
是否设置了maxRows属性来限制查询记录的数量
提示:limitedByMaxRows用来判断程序是否收到maxRows属性的限制。并不是说设定了maxRows属性,得到结果集的limitedByMaxRows的属性都为true,当取出的结果集小于maxRows时,则maxRows没有对结果集起到作用此时也为false。例如可以使用startRow属性限制结果集的数据量。
结果集的作用就是定义了数据在页面中的显示方式。下面给出了结果集每个属性的作用。
q rowCount属性。该属性统计结果集中有效记录的量,可以使用于大批量数据分页显示。
q Rows属性。等到每个字段对应的值。返回的结果为:字段名={字段值···}
q rowsByIndex属性。常用得到数据库中数据的方式,从有效行的第一个元素开始遍历,到最后一个有效行的最后一个元素。
q columnNames属性。用于得到数据库中的字段名。
q limitedByMaxRows属性。用于判断是否受到了maxRows的限制。
2).<sql:update>标签
<sql:update>用来实现操作数据库如:使用create、update、delete和insert等SQL语句,并返回影响记录的条数。
【语法】:SQL语句放在标签属性中。
<sql:update sql=”SQL语句” [var=”name”] [scope=”page|request|session|application”] [dateSource=”dateSource”]/>
提示:<sql:update>标签的属性同<sql:query>标签的属性相比只减少了maxRows和startRow2个属性。其他参数用法一样。
使用<sql:update>可以实现数据表的创建、插入数据、更行数据、删除数据。使用时只须在标签中放入正确的SQL语句即可,同时要捕获可能产生的异常。本节只对一个简单的插入操作进行说明。
3).<sql:param>标签
<sql:param>标签用于动态的为SQL语句设定参数,同<sql:query>标签共同使用。可以防止SQL注入作用类似于java.sql.PreparedStatement。
【语法】:
<sql:param value=”value”/>
【参数说明】:
value的作用为SQL中的参数赋值。
4).<sql:dataParam>标签主要用于为SQL标签填充日期类型的参数值。
【语法】:<sql:dateParam value=”date”[type=”timestamp|time|date”]/>
【参数说明】:
q value属性:java.util.Date类型的参数。
q type属性:指定填充日期的类型timestamp(全部日期和时间)、time(填充的参数为时间)、date(填充的参数为日期)。
5.<sql:transaction>标签
<sql:transaction>标签提供了数据操作的一种安全机制(即事务回滚),当操作数据库的某条SQL语句发生异常时,取消<sql:transaction>标签体中的所有操作,恢复原来的状态,重新对数据库进行操作。
【语法】:
[html] view plain copy print?
1. <sql:transaction [dataSource=”dataSource”]
2.
3. [isolation=”read_committed|read_uncommitted|repeatable|serializable”]
4.
5. >
6.
7. <sql:query>
8.
9. <sql:uptade>
10.
11. </sql:transation>
(4)XML 标签
xPath是一门在XML文档中查找信息的语言,JSTL XML标签库提供了创建和操作XML文档的标签。引用XML标签库的语法如下:
<%@taglib prefix="x" uri="http://java.sun.com/jsp/jstl/xml"%>
在使用xml标签前,你必须将XML 和 XPath 的相关包拷贝至你的<Tomcat 安装目录>\lib下:
XercesImpl.jar
xalan.jar
标签
描述
与<%= ... >,类似,不过只用于XPath表达式
解析 XML 数据
设置XPath表达式
判断XPath表达式,若为真,则执行本体中的内容,否则跳过本体
迭代XML文档中的节点
<x:when>和<x:otherwise>的父标签
<x:choose>的子标签,用来进行条件判断
<x:choose>的子标签,当<x:when>判断为false时被执行
将XSL转换应用在XML文档中
与<x:transform>共同使用,用于设置XSL样式表
(5)JSTL函数
JSTL包含一系列标准函数,大部分是通用的字符串处理函数。引用JSTL函数库的语法如下:
<%@taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions"%>
函数
描述
测试输入的字符串是否包含指定的子串
测试输入的字符串是否包含指定的子串,大小写不敏感
测试输入的字符串是否以指定的后缀结尾
跳过可以作为XML标记的字符
返回指定字符串在输入字符串中出现的位置
将数组中的元素合成一个字符串然后输出
返回字符串长度
将输入字符串中指定的位置替换为指定的字符串然后返回
将字符串用指定的分隔符分隔然后组成一个子字符串数组并返回
测试输入字符串是否以指定的前缀开始
返回字符串的子集
返回字符串在指定子串之后的子集
返回字符串在指定子串之前的子集
将字符串中的字符转为小写
将字符串中的字符转为大写
移除首位的空白符
JSTL的优点
为什么要用JSTL
我们JSP用于开发信息展现页非常方便;也可以嵌入java代码(scriptlet、表达式和声明)代码用来实现相关逻辑控制。看下面程序。但这样做会带来如下问题:jsp维护难度增加、出错提示不明确,不容易调试、分工不明确,即jsp开发者是美工也是程序员、最终增加程序的开发成本。
解决上面的问题可以使用定制标记库,JSTL使JSP开发者可以减少对脚本元素的需求,甚至可以不需要它们,从而避免了相关的维护成本。使分工更明确。JSTL一般配合EL一起使用,因此先看看EL.
使用方法
需要引入的标签库
8.