JST简介

从JSP 1.1规范开始,JSP就支持在JSP中使用自定义标签了,自定义标签的广泛使用造成了程序员重复定义,这样就促成了JSTL(JavaServer? Pages Standard Tag Library)的诞生。作者:丁令([External Link]http:///www.DingL.com/)

JSTL简介

JSTL是一个不断完善的开放源代码的JSP标签库,是由apache的jakarta小组来维护的。JSTL只能运行在支持JSP1.2和Servlet2?.3规范的容器上,如tomcat 4.x。但是在即将推出的JSP 2.0中是作为标准支持的。
JSTL目前的最新版本为1.02,最终发布版为1.0。JSTL包含两个部分:标签库和EL(Expression Language表达式语言)语言。


标签库目前支持四种标签:

标签URI前缀示例
Core[External Link]http://java.sun.com/jstl/corec<c:tagname ...>
XML processing[External Link]http://java.sun.com/jstl/xmlx<x:tagname ...>
I18N capable formatting[External Link]http://java.sun.com/jstl/fmtfmt<fmt:tagname ...>
Database access (SQL)[External Link]http://java.sun.com/jstl/sqlsql<sql:tagname ...>



Core支持JSP中的一些基本的操作;
XML processing支持XML文档的处理;
I18N capable formatting支持对JSP页面的国际化;
Database access (SQL)支持JSP对数据库的操作。

Hot! Core标签库 Hot!

1、 通用标签

<c:out>
<c:out>标签用于在JSP中显示数据,它有如下属性

属 性描 述是否必须缺省值
value输出的信息,可以是EL表达式或常量
defaultvalue为空时显示信息
escapeXml为true则避开特殊的xml字符集true


例子:

您的用户名是: <c:out value=”${user.username}” default=”guest”/>


显示用户的用户名,如为空则显示guest

<c:out value="${sessionScope.username}"/>


指定从session中获取username的值显示;

<c:out value="${username}">


显示username的值,默认是从request(page)中取,如果request中没有名为username的对象则从session中取,session中没有则从application(servletContext)中取,如果没有取到任何值则不显示。

<c:set>
<c:set>标签用于保存数据,它有如下属性

属 性描 述是否必须缺省值
value要保存的信息,可以是EL表达式或常量 
target需要修改属性的变量名,一般为javabean的实例
property需要修改的javabean属性
var需要保存信息的变量
scope保存信息的变量的范围page


如果指定了target属性, 那么property属性也必须指定。
例子:

<c:set value="${test.testinfo}" var="test2" scope=”session”>


将test.testinfo的值保存到session的test2中,其中test是一个javabean的实例,testinfo是test对象的属性。

<c:set target="${cust.address}" property="city" value="${city}"/>


将对象cust.address的city属性值保存到变量city中

<c:remove>
<c:remove>标签用于删除数据,它有如下属性

属 性描 述是否必须缺省值
var要删除的变量
scope被删除变量的范围所有范围,包括page、request、session、application等


例子:

<c:remove var="test2" scope="session"/>


从session中删除test2变量。

2、 流控制标签

<c:if>
<c:if>标签有如下属性

属 性描 述是否必须缺省值
test需要评价的条件,相当于if (...){}语句中的条件
var要求保存条件结果的变量名
scope保存条件结果的变量范围page



<c:choose>
这个标签不接受任何属性

<c:when>
<c:when>标签有以下属性

属 性描 述是否必须缺省值 
test需要评价的条件



<c:otherwise>
这个标签同样不接受任何属性

例子:

<c:if test="${user.wealthy}">
user.wealthy is true.
</c:if>


如果user.wealthy值true,则显示user.wealthy is true.

<c:choose>
<c:when test="${user.generous}">
user.generous is true.
</c:when> 
<c:when test="${user.stingy}">
user.stingy is true.
</c:when>
<c:otherwise>
user.generous and user.stingy are false.
</c:otherwise>
</c:choose>



只有当条件user.generous返回值是true时,才显示user.generous is true.
只有当条件user.stingy返回值是true时,才显示user.stingy is true.
其它所有的情况(即user.generous和user.stingy的值都不为true)全部显示user.generous and user.stingy are false.

由于JSTL没有形如if (){…} else {…}的条件语句,所以这种形式的语句只能用<c:choose>、<c:when>和<c:otherwise>标签共同来完成了。

3、 循环控制标签

<c:forEach>
<c:forEach>标签用于通用数据,它有以下属性

属 性描 述是否必须缺省值
items进行循环的项目
begin开始条件0
end结束条件集合中的最后一个项目 
step步长1
var代表当前项目的变量名
varStatus显示循环状态的变量



例子:

<c:forEach items="${vectors}" var="vector">
<c:out value="${vector}"/>
</c:forEach>



相当于java语句

for (int i=0;i<vectors.size();i++) {
out.println(vectors.get(i));
}



在这里vectors是一个java.util.Vector对象,里面存放的是String数据,vector是当前循环条件下String对象。实际上这里的vectors可以是任何实现了java.util. Collection接口的对象。

<c:forEach begin="0" end="100" var="i" step="1">
count=<c:out value="${i}"/><br>
</c:forEach>


输出:
count=0
...
count=100

<c:forTokens>
<c:forTokens>标签有以下属性

属 性描 述是否必须缺省值
items进行循环的项目
delims分割符
begin开始条件0
end结束条件集合中的最后一个项目 
step步长1
var代表当前项目的变量名
varStatus显示循环状态的变量



例子

<c:forTokens items="a:b:c:d" delims=":" var="token">
<c:out value="${token}"/>
</c:forTokens>


这个标签的使用相当于java.util.StringTokenizer?类。在这里将字符串a:b:c:d以:分开循环四次,token是循环到当前分割到的字符串。

4.导入文件和URL

JSTL核心标签库支持使用<c:import>来包含文件,使用<c:url>来打印和格式化URL,使用<c:redirect>来重定向URL。

<c:import>
<c:import>标签包含另外一个页面代码到当前页,它有以下属性

属 性描 述是否必须缺省值 
url需要导入页面的url
context/后跟本地web应用程序的名字当前应用程序 
charEncoding用于导入数据的字符集ISO-8859-1
var接受导入文本的变量名page
scope接受导入文本的变量的变量范围1
varReader用于接受导入文本的java.io.Reader变量名
varStatus显示循环状态的变量



<c:url>
<c:url>标签输出一个url地址,它有以下属性

属 性描 述是否必须缺省值 
urlurl地址 
context/后跟本地web应用程序的名字当前应用程序
charEncoding用于导入数据的字符集ISO-8859-1
var接受处理过的url变量名,该变量存储url输出到页
scope存储url的变量名的变量范围page



例子:

<c:import url="http://www.url.com/edit.js" var="newsfeed"/>


将url [External Link]http://www.url.com/edit.js包含到当前页的当前位置,并将url保存到newsfeed变量中

<a href="<c:url url="/index.jsp"></a>"/>



在当前页的当前位置输出<a href="[External Link]http://www.yourname.com/index.jsp"/>,[External Link]http://www.yourname.com是当前页的所在的位置。


<c:redirect>
<c:redirect>标签将请求重新定向到另外一个页面,它有以下属性

属 性描 述是否必须缺省值
urlurl地址
context/后跟本地web应用程序的名字当前应用程序 


例子:

<c:redirect url="http://www.yourname.com/login.jsp"/>



将请求重新定向到[External Link]http://www.yourname.com/login.jsp页,相当于response.setRedirect("[External Link]http://www.yourname.com/login.jsp");

<c:param>
<c:param>标签用来传递参数给一个重定向或包含页面,它有以下属性

属 性描 述是否必须缺省值
name在request参数中设置的变量名
value在request参数中设置的变量值


例子:

<c:redirect url="login.jsp">
<c:param name="id" value="888"/>
</c:redirect>


将参数888以id为名字传递到login.jsp页面,相当于login.jsp?id=888


Hot! JSTL XML processing标签库 Hot!

在企业级应用越来越依赖XML的今天,XML格式的数据被作为信息交换的优先选择。XML processing标签库为程序设计者提供了基本的对XML格式文件的操作。在该标签库中的标签一共有10个,被分为了三类,分别是:
XML核心标签:<x:parse>、<x:out>、<x:set>。
XML流控制标签:<x:if>、<x:choose>、<x:when>、<x:otherwise>、<x:forEach>。
XML转换标签:<x:transform>、<x:param>。
由于该组标签库专注于对某一特定领域的实现,因此本书将只选择其中常见的一些标签和属性进行介绍。
1.  用于解析 XML 文件的 <x:parse> 标签
<x:parse>标签是该组标签库的核心,从其标签名就可以知道,它是作为解析XML文件而存在的。
<x:parse>标签属性和说明

属性描述 
doc源XML的内容,该属性的内容应该为String类型或者java.io.Reader的实例,可以用xml属性来替代,但是不被推荐
var将解析后的XML保存在该属性所指定的变量中,之后XML processing标签库中的其他标签若要取XML中的内容就可以从该变量中得到(可选)
scope变量的作用范围(可选) 
varDom指定保存的变量为org.w3c.dom.Document接口类型(可选) 
scopeDomorg.w3c.dom.Document的接口类型变量作用范围(可选) 
systemId定义一个URI,该URI将被使用到XML文件中以接入其他资源文件(可选) 
filter该属性必须为org.xml.sax.XMLFilter类的一个实例,可以使用EL表达式传入,将对XML文件做过滤得到自身需要的部分(可选) 


其中,var、scope和varDom、scopeDom不应该同时出现,而应该被视为两个版本来使用,二者的变量都可以被XML processing标签库的其他标签来使用。
<x:parse>标签单独使用的情况很少,一般会结合XML processing标签库中的其他标签来一起工作。下面看一个示例。
首先给出一个简单的XML文件,将对该XML文件做解析,该XML文件名为SampleXml?.xml。

<?xml version="1.0" encoding="UTF-8"?>
<xml-body>
   <name>RW</name>
   <passWord>123456</passWord>
   <age>28</age> 
   <books>
 <book>book1</book>
 <book>book2</book>
 <book>book3</book>
   </books>
</xml-body>


标签库的工作:

<c:import var="xmlFile" url="http://localhost:8080/booksamplejstl/SampleXml.xml"/>
<x:parse var="xmlFileValue" doc="${xmlFile}"/>





Hot! I18N formatting 标签库 Hot!

看到I18N就应该想到知识“国际化”,I18N formatting标签库就是用于在JSP页面中做国际化的动作。在该标签库中的标签一共有12个,被分为了两类,分别是:
   国际化核心标签:<fmt:setLocale>、<fmt:bundle>、<fmt:setBundle>、<fmt:message>、<fmt:param>、<fmt:requestEncoding>。
   格式化标签:<fmt:timeZone>、<fmt:setTimeZone>、<fmt:formatNumber>、<fmt:parseNumber>、<fmt:formatDate>、<fmt:parseDate>。
下面只选择其中常见的一些标签和属性进行介绍。

1  用于设置本地化环境的<fmt:setLocale>标签
<fmt:setLocale>标签用于设置Locale环境。
<fmt:setLocale>标签属性和说明

属性描述 
valueLocale环境的指定,可以是java.util.Locale或String类型的实例
scopeLocale环境变量的作用范围(可选)


下面看一个示例:

<fmt:setLocale value="zh_TW"/>


表示设置本地环境为繁体中文。

2  用于资源文件绑定的<fmt:bundle>、<fmt:setBundle>标签
这两组标签用于资源配置文件的绑定,唯一不同的是<fmt:bundle>标签将资源配置文件绑定于它标签体中的显示,<fmt:setBundle>标签则允许将资源配置文件保存为一个变量,在之后的工作可以根据该变量来进行。
根据Locale环境的不同将查找不同后缀的资源配置文件,这点在国际化的任何技术上都是一致的,通常来说,这两种标签单独使用是没有意义的,它们都会与I18N formatting标签库中的其他标签配合使用。
<fmt:bundle>、<fmt:setBundle>标签属性和说明

属性描述 
basename资源配置文件的指定,只需要指定文件名而无须扩展名,二组标签共有的属性
var<fmt:setBundle>独有的属性,用于保存资源配置文件为一个变量
scope变量的作用范围


下面看一个示例

<fmt:setLocale value="zh_CN"/>
<fmt:setBundle basename="applicationMessage" var="applicationBundle"/>


该示例将会查找一个名为applicationMessage_zh_CN.properties的资源配置文件,来作为显示的Resource绑定。

3  用于显示资源配置文件信息的<fmt:message>标签
用于信息显示的标签,将显示资源配置文件中定义的信息。
<fmt:message>标签属性和说明

属性描述 
key资源配置文件的“键”指定 
bundle若使用<fmt:setBundle>保存了资源配置文件,该属性就可以从保存的资源配置文件中进行查找
var将显示信息保存为一个变量
scope变量的作用范围


下面看一个示例:

<fmt:setBundle basename="applicationMessage" var="applicationBundle"/>
<fmt:bundle basename="applicationAllMessage">
   <fmt:message key="userName">
   <p>
   <fmt:message key="passWord" bundle="${applicationBundle}">
</fmt:bundle>


该示例使用了两种资源配置文件的绑定的做法,“ applicationMessage ”资源配置文件利用<fmt:setBundle>标签被赋于了变量“ applicationBundle ”,而作为<fmt:bundle>标签定义的“ applicationAllMessage ”资源配置文件作用于其标签体内的显示。
  第一个<fmt:message>标签将使用“ applicationAllMessage ”资源配置文件中“键”为“ userName ”的信息显示。
  第二个<fmt:message>标签虽然被定义在<fmt:bundle>标签体内,但是它使用了bundle属性,因此将指定之前由<fmt:setBundle>标签保存的“ applicationMessage ”资源配置文件,该“键”为“ passWord ”的信息显示。

4  用于参数传递的<fmt:param>标签
<fmt:param>标签应该位于<fmt:message>标签内,将为该消息标签提供参数值。它只有一个属性value。
<fmt:param>标签有两种使用版本,一种是直接将参数值写在value属性中,另一种是将参数值写在标签体内。

5  用于为请求设置字符编码的<fmt:requestEncoding>标签
<fmt:requestEncoding>标签用于为请求设置字符编码。它只有一个属性value,在该属性中可以定义字符编码。

6  用于设定时区的<fmt:timeZone>、<fmt:setTimeZone>标签
这两组标签都用于设定一个时区。唯一不同的是<fmt:timeZone>标签将使得在其标签体内的工作可以使用该时区设置,<fmt:setBundle>标签则允许将时区设置保存为一个变量,在之后的工作可以根据该变量来进行。
<fmt:timeZone>、<fmt:setTimeZone>标签属性和说明

属性描述 
value时区的设置
var<fmt:setTimeZone>独有的属性,用于保存时区为一个变量
scope变量的作用范围



7  用于格式化数字的<fmt:formatNumber>标签
<fmt: formatNumber > 标签用于格式化数字。
<fmt:formatNumber>标签属性和说明

属性描述
value格式化的数字,该数值可以是String类型或java.lang.Number类型的实例
type格式化的类型
pattern格式化模式
var结果保存变量
scope变量的作用范围
maxIntegerDigits指定格式化结果的最大值
minIntegerDigits指定格式化结果的最小值
maxFractionDigits指定格式化结果的最大值,带小数
minFractionDigits指定格式化结果的最小值,带小数


<fmt:formatNumber>标签实际是对应java.util.NumberFormat?类,type属性的可能值包括currency(货币)、number(数字)和percent(百分比)。
下面看一个示例。
<fmt:formatNumber value="1000.888" type="currency" var="money"/>
该结果将被保存在“ money ”变量中,将根据Locale环境显示当地的货币格式。

8  用于解析数字的<fmt:parseNumber>标签
<fmt:parseNumber>标签用于解析一个数字,并将结果作为java.lang.Number类的实例返回。<fmt:parseNumber>标签看起来和<fmt:formatNumber>标签的作用正好相反。
<fmt:parseNumber>标签属性和说明

属性描述
value将被解析的字符串 
type解析格式化的类型
pattern解析格式化模式
var结果保存变量,类型为java.lang.Number 
scope变量的作用范围
parseLocale以本地化的形式来解析字符串,该属性的内容应为String或java.util.Locale类型的实例


下面看一个示例。

<fmt:parseNumber value="15%" type="percent" var="num"/>


解析之后的结果为“ 0.15 ”。
9  用于格式化日期的<fmt:formatDate>标签
<fmt:formatDate>标签用于格式化日期。
<fmt:formatDate>标签属性和说明

属性描述 
value格式化的日期,该属性的内容应该是java.util.Date类型的实例
type格式化的类型
pattern格式化模式
var结果保存变量
scope变量的作用范围
timeZone指定格式化日期的时区


<fmt:formatDate>标签与<fmt:timeZone>、<fmt:setTimeZone>两组标签的关系密切。若没有指定 timeZone属性,也可以通过<fmt:timeZone>、<fmt:setTimeZone>两组标签设定的时区来格式化最后的结果。
10  用于解析日期的<fmt:parseDate>标签
<fmt:parseDate>标签用于解析一个日期,并将结果作为java.lang.Date类型的实例返回。<fmt:parseDate>标签看起来和<fmt:formatDate>标签的作用正好相反。
<fmt:parseDate>标签属性和说明

属性描述 
value将被解析的字符串
type解析格式化的类型
pattern解析格式化模式
var结果保存变量,类型为java.lang.Date
scope变量的作用范围
parseLocale以本地化的形式来解析字符串,该属性的内容为String或java.util.Locale类型的实例
timeZone指定解析格式化日期的时区


<fmt:parseNumber>和<fmt:parseDate>两组标签都实现解析字符串为一个具体对象实例的工作,因此,这两组解析标签对var属性的字符串参数要求非常严格。就JSP页面的表示层前段来说,处理这种解析本不属于份内之事,因此<fmt:parseNumber>和<fmt:parseDate>两组标签应该尽量少用,替代工作的地方应该在服务器端表示层的后段,比如在Servlet中。




Hot! Database access 标签库 Hot!

Database access 标签库中的标签用来提供在 JSP 页面中可以与数据库进行交互的功能,虽然它的存在对于早期纯 JSP 开发的应用以及小型的开发有着意义重大的贡献,但是对于 MVC 模型来说,它却是违反规范的。因为与数据库交互的工作本身就属于业务逻辑层的工作,所以不应该在 JSP 页面中出现,而是应该在模型层中进行。
对于 Database access 标签库本书不作重点介绍,只给出几个简单示例让读者略微了解它们的功能。
Database access 标签库有以下 6 组标签来进行工作: <sql:setDataSource> 、 <sql:query> 、 <sql:update> 、 <sql:transaction> 、 <sql:setDataSource> 、 <sql:param> 、 <sql:dateParam> 。
1 用于设置数据源的 <sql:setDataSource> 标签
<sql:setDataSource> 标签用于设置数据源,下面看一个示例:

<sql:setDataSource 
   var="dataSrc" 
   url="jdbc:postgresql://localhost:5432/myDB" 
   driver="org.postgresql.Driver" 
   user="admin" 
   password="1111"/>


该示例定义一个数据源并保存在“ dataSrc ”变量内。
2 用于查询的 <sql:query> 标签
<sql:query> 标签用于查询数据库,它标签体内可以是一句查询 SQL 。下面看一个示例:

<sql:query var="queryResults" dataSource="${dataSrc}"> 
   select * from table1 
</sql:query>


该示例将返回查询的结果到变量“ queryResults ”中,保存的结果是 javax.servlet.jsp.jstl.sql.Result 类型的实例。要取得结果集中的数据可以使用 <c:forEach> 循环来进行。下面看一个示例。

<c:forEach var="row" items="${queryResults.rows}"> 
   <tr> 
   <td>${row.userName}</td> 
 <td>${row.passWord}</td> 
   </tr> 
</c:forEach>


“ rows ”是 javax.servlet.jsp.jstl.sql.Result 实例的变量属性之一,用来表示数据库表中的“列”集合,循环时,通过“ ${row.XXX} ”表达式可以取得每一列的数据,“ XXX ”是表中的列名。
3 用于更新的 <sql:update> 标签
<sql:update> 标签用于更新数据库,它的标签体内可以是一句更新的 SQL 语句。其使用和 <sql:query> 标签没有什么不同。
4 用于事务处理的 <sql:transaction> 标签
<sql:transaction> 标签用于数据库的事务处理,在该标签体内可以使用 <sql:update> 标签和 <sql:query> 标签,而 <sql:transaction> 标签的事务管理将作用于它们之上。
<sql:transaction> 标签对于事务处理定义了 read_committed 、 read_uncommitted 、 repeatable_read 、 serializable4 个隔离级别。
5 用于事务处理的 <sql:param> 、 <sql:dateParam> 标签
这两个标签用于向 SQL 语句提供参数,就好像程序中预处理 SQL 的“ ? ”一样。 <sql:param> 标签传递除 java.util.Date 类型以外的所有相融参数, <sql:dateParam> 标签则指定必须传递 java.util.Date 类型的参数。


JSTL的优点
1、 在应用程序服务器之间提供了一致的接口,最大程序地提高了WEB应用在各应用服务器之间的移植。
2、 简化了JSP和WEB应用程序的开发。
3、 以一种统一的方式减少了JSP中的scriptlet代码数量,可以达到没有任何scriptlet代码的程序。在我们公司的项目中是不允许有任何的scriptlet代码出现在JSP中。
4、 允许JSP设计工具与WEB应用程序开发的进一步集成。相信不久就会有支持JSTL的IDE开发工具出现。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值