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的各个标签库进行简单的介绍:

  1. 核心标签库中包含了实现WEB应用中的通用操作的标签。例如,用于输出一个变量内容的<c:out>标签、用于条件判断的<c:if>标签、用于迭代循环的<c:forEach>标签。
  2. 国际化/格式化标签库中包含实现WEB应用程序的国际化的标签。例如,设置JSP页面的本地信息、设置JSP页面的时区、绑定资源文件,使本地敏感的数据(例如数值、日期等)按照JSP页面中设置的本地格式显示。
  3. 数据库标签库中包含用于访问数据库和对数据库中的数据进行操作的标签。例如,从数据源中获得数据库连接、从数据库表中检索数据等。由于在软件分层的开发模型中,JSP页面仅用作表现层,我们一般不在JSP页面中直接操作数据库,而是在业务逻辑层或数据访问层操作数据库,所以,JSTL中提供的这套数据库标签库没有多大的实用价值。
  4. XML标签库中包含对XML文档中的数据进行操作的标签。例如,解析XML文档、输出XML文档中的内容,以及迭代处理XML文档中的元素。因为XML广泛应用于WEB开发,对XML文档的处理非常重要,XML标签库使处理XML文档变得简单方便,这也是JSTL的一个重要特征。
  5. 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中
语法:

  1. 将value的值储存至范围为scope的varName变量之中:
    <c:set value=”value” var=”varName” [scope=”{page|request|session|application}”]/>
  2. 将主体内容的数据储存至范围为scope的varName变量之中:
    <c:set var=”varName” [scope=”{page|request|session|application}”]>主体内容</c:set>
  3. 将value的值储存至target对象的属性中:
    <c:set value=”value” target=”目标对象” property=”目标对象的属性”/>
  4. 将主体内容的数据储存至target对象的属性中:
    <c:set target=”目标对象” property=”目标对象的属性”>主体内容</c:set>
  5. 将value的绑定在Map的指定key中
    <c:set var="map" value="<%=new HashMap()%>"></c:set>
    <c:set property="key" value="value" target="${map}"></c:set>
  6. 讲主体内容的数据绑定在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和错误处理:

  1. 语法3和语法4会产生异常错误,有以下2种情况:
  • target为null;
  • target不是java.util.Map或JavaBean对象
  1. 假若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>
在没有使用 &lt;c:remove&gt; 标签之前,变量的值为:<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 />
在使用 &lt;c:remove&gt; 标签之后,变量的值为:<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语句一样
语法:

  1. 没有本体内容
    <c:if test=”testCondition” var=”varName” [scope=”{page|request|session|application}”]/>
  2. 有本体内容
    <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>的本体内容
语法:

  1. 迭代一个集合中的所有成员
    <c:forEach [var=”varName”] items=”collection” [varStatus=”varStatusName”] [begin=”begin”] [end=”end”] [step=”step”]>
    本体内容
    </c:forEach>
  2. 迭代指定的次数
    <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属性的值,不执行迭代操作
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,014评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,796评论 3 386
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,484评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,830评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,946评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,114评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,182评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,927评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,369评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,678评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,832评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,533评论 4 335
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,166评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,885评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,128评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,659评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,738评论 2 351

推荐阅读更多精彩内容