JSTL
一. 介绍
- JSTL(Java Server Pages Standarded Tag Library):JSP 标准标签库
- 主要提供给开发人员一个标准通用的标签库
- 开发人员可以利用这些标签取代 JSP 页面上的 Java 代码,从而提高程序的可读性,降低程序的维护难度
它由下面五个部分组成:
组成 | 作用 | 标签库URL | 说明 |
---|---|---|---|
Core | 核心标签库 | http://java.sun.com/jsp/jstl/core | 通用逻辑处理 |
Fmt | 国际化有关 | http://java.sun.com/jsp/jstl/fmt | 需要不同地域显示不同语言时使用 |
Functions | EL函数 | http://java.sun.com/jsp/jstl/functions | EL表达式可以使用的方法 |
SQL | 操作数据库 | http://java.sun.com/jsp/jstl/sql | 了解 |
XML | 操作XML | http://java.sun.com/jsp/jstl/xml | 了解 |
下面对JSTL的各个标签库进行简单的介绍:
- 核心标签库中包含了实现WEB应用中的通用操作的标签。例如,用于输出一个变量内容的<c:out>标签、用于条件判断的<c:if>标签、用于迭代循环的<c:forEach>标签。
- 国际化/格式化标签库中包含实现WEB应用程序的国际化的标签。例如,设置JSP页面的本地信息、设置JSP页面的时区、绑定资源文件,使本地敏感的数据(例如数值、日期等)按照JSP页面中设置的本地格式显示。
- 数据库标签库中包含用于访问数据库和对数据库中的数据进行操作的标签。例如,从数据源中获得数据库连接、从数据库表中检索数据等。由于在软件分层的开发模型中,JSP页面仅用作表现层,我们一般不在JSP页面中直接操作数据库,而是在业务逻辑层或数据访问层操作数据库,所以,JSTL中提供的这套数据库标签库没有多大的实用价值。
- XML标签库中包含对XML文档中的数据进行操作的标签。例如,解析XML文档、输出XML文档中的内容,以及迭代处理XML文档中的元素。因为XML广泛应用于WEB开发,对XML文档的处理非常重要,XML标签库使处理XML文档变得简单方便,这也是JSTL的一个重要特征。
- JSTL中提供的一套EL自定义函数包含了JSP页面制作者经常要用到的字符串操作。例如,提取字符串中的子字符串、获取字符串的长度和处理字符串中的空格等。
二. 核心标签库
基本输入输出、流程控制、迭代操作和URL操作,各标签如下表
功能分类 | 标签名称 |
---|---|
表达式操作 | out、set 、remove、 catch |
流程控制 | if、choose、when、otherwise |
迭代操作 | forEach、forTokens |
URL操作 | import param、url param、redirect param |
在JSP中使用JSTL的核心标签库时,必须使用指令<%@ taglib%>,并且设定prefix和uri的值,通常设定如下:
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
2.1 表达式操作
<c: out>标签
作用:主要用来显示数据内容,就像使用<%=scripting-language%>一样
语法:
- 没有主体内容:<c:out value=”value” [escapeXml=”{true|false}”][default=”defalutValue”]/>
- 有主体内容:<c:out value=”value” [escapeXml=”{true|false}”]>default value</c:out>
属性:
属性名 | 是否支持EL | 属性类型 | 属 性 描 述 |
---|---|---|---|
value | true | Object | 指定要输出的内容 |
escapeXml | true | Boolean | 指定是否将>、<、&、'、" 等特殊字符进行HTML编码转换后再进行输出。默认值为true |
default | true | Object | 指定如果value属性的值为null时所输出的默认值 |
Null和错误处理:
假若value为null,会显示default的值;假如没有设定default的值,则会显示一个空字符串
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ page contentType="text/html;charset=gb2312" %>
<%
session.setAttribute("test_session", "testValue_session");
%>
直接输出一个字符串:
<c:out value="test" default="123456" /><br /><hr />
输出Web域中不存在的属性的值:<br />
<c:out value="${test_request}" default="这个属性不存在"/><br /><hr />
输出Web域中的test_session属性的值:<br />
<c:out value="${test_session}" />
<c: set>标签
作用:主要用来将变量储存至JSP范围中、JavaBean的属性或是Map的key和value中
语法:
- 将value的值储存至范围为scope的varName变量之中:
<c:set value=”value” var=”varName” [scope=”{page|request|session|application}”]/> - 将主体内容的数据储存至范围为scope的varName变量之中:
<c:set var=”varName” [scope=”{page|request|session|application}”]>主体内容</c:set> - 将value的值储存至target对象的属性中:
<c:set value=”value” target=”目标对象” property=”目标对象的属性”/> - 将主体内容的数据储存至target对象的属性中:
<c:set target=”目标对象” property=”目标对象的属性”>主体内容</c:set> - 将value的绑定在Map的指定key中
<c:set var="map" value="<%=new HashMap()%>"></c:set>
<c:set property="key" value="value" target="${map}"></c:set> - 讲主体内容的数据绑定在Map的指定key中
<c:set var="map" value="<%=new HashMap()%>"></c:set>
<c:set property="key" target="${map}">主体内容</c:set>
属性:
属性名 | 是否支持EL | 属性类型 | 属 性 描 述 |
---|---|---|---|
value | true | Object | 用于指定属性值 |
var | false | String | 用于指定要设置的Web域属性的名称 |
scope | false | String | 用于指定属性所在的Web域 |
target | true | Object | 用于指定要设置属性的对象,这个对象必须是JavaBean对象或java.util.Map对象 |
property | true | string | 用于指定当前要为对象设置的属性名称 |
Null和错误处理:
- 语法3和语法4会产生异常错误,有以下2种情况:
- target为null;
- target不是java.util.Map或JavaBean对象
- 假若value为null时:将由储存变量改为移除变量
- 语法1:由var和scope所定义的变量将被移除:
若scope已经制定时,则PageContext.removeAttribute(varName,scope)
若scope未指定时,则PageContext.removerAttribute(varName) - 语法3:
假若target为Map时,则Map.remover(property)
假若target为JavaBean时,property指定的属性为null
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ page contentType="text/html;charset=gb2312" %>
<%@ page import="java.util.HashMap" %>
<jsp:useBean id="user" class="org.it315.UserBean" />
<%
HashMap preferences = new HashMap();
session.setAttribute("preferences",preferences);
%>
设置和输出UserBean对象的userName属性值:
<c:set value="zxx" target="${user}" property="userName" />
<c:out value="${user.userName}" /><br /><hr />
设置和输出UserBean对象的password属性值:
<c:set target="${user}" property="password" />
<c:out value="${user.password}" /><br /><hr />
设置和输出Map对象的color关键字的值:
<c:set target="${preferences}" property="color" value="${param.color}" />
<c:out value="${preferences.color}" />
<c: remove>标签
作用:主要作用移除变量
语法:
<c:remover var=”varName” [scope=”{page|request|session|application}”]/>
属性:
名称 | 说明 | 支持EL | 返回类型 | 必须 | 默认值 |
---|---|---|---|---|---|
var | 欲移除的变量名称 | N | String | 是 | 无 |
scope | var变量的JSP范围 | N | String | 否 | page |
注意:如果scope不指定范围,将会删除所有范围的(page、request、session、application)中名称为varName的变量
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ page contentType="text/html;charset=gb2312" %>
<c:set value="org.it315" var="company" scope="request" />
<c:set var="passWord" scope="session">
a123456a
</c:set>
在没有使用 <c:remove> 标签之前,变量的值为:<br />
company:<c:out value="${company}" /><br />
passWord:<c:out value="${passWord}" /><br />
<c:remove var="company" scope="request" />
<!--c:set var="company" scope="request" 此行与黑体字的一行作用是一样的/-->
<c:remove var="passWord" scope="session" /><hr />
在使用 <c:remove> 标签之后,变量的值为:<br />
company:<c:out value="${company}" /><br />
passWord:<c:out value="${passWord}" />
<c: catch>标签
作用:只要用来处理产生错误的异常情况,并且将错误信息存储起来
语法:
<c:catch [var=”varName”]>
…欲抓取错误的部分
</c:catch>
说明:
将可能产生错误的代码放到<c:catch></c:catch>之间。如果真的发生错误则会将信息存储在var变量之中,当错误发生在<c:catch></c:catch>之间时,则只有<c:catch></c:catch>之间的程序会被终止忽略,但整个网页不会被终止
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ page contentType="text/html;charset=gb2312" %>
<c:catch var="myex">
<%
int i = 0;
int j = 10;
out.println(j + "/" + i + "=" + j/i);
%>
</c:catch>
异常:<c:out value="${myex}" /><br />
异常 myex.getMessage:<c:out value="${myex.message}" /><br />
异常 myex.getCause:<c:out value="${myex.cause}" /><br />
异常 myex.getStackTrace:<c:out value="${myex.stackTrace}" />
2.2 流程控制
<c: if>标签
作用:就如同我们在一般程序中使用if语句一样
语法:
- 没有本体内容
<c:if test=”testCondition” var=”varName” [scope=”{page|request|session|application}”]/> - 有本体内容
<c:if test=”testCondition” [var=”varName”] [scope=”{page|request|session|application}”]>
本体内容
</c:if>
属性:
属性名 | 是否支持EL | 属性类型 | 属 性 描 述 |
---|---|---|---|
test | true | boolean | 决定是否处理标签体中的内容的条件表达式 |
var | false | String | 用于指定将test属性的执行结果保存到某个Web域中的某个属性的名称 |
scope | false | String | 指定将test属性的执行结果保存到哪个Web域中 |
<c: choose>标签
作用:此标签本身只当作<c:when>和<c:otherwise>的父标签
语法:
<c:choose>
<c:when>和<c:otherwise>
</c:choose>
限制:
- <c:choose>的本体内容只能有:空白;
- 1或多个<c:when>;
- 0或1个<c:otherwise>;
<c: when>标签
作用:就跟我们在一般程序中使用的when一样
语法:
<c:when test=”testCondition”>
本体内容
</c:when>
限制:
- <c:when>必须在<c:choose>和</c:choose>之间
- 在同一个<c:choose>中时,<c:when>必须在<c:otherwise>之前
注意:在同一个<c:choose>中,如果多个<c:when>条件都成立,则只显会显示一个
<c: otherwise>标签
作用:在同一个<c:choose>中,当所有的<c:when>的条件都没有成立时,则执行<c:otherwise>中的本体内容
语法:
<c:otherwise>
本体内容
</c:otherwise>
2.3 迭代操作
<c: forEach>标签
作用:为循环控制,它可以将集合(Collection)中的成员循环浏览一遍。运作方式为当条件符合时,就会持续重复执行<c:forEach>的本体内容
语法:
- 迭代一个集合中的所有成员
<c:forEach [var=”varName”] items=”collection” [varStatus=”varStatusName”] [begin=”begin”] [end=”end”] [step=”step”]>
本体内容
</c:forEach> - 迭代指定的次数
<c:forEach [var=”varName”] [varStatus=”varStatusName”] begin=”begin” end=”end” [step=”step”]>
本体内容
</c:forEach>
属性:
属性名 | 是否支持EL | 属性类型 | 属 性 描 述 |
---|---|---|---|
var | false | String | 指定将当前迭代到的元素保存到page这个Web域中的属性名称 |
items | true | 任何支持的类型 | 将要迭代的集合对象 |
varStatus | false | String | 指定将代表当前迭代状态信息的对象保存到page这个Web域中的属性名称 |
begin | true | int | 如果指定items属性,就从集合中的第begin个元素开始进行迭代,begin的索引值从0开始编号;如果没有指定items属性,就从begin指定的值开始迭代,直到end值时结束迭代 |
end | true | int | 参看begin属性的描述 |
step | true | int | 指定迭代的步长,即迭代因子的迭代增量 |
在使用<c:forEach>标签时,需要注意如下几点说明:
- 如果指定begin属性,其值必须大于或等于零;
- 如果指定步长(step属性),其值必须大于或等于1;
- 如果items属性的值为null,则要处理的集合对象为空,这时不执行迭代操作;
- 如果指定的begin属性的值大于或等于集合对象的长度,不执行迭代操作;
- 如果指定的end属性的值小于begin属性的值,不执行迭代操作;
<c:forEach>标签的items属性的值支持下面的数据类型:
- 任意类型的数组
- java.util.Collection
- java.util.Iterator
- java.util.Enumeration
- java.util.Map
- String
varStatus变量说明:它有以下属性:
属性 | 类型 | 意义 |
---|---|---|
index | number | 当前成员的索引号 |
count | number | 总共已经指到的成员数量 |
first | boolean | 当前成员是不是第一个成员 |
last | boolean | 当前成员是不是最后一个成员 |
<c: forTokens>标签
作用:用来浏览一字符串中所有的成员,其成员是由定义符号(delimiters)所分隔的
语法:
<c:forTokens items=”stringOfTokens” delims=”delimiters” [var=”varName”] [varStatus=”varStatusName”] [begin=”begin”] [end=”end”] [step=”step”]>
本体内容
</c:forTokens>
属性:
属性名 | 是否支持EL | 属性类型 | 属 性 描 述 |
---|---|---|---|
var | false | String | 指定将当前迭代出的子字符串保存到page这个Web域中的属性名称 |
items | true | String | 将要迭代的字符串 |
delims | true | String | 指定一个或多个分隔符 |
varStatus | false | String | 指定将代表当前迭代状态信息的对象保存到page这个Web域中的属性名称,代表当前迭代的状态信息的对象的类型为javax.servlet.jsp.jstl.core.LoopTagStatus,从JSTL规范中可以查看这个类的详细信息 |
begin | true | int | 指定从第begin个子字符串开始进行迭代,begin的索引值从0开始编号 |
end | true | int | 指定迭代到第begin个子字符串,begin的索引值从0开始编号 |
step | true | int | 指定迭代的步长,即每次迭代后的迭代因子增量 |
在使用<c:forTokens>标签时,需要注意如下几点说明:
- 如果指定begin属性,其值必须大于或等于零。
- 如果指定步长(step属性),其值必须大于或等于1。
如果指定的end属性的值小于begin属性的值,不执行迭代操作