一:EL表达式:

1.定义:为了计算和输出存储在标志位置的Java对象的值,JSP2.0引入了一种简洁的语言。

2.基本格式${

表达式}

所有的EL都是以“${

”开始,以“}”结尾

表达式与开始符和终结符的空格被忽略

表达式的值为null,则在页面中显示为一个空字符串,而不是null

3.EL表达式运算符

4.EL的作用域

使用EL的时候,默认会以一定顺序搜索四个作用域,将最先找到的变量值显示出来。

5.EL表达式的隐式对象

EL提供了四个与范围有关的隐式对象,对应四个存取范围

pageScope:范围和JSPpage相同,只限于当前页面

requestScope:范围和JSPrequest相同,范围限于一次请求

sessionScope:范围和JSPsession相同,范围为一次会话

applicationScope:从服务器一开始执行服务,到服务器关   闭为止

EL中,四个隐含对象只能单纯用来取得对应范围内的属性值

6.使用EL表达式的好处

1)代替复杂代码,省去条件判断

2)简单访问Bean的属性:${user.name}

3)使用EL表达式可以输出MVC中的内容,代码简单

例如:Servlet的 doPost()doGet()方法中,保存在作用域范围内

数据,可以在其它的JSP页面获取。如Servlet中有如下代码:

request.getSession().setAttribute(loginedUser,user);

JSP页面中可以这样获取:${loginedUser.name}

7.EL显示Form表单请求参数信息

EL提供了两个与输入有关的隐含对象:param paramValues

用于获取<form></form>表单提交的信息,用来解析request中的参数

格式:${param.参数名}${paramValues.参数名}

等同于Java中的request.getParameter(“参数名”)request.getParameterValues(“参数名”)

8.总结EL表达式的主要功能

1EL的功能

2)与<jsp:getProperty />类似

3)简化<jsp:getProperty />

4)精确的访问存储对象

5Bean属性的简略记法

6)空值取代错误消息

二.JSTL

1.什么是JSTL

JSTLJavaServerPages Standard Tag LibraryJSP标准标签库

2.JSTL标准标签库内的标签

3. 核心标签库

JSTL的核心标签库标签共13个,从功能上可以分为4类:表达式控制标签、流程控制标签、循环标签、URL操作标签。使用这些标签能够完成JSP页面的基本功能,减少编码工作。

1)表达式控制标签:out标签、set标签、remove标签、catch标签。

2)流程控制标签:if标签、choose标签、when标签、otherwise标签。

3)循环标签:forEach标签、forTokens标签。

4URL操作标签: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个标签,现在分别介绍它们的功能和语法。

1.<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]>默认值

2.<c:set>标签

功能:主要用于将变量存取于JSP范围中或JavaBean属性中。

<c:set>标签的编写共有4种语法格式。

语法1:存值,把一个值放在指定(pagesession等)的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赋值。

3.<c:remove>标签

<c:remove>标签主要用来从指定的JSP范围内移除指定的变量。

【语法】:

<c:remove var=变量名” [scope=page|request|session|application]/>

其中var属性是必须的,scope可以以省略。

4.<c:catch>标签:用来处理JSP页面中产生的异常,并将异常信息存储。

【语法】:<c:catch var=name1>

容易产生异常的代码

</c:catch>

【参数说明】:

var表示由用户定义存取异常信息的变量的名称。省略后也可以实现异常的捕获,当就不能显示的输出异常信息。

4.流程控制标签

流程控制标签主要用于对页面简单业务逻辑进行控制。流程控制标签包含有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]>

【参数说明】:

1test属性用于存放判断的条件,一般使用EL表达式来编写。

2var指定名称用来存放判断的结果类型为truefalse

3scope用来存放var属性存放的范围。

【使用场景】:在开发中经常会出现不同用户的权限,首先对用户名进行判断(包括进行数据库验证,该功能可以由JavaBean实现,使用EL表达式得到一个布尔型的结果),把判断的结果存放在不同的JSP范围内(比如常用的session内),这样在每个页面都可以得到该用户的权限信息,根据不同权限的用户显示不同的结果。

2).<c:choose>、<c:when>和<c:otherwise>标签

3个标签通常情况下是一起使用的,<c:choose>标签作为<c:when><c:otherwise>标签的父标签来使用。

【语法1】:

…..//业务逻辑1
…..//业务逻辑2
….//业务逻辑3
【语法2】:
表达式
【语法3】:
表达式

【参数说明】:

1)语法13个标签的嵌套使用方式,<c:choose>标签只能和<c:when>标签共同使用。

2)语法2<c:when>标签的使用方式,该标签都条件进行判断,一般情况下和<c:choose>共同使用。

3<c:otherwise>不含有参数,只能跟<c:when>共同使用,并且在嵌套中只允许出现一次。

 5.循环标签

循环标签主要实现迭代操作。主要包含两个标签:<c:forEach><c:forTokens>标签,我们主要是看<c:forEach>标签

该标签根据循环条件遍历集合(Collection)中的元素。

【语法】:

<c:forEach var=name” items=Collection” varStatus=StatusName” begin=begin” end=end” step=step>

本体内容

</c:forEach>

【参数解析】:

1var设定变量名用于存储从集合中取出元素。

2items指定要遍历的集合。

3varStatus设定变量名,该变量用于存放集合中元素的信息。    

4beginend用于指定遍历的起始位置和终止位置(可选)。

5step指定循环的步长。

其中varStatus4个状态属性(见表9-2)。

9-2 varStatus4个状态

属性名

类型

说明

index

int

当前循环的索引值

count

int

循环的次数

frist

boolean

是否为第一个位置

last

boolean

是否为第二个位置

6.SQL标签库

JSTL提供了与数据库相关操作的标签,可以直接从页面上实现数据库操作的功能,在开发小型网站是可以很方便的实现数据的读取和操作。SQL标签库从功能上可以划分为两类:设置数据源标签、SQL指令标签。

引入SQL标签库的指令代码为:

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

1) 设置数据源

使用<sql:setDataSource>标签可以实现对数据源的配置。

【语法1】:直接使用已经存在的数据源。

<sql:setDataSource dataSource=dataSource[var=name]                   [scope=page|request|session|application]/>

【语法2】:使用JDBC方式建立数据库连接。

 
[var=”name”]
[scope=”page|request|session|application”]/>

9-15 <sql:DataSource>特殊标签属性说明

参数名

说明

EL

类型

必须

默认值

dataSource

数据源

String

Javax.sql.DataSource

var

指定存储数据源的变量名

String

提示:是否必须是相对的,比如说如果使用数据源则,driverurl等就不再被使用。如果使用JDBC则要用到driverurluserpassword属性。

提示:可以把数据连接的配置存入session中,如果再用到数据库连接只须配置使用DataSource属性。

2 )SQL操作标签

JSTL提供了<sql:query><sql:update><sql:param><sql:dateParam><sql:transaction>5个标签,通过使用SQL语言操作数据库,实现增加、删除、修改等操作。下面将介绍这5个标签的功能和使用方式。

1<sql:query>标签用来查询数据。

【语法】:

 

【属性说明】:见表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所示。

maxRowsstartRow属性用来操作结果集,使用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>用来实现操作数据库如:使用createupdatedeleteinsertSQL语句,并返回影响记录的条数。

【语法】:SQL语句放在标签属性中。

<sql:update sql=SQL语句” [var=name] [scope=page|request|session|application]                                               [dateSource=dateSource]/>

提示:<sql:update>标签的属性同<sql:query>标签的属性相比只减少了maxRowsstartRow2个属性。其他参数用法一样。

使用<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>标签体中的所有操作,恢复原来的状态,重新对数据库进行操作。

【语法】: