转载自(个人在 ITeye上的文章):http://leon906998248.iteye.com/blog/1502569
表达式语言(EL)是 JSP 2.0 引入的一种计算和输出 Java 对象的简单语音。
为了使JSP写起来更加简单。表达式语言的灵感来自于 ECMAScript 和 XPath 表达式语言,它提供了在 JSP 中简化表达式的方法。它是一种简单的语言,基于可用的命名空间(PageContext 属性)、嵌套属性和对集合、操作符(算术型、关系型和逻辑型)的访问符、映射到 Java 类中静态方法的可扩展函数以及一组隐式对象。
1、导入standard.jar。
2、在需要使用 EL 语音的页面加上<%@ page isELIgnored="false" %>。
注意 <%@ page isELIgnored="true" %> 表示是否禁用EL语言,TRUE表示禁止.FALSE表示不禁止.JSP2.0中默认的启用EL语言。
3、对于整个JSP应用程序,要修改WEB.XML配置(tomcat5.0.16默认是支持EL的)
首先我们要知道 EL 的内置对象有哪些----pageScope、requestScope、sessionScope、applicationScope,如果未指定scope,默认从 pageScope 到 applicationScope一次扩大范围查找属性名,也可以使用 xxxScope.属性名 直接指定在某个 scope 查找,如:
EL 提供.和[]两种运算符来存取数据。如:
(1)、普通对象和对象属性。
服务器端:
服务器端:
服务器端:
(4)、Map中的数据。
服务器端:
page Context |
JSP 页的上下文。它可以用于访问 JSP 隐式对象,如请求、响应、会话、输出、servletContext 等。例如,${pageContext.response} 为页面的响应对象赋值。 |
术语 定义
param | 将请求参数名称映射到单个字符串参数值(通过调用 ServletRequest.getParameter (String name) 获得)。getParameter (String) 方法返回带有特定名称的参数。表达式 $(param . name) 相当于 request.getParameter (name)。 |
paramValues | 将请求参数名称映射到一个数值数组(通过调用 ServletRequest.getParameter (String name) 获得)。它与 param 隐式对象非常类似,但它检索一个字符串数组而不是单个值。表达式 ${paramvalues. name) 相当于 request.getParamterValues(name)。 |
header | 将请求头名称映射到单个字符串头值(通过调用 ServletRequest.getHeader(String name) 获得)。表达式 ${header. name} 相当于 request.getHeader(name)。 |
headerValues | 将请求头名称映射到一个数值数组(通过调用 ServletRequest.getHeaders(String) 获得)。它与头隐式对象非常类似。表达式 ${headerValues. name} 相当于 request.getHeaderValues(name)。 |
cookie | 将 cookie 名称映射到单个 cookie 对象。向服务器发出的客户端请求可以获得一个或多个 cookie。表达式 ${cookie. name .value} 返回带有特定名称的第一个 cookie 值。如果请求包含多个同名的 cookie,则应该使用 ${headerValues. name} 表达式。 |
initParam | 将上下文初始化参数名称映射到单个值(通过调用 ServletContext.getInitparameter(String name) 获得)。 |
除了上述两种类型的隐式对象之外,还有些对象允许访问多种范围的变量,如 Web 上下文、会话、请求、页面:
术语 定义
pageScope | 将页面范围的变量名称映射到其值。例如,EL 表达式可以使用 ${pageScope.objectName} 访问一个 JSP 中页面范围的对象,还可以使用 ${pageScope .objectName. attributeName} 访问对象的属性。 |
requestScope | 将请求范围的变量名称映射到其值。该对象允许访问请求对象的属性。例如,EL 表达式可以使用 ${requestScope. objectName} 访问一个 JSP 请求范围的对象,还可以使用 ${requestScope. objectName. attributeName} 访问对象的属性。 |
sessionScope | 将会话范围的变量名称映射到其值。该对象允许访问会话对象的属性。例如: ${sessionScope. name} |
applicationScope | 将应用程序范围的变量名称映射到其值。该隐式对象允许访问应用程序范围的对象。 |
JSP 表达式语言提供以下操作符,其中大部分是 Java 中常用的操作符:
术语 定义
算术型 | +、-(二元)、*、/、div、%、mod、-(一元) |
逻辑型 | and、&&、or、||、!、not |
关系型 | ==、eq、!=、ne、、gt、<=、le、>=、ge。可以与其他值进行比较,或与布尔型、字符串型、整型或浮点型文字进行比较。 |
空 | empty。空操作符是前缀操作,可用于确定值是否为空。 |
条件型 | A ?B :C。根据 A 赋值的结果来赋值 B 或 C。 |
例如:
JSP 标准标记库(JSP Standard Tag Library,JSTL)是一个实现 Web 应用程序中常见的通用功能的定制标记库集,这些功能包括迭代和条件判断、数据管理格式化、XML 操作以及数据库访问。
JSTL标签库的使用是为类弥补html表的不足,规范自定义标签的使用而诞生的。在告别modle1模式开发应用程序后,人们开始注重软件的分层设计,不希望在jsp页面中出现java逻辑代码,同时也由于自定义标签的开发难度较大和不利于技术标准化产生了自定义标签库。JSTL标签库可分为5类:
1、导入standard.jar和jstl.jar。
2、在JSP页面上引入 JSTL 的引用。如:
JSTL的核心标签库标签共13个,从功能上可以分为4类:表达式控制标签、流程控制标签、循环标签、URL操作标签。使用这些标签能够完成JSP页面的基本功能,减少编码工作。如:
下面,演示各个标签的使用。
语法如下:
其中,
value:指定要输出的变量或表达式。
escapeXml:设定是否转换特殊字符(如<、>等一些转义字符),在默认值为true的情况下直接在输出<的,如果改为false将会进行转义输出“<”等。
default:为默认输出结果。如果使用表达式得到的结果为null(注意与空区别),将会输出默认结果。
例如:
提示:从功能上分语法1和语法2、语法3和语法4的效果是一样的只是把value值放置的位置不同至于使用那个根据个人的喜爱,语法1和语法2是向scope范围内存储一个值,语法3和语法4是给指定的JavaBean赋值。
例如:
例如:
流程控制标签主要用于对页面简单业务逻辑进行控制。流程控制标签包含有4个:<c:if>标签、<c:choose>标签、<c:when>标签和<c:otherwise>标签。下面将介绍这些标签的功能和使用方式。
【参数说明】:
I、test属性用于存放判断的条件,一般使用EL表达式来编写。
II、var指定名称用来存放判断的结果类型为true或false。
III、scope用来存放var属性存放的范围。
循环标签主要实现迭代操作。主要包含两个标签:<c:forEach>和<c:forTokens>标签,接下来将详细介绍这两个标签的用法。
【循环标签属性说明】:
名称 |
EL |
类型 |
是否必须 |
默认值 |
var |
N |
String |
是 |
无 |
items |
Y |
Arrays Collection Iterator Enumeration Map String []args |
是 |
无 |
begin |
Y |
int |
否 |
0 |
end |
Y |
int |
否 |
集合中最后一个元素 |
step |
Y |
int |
否 |
1 |
varStatus |
N |
String |
否 |
无 |
其中varStatus有4个状态属性,如下:
属性名 |
类型 |
说明 |
index |
int |
当前循环的索引值 |
count |
int |
循环的次数 |
frist |
boolean |
是否为第一个位置 |
last |
boolean |
是否为第二个位置 |
注:<c:forToken>的属性varStatus的使用同<c:forEach>的使用方法相同,在此就再不表述。
JSTL包含3个与URL操作有关的标签,分别为:<c:import>、<c:redirect>和<c:url>标签。它们的作用为:显示其他文件的内容、网页导向、产生URL。下面将详细介绍这3个标签的使用方法。
<c:import>标签参数说明。
名称 |
说明 |
EL |
类型 |
必须 |
默认值 |
url |
被导入资源的URL路径 |
Y |
String |
是 |
无 |
context |
相同服务器下其他的web工程,必须以“"”开头 |
Y |
String |
否 |
无 |
var |
以String类型存入被包含文件的内容。 |
N |
String |
否 |
无 |
Scope |
var变量的JSP范围 |
N |
String |
否 |
page |
charEncoding |
被导入文件的编码格式 |
Y |
String |
否 |
无 |
varReader |
以Reader类型存储被包含文件内容 |
N |
String |
否 |
无 |
【参数说明】:
I、URL为资源的路径,当应用的资源不存在时系统会抛出异常,因此该语句应该放在<c:catch></c:catch>语句块中捕获。应用资源有两种方式:绝对路径和相对路径。使用绝对路径示例如下:
IV、scope 属性标识该资源访问的范围。
V、charEncoding 属性标识该资源的编码方式。
VI、varReader 这个参数的类型是Reader,用于读取资源。
【参数说明】:
I、url 指定重定向页面的地址,可以是一个string类型的绝对地址或相对地址。
II、context
用于导入其他web应用中的页面。
例如,当请求页面时重定向到tomcat首页:
例如,使用动态生成url实现了网页的超链接:
JSTL标签提供了对国际化(I18N)的支持,它可以根据发出请求的客户端地域的不同来显示不同的语言。同时还提供了格式化数据和日期的方法。实现这些功能需要I18N格式标签库(I18N-capable formation tags liberary)。引入该标签库的方法为:
接下将详细介绍这些标签的功能和使用方式。
<fmt:formatNumber>标签参数说明:
名称 |
说明 |
EL |
类型 |
必须 |
默认值 |
value |
要格式化的数据 |
是 |
String |
是 |
无 |
type |
指定类型(单位、货币、百分比等)见表 |
是 |
String |
否 |
number |
pattern |
格式化的数据样式 |
是 |
String |
否 |
无 |
currencyCode |
货币单位代码 |
是 |
String |
否 |
无 |
cuttencySymbol |
货币符号($、¥) |
是 |
String |
否 |
无 |
groupingUsed |
是否对整数部分进行分组如(9,999) |
是 |
boolean |
是 |
true |
maxIntergerDigits |
整数部分最对显示多少位数 |
是 |
int |
否 |
无 |
minIntergerDigits |
整数部分最少显示多少位 |
是 |
int |
否 |
无 |
maxFractionDigits |
小数部分最多显示多少位 |
是 |
int |
否 |
无 |
minFractionDigits |
小数部分最少显示多少位 |
是 |
int |
否 |
无 |
var |
存储格式化后的数据 |
否 |
String |
否 |
无 |
scope |
var的JSP范围 |
否 |
String |
否 |
page |
Type属性的类型应用见表:
类型 |
说明 |
示例 |
number |
数字格式 |
0.8 |
currency |
当地货币 |
¥0.80 |
percent |
百分比格式 |
80% |
<fmt:parseNumber>标签参数说明:
名称 |
说明 |
EL |
类型 |
是否必须 |
默认值 |
value |
被解析的字符串 |
是 |
String |
是 |
无 |
type |
指定单位(数字、货币、百分比) |
是 |
String |
是 |
number |
pattern |
格式样式 |
是 |
String |
否 |
无 |
parseLocale |
用来替代默认区域的设定 |
是 |
String, Java.util. Locale |
是 |
默认本地样式 |
var |
存储已经格式化的数据 |
否 |
String |
否 |
无 |
scope |
var变量的作用域 |
否 |
String |
是 |
page |
<fmt:parseNumber>可以看作是<fmt:formatNumber>的逆运算。相应的参数和类型的配置和使用<fmt:formatNumber>格式化时相同。
<fmt:formatDate>标签属性说明:
属性名 |
说明 |
EL |
类型 |
必须 |
默认值 |
value |
将要格式化的日期对象。 |
是 |
Java.util.Date |
是 |
无 |
type |
显示的部分(日期、时间或者两者)。 |
是 |
String |
否 |
date |
partten |
格式化的样式。 |
是 |
String |
否 |
无 |
dateStyle |
设定日期的显示方式。 |
是 |
String |
否 |
default |
timeStyle |
设定时间的显示方式。 |
是 |
String |
否 |
default |
timeZone |
设定使用的时区。 |
是 |
String |
否 |
当地所用时区 |
var |
存储已格式化的日期或时间。 |
否 |
String |
否 |
无 |
scope |
指定var存储的JSP范围。 |
否 |
String |
否 |
无 |
其中type属性参数说明见表:
参数名 |
说明 |
time |
只显示时间 |
date |
只显示时期 |
both |
显示日期和时间 |
<fmt:parseData>标签属性说明:
属性名 |
说明 |
EL |
类型 |
必须 |
默认值 |
value |
将要格式化的日期时间 |
是 |
String |
是 |
无 |
type |
字符串的类型(日期、时间或全部) |
EL |
String |
是 |
date |
pattern |
字符串使用的时间样式 |
是 |
String |
是 |
无 |
parseLocale |
取代默认地区设定 |
是 |
String |
是 |
默认地区 |
dateStyle |
字符串使用的日期显示方式 |
是 |
String |
否 |
default |
timeStyle |
字符串使用的时间显示格式 |
是 |
String |
否 |
default |
timeZone |
使用的时区 |
是 |
String |
否 |
当地区时 |
var |
使用var定义的名字保存对象 |
否 |
String |
否 |
无 |
scope |
var的JSP范围 |
否 |
String |
否 |
page |
<fmt:bundle>标签属性说明:
参数名 |
说明 |
EL |
类型 |
必须 |
默认值 |
basename |
指定使用的资源文件的名称 |
是 |
String |
是 |
无 |
prefix |
前置关键字 |
是 |
String |
否 |
无 |
<fmt:setBundle>标签属性说明:
参数名 |
说明 |
EL |
类型 |
必须 |
默认值 |
basename |
指定使用的资源文件的名称 |
是 |
String |
是 |
无 |
var |
指定将资源文件保存的名称 |
否 |
String |
否 |
无 |
scope |
设定将资源文件保存的JSP范围 |
否 |
String |
否 |
page |
<fmt:message>标签属性说明:
参数名 |
说明 |
EL |
类型 |
必须 |
默认值 |
key |
指定键值的名称(索引) |
是 |
String |
是 |
无 |
bundle |
指定消息文本的来源 |
是 |
LocalizationContext |
否 |
无 |
var |
指定存储键值的变量名 |
否 |
String |
否 |
无 |
scope |
指定var的作用域 |
否 |
String |
否 |
page |
提示:建议此处的bundle使用EL表达式,因为属性bundle的类型为LocalizationContext,而不是一个String类型的URL。
【示例代码】:
创建资源文件。在message.properties文件中增加一个key和value。
news={0} welcome to out website!<br>today is :{1,date}
表达的含义是键news对应的是一个字符串,字符串中还有动态变量{0}表示第一个动态变量,{1,date}表示第二个动态变量并且该变量是一个日期类型的对象。
通过标签从资源文件中取出键值,并给动态变量赋值显示在页面。
国际化这个分类中共包含两个标签:用于设定语言地区<fmt:setLocale/>和用于设定请求的字符编码的<fmt:requestEncoding>标签。
<fmt:setLocale>标签属性说明:
参数名 |
说明 |
EL |
类型 |
必须 |
默认值 |
value |
指定区域代码 |
是 |
String java.util.Locale |
是 |
无 |
variant |
操作系统的类型 |
是 |
String |
是 |
无 |
scope |
设定时区的作用范围 |
否 |
String |
是 |
page |
value属性用来指定使用的语言代码,可以从浏览器的【工具】---【Internet选项】---【语言】---【添加】中查看浏览器支持的语言种类及语言代码。例如:中文(zh_cn)、台湾(zh_tw)、香港(zh_mo)等。
【参数说明】:
value属性用来指定使用的编码集例如:gbk、gb2312等。当没有给出value的值时将会自动搜索取寻找合适的编码方式,因此能够很好的解决中文乱码问题。
JSTL提供了与数据库相关操作的标签,可以直接从页面上实现数据库操作的功能,在开发小型网站是可以很方便的实现数据的读取和操作。本章将详细介绍这些标签的功能和使用方法。
SQL标签库从功能上可以划分为两类:设置数据源标签、SQL指令标签。
引入SQL标签库的指令代码为:
<sql:DataSource>标签属性说明:
参数名 |
说明 |
EL |
类型 |
必须 |
默认值 |
dataSource |
数据源 |
是 |
String Javax.sql.DataSource |
否 |
无 |
driver |
使用的JDBC驱动 |
是 |
String |
否 |
无 |
url |
连接数据库的路径 |
是 |
String |
否 |
无 |
user |
连接数据库的用户名 |
是 |
String |
否 |
无 |
password |
连接数据库的密码 |
是 |
String |
否 |
无 |
var |
指定存储数据源的变量名 |
否 |
String |
否 |
无 |
scope |
指定数据源存储的JSP范围 |
否 |
String |
否 |
page |
提示:是否必须是相对的,比如说如果使用数据源则,driver、url等就不再被使用。如果使用JDBC则要用到driver、url、user、password属性。
例如连接SQL Server需要进行如下配置:
<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个值,如果没有设定则从第一行开始取。
结果集参数说明:
属性名 |
类型 |
说明 |
rowCount |
int |
结果集中的记录总数 |
Rows |
Java.util.Map |
以字段为索引查询的结果 |
rowsByIndex |
Object[] |
以数字为作索引的查询结果 |
columnNames |
String[] |
字段名称数组 |
limitedByMaxRows |
boolean |
是否设置了maxRows属性来限制查询记录的数量 |
提示:limitedByMaxRows用来判断程序是否收到maxRows属性的限制。并不是说设定了maxRows属性,得到结果集的limitedByMaxRows的属性都为true,当取出的结果集小于maxRows时,则maxRows没有对结果集起到作用此时也为false。例如可以使用startRow属性限制结果集的数据量。
结果集的作用就是定义了数据在页面中的显示方式。下面给出了结果集每个属性的作用。
<sql:update>标签属性说明:
参数名 |
说明 |
EL |
类型 |
必须 |
默认值 |
sql |
查询数据的SQL语句 |
是 |
String |
是 |
无 |
dataSource |
数据源对象 |
是 |
String Javax.sql.DataSoutce |
否 |
无 |
var |
指定存储查询结果的变量名 |
否 |
String |
是 |
无 |
scope |
指定结果的作用域 |
否 |
String |
否 |
page |
提示:<sql:update>标签的属性同<sql:query>标签的属性相比只减少了maxRows和startRow2个属性。其他参数用法一样。
使用<sql:update>可以实现数据表的创建、插入数据、更行数据、删除数据。使用时只须在标签中放入正确的SQL语句即可,同时要捕获可能产生的异常。本节只对一个简单的插入操作进行说明。
【参数说明】:
value的作用为SQL中的参数赋值。
【使用示例】:
【参数说明】:
JSTL提供了操作xml文件的标签库,使用xml标签库可以省去使用Dom和SAX标签库的繁琐,能轻松的读取xml文件的内容。
<x:parse>标签属性说明:
属性名 |
说明 |
EL |
类型 |
必须 |
默认值 |
doc |
指定解析的xml文件 |
是 |
String/Reader |
是 |
无 |
var |
存储解析后的xml文件 |
否 |
String |
否 |
无 |
scope |
指定var的JSP范围 |
否 |
String |
否 |
page |
varDom |
以(org.w3c.dom.Doucemet)的形式存储解析的xml文件 |
否 |
String |
否 |
无 |
scopeDom |
指定varDom的JSP范围 |
否 |
String |
否 |
page |
systemId |
xml文件的url |
是 |
String |
否 |
无 |
filter |
解析xml文件的过滤器 |
否 |
Org.xml.sax.Filter |
否 |
无 |
提示:doc指定解析的xml文件并不是指定xml文件的路径,而是同<c:import>共同使用,由<c:import>加载并存储,然后使用<x:parse>解析。
例如:如果解析person.xml文件需要通过如下代码实现对xml文件的解析。
<c:import var="docString" url="person.xml"/><!--引入person.xml文件-->
<x:parse var="doc" doc="${docString}"/>
<c:import>语句用来导入或存储文件到JSP。如果不使用var来存储,xml文件将显式的出现在JSP文件中。
<x:parse>标签只用来解析xml文件,并不显示xml文件中的内容,如果想得到xml的节点元素或值需要使用<x:out>元素来实现。
<x:out>标签属性说明:
属性名 |
说明 |
EL |
类型 |
必须 |
默认值 |
select |
指定使用的XPath语句 |
否 |
String |
是 |
无 |
escapeXml |
是否转换特殊字符。如<等 |
否 |
boolean |
是 |
true |
提示:使用XPath语句需要用到xalan.jar支持包,可以从示例程序的lib中获取,获得直接从myEclipse中可以找到。
语法1只把根据条件表达式得到的结果的存储在JSP范围中,语法2根据<x:if>标签根据条件表达式的结果决定是否执行本体内的代码。
I、select用来指定使用的XpathExperssion表达式。
II、var设定标量名用来存储表达式的结果。
III、scope指定var存储的JSP属性范围。
<x;choose>是主标签,<x:when>和<x:otherwise>放在<x:choose>标签体内共同使用。
其中只有<x:when>有属性。
属性名 |
说明 |
EL |
类型 |
必须 |
默认值 |
select |
指定使用的XPath语句 |
否 |
String |
是 |
无 |
var |
用于存储表达式的结果 |
否 |
String |
否 |
无 |
varStatus |
用来存放循环到的变量的相关信息 |
否 |
String |
否 |
无 |
begin |
循环的起始位置 |
是 |
int |
否 |
无 |
end |
循环的终止位置 |
是 |
int |
否 |
无 |
<x:transform>和<x:param>能轻易使用XSLT样式包装xml文件,成为另一种显示方式。
<x:transform>标签属性说明:
属性名 |
说明 |
EL |
类型 |
必须 |
默认值 |
doc |
指定xml文件来源 |
是 |
String |
是 |
无 |
xslt |
转化xml的样式模板 |
是 |
String |
是 |
无 |
docSystemId |
xml文件的URI |
是 |
String |
否 |
无 |
xsltSystemId |
xslt文件的URI |
是 |
String |
否 |
无 |
result |
用来存储转换后的结果对象 |
是 |
java.xml.transform |
是 |
无 |
var |
以org.w3c.dom.Documet类型存储转换后的结果 |
否 |
String |
否 |
无 |
scope |
var的属性范围 |
否 |
String |
否 |
无 |
【参数说明】:
参考:
http://baike.baidu.com/view/1488964.htm
http://www.cnblogs.com/jinzhengquan/archive/2011/02/13/1953150.html
http://www.blogjava.net/maverick1003/articles/236575.html
https://www.ibm.com/developerworks/cn/java/j-j