JavaWeb学习——JSTL

JSTL


一、JSTL简介

    JSP标准标签库(JavaServer Pages Standard Tag Library, JSTL)是一个定制标签库的集合,用来解决像遍历Map或集合、条件测试、XML处理,甚至数据库访问和数据操作等常见问题。

    JSTL下载:https://pan.baidu.com/s/1az54R_a8GkG0mwHDIjHjNg  

    然后将lib下的两个jar文件:standard.jar和jstl.jar文件拷贝到/WEB-INF/lib/下。

二、JSTL库

    JSTL 1.2 中的标签可以分为5类区域,如下表:

区域 子函数 URI 前缀
核心        变量支持   http://java.sun.com/jsp/jstl/core   c
流控制
URL管理
其他
XML 核心   http://java.sun.com/jsp/jstl/xml x
流控制
转换
国际化 语言区域   http://java.sun.com/jsp/jstl/fmt   fmt   
消息格式化
数字和日期格式化   
数据库 SQL   http://java.sun.com/jsp/jstl/sql sql
函数 集合长度   http://java.sun.com/jsp/jstl/functions   fn
字符换操作

    在JSP页面使用JSTL库,必须通过以下格式使用taglib指令:

    <%@ taglib uri="uri" prefix="prefix" %>

    例如,要使用Core库,必须在JSP页面的开头处做以下声明:

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

三、一般行为

    下面介绍Core库中用来操作有界变量的三个一般行为:out、set、remove。

    注意:在标签的语法中,[ ]表示可选的属性。如果值带下划线,则表示为默认值。

    1. out标签

    out标签在运算表达式时,是将结果输出到当前的JSPWriter。out语法有两种,即有body content和没有body content:

<c:out value="value"  [escapeXml="{true|false}"]  [default="defaultValue"] />

<c:out value="value"  [escapeXml="{true|false}"]  [default="defaultValue"] >
    body content
</c:out>
属性 类型 描述
value 对象 要计算的表达式
escapeXml    布尔  表示结果中的字符<、>、&、’和”将被转换成相应的实体码   
default 对象    默认值

    例如,在下面的out标签中,如果在HttpSession中没有找到myVar变量,就会显示应用程序范围的变量myVar值。如果没有找到,则输出一个空字符串。

<c:out value="${sessionScope.myVar }" default="${applicationScope.myVar }" />

    2. set标签

    利用set标签,可以完成以下工作:

    (1)创建一个字符串和一个引用该字符串的有界变量。

    (2)创建一个引用现存有界对象的有界变量。

    (3)设置有界对象的属性。

    set标签的语法有四种形式:

//第一种创建有界变量,并用value属性在其中定义一个要创建的字符串或者现有对象
<c:set value="value" var="varName" [scope="{page|request|session|application}"] />

//第二种与第一种相似,只是赋值在body content中完成
<c:set var="varName" [scope="{page|request|session|application}"] />
    body content
</c:set>

//第三种是设置有界对象的属性值。
<c:set target="target" property="propertyName" value="value" />
//例:将字符串Tokyo赋予有界对象address的city属性
<c:set target="${address}" property="city" value="Tokyo" />
//注:必须在target中用EL表达式来引用这个有界对象

//第四种与第三种相似,只是赋值在body content中完成
<c:set target="target" property="propertyName" >
    body content
</c:set>
//例:将字符串Beijing赋予有界对象address的city属性
<c:set target="${address}" property="city">Beijing</c:set>

    3. remove标签

    remove标签用于删除有界变量,语法如下:

<c:remove var="varName" [scope="{page|request|session|application}"] />

    注意,有界变量引用的对象不能删除。

四、条件行为

    条件行为用于处理页面输出取决于特定输出值的情况,这在Java中是利用if、if...else和switch声明解决的。

    JSTL中执行条件行为的有4个标签,即if、choose、when和otherwise标签。

    1. if 标签

    if 标签是对一个条件进行测试,如果结果为TRUE,则处理它的body content。测试结果保存在Boolean对象中,并创建有界变量来引用这个Boolean对象。

    if 的语法有两种:

//没有body content
<c:if test="testCondition" var="varName" [scope="{page|request|session|application}"] />

//有body content
<c:if test="testCondition" [var="varName"]  [scope="{page|request|session|application"] >
    body content
</c:if>

    例如,下面测试user和password参数值是否分别为ken和blackcomb,并将结果保存在页面范围的变量loggedIn中。

<c:if var="loggedIn" test="${param.user=='ken'&&param.password=='blackcomb'}" />

${(loggedIn) ? "You logged in successfully" : "Login failed" }

    2. choose、when和otherwise标签

    choose和when标签的作用与Java中的switch和case类似。choose标签中必须嵌有一个或多个when标签,并且每个when标签都表示一种可以计算和处理的情况。otherwise标签用于默认的条件块,假如没有任何一个when标签测试条件结果为TRUE,它就会得到处理。

    choose和otherwise标签没有属性。when标签必须带有定义测试条件的test属性。

<c:choose>
    <c:when test="${param.status=='full'}">
        You are a full member
    </c:when>
    <c:when test="${param.status=='student'}">
        You are a student member
    </c:when>
    <c:otherwise>
        Please register
    </c:otherwise>
</c:choose>

五、遍历行为

    当需要无数次地遍历一个对象集合时,遍历行为就是十分重要。JSTL提供了 forEach 和 forTokens 两个执行遍历行为的标签。

    1. forEach 标签

    forEach 可以遍历的对象包括java.util.Collection 和 java.util.Map 的所有实现,以及对象数组或者主类型。也可以遍历java.util.Iterator 和 java.util.Enumration,但不应该在多个行为中使用Iterator 或者 Enumeration,因为无法重置Iterator 和 Enumeration。

    forEach 标签的语法有两种形式。

//第一种形式是固定次数地重复body content
<c:forEach [var="varName"] begin="begin" end="end" step="step">
    body content
</c:forEach>

//第二种形式用于遍历对象集合
<c:forEach items="collection"  [var="varName"] [varStatus="varStatusName"]  [begin="begin"]  [end="end"]  [step="step"]>
    body content
</c:forEach>

    forEach 标签的属性如下表:

属性 类型 描述            
var  字符串      引用遍历的当前项目的有界变量名称    
items    支持的任意类型     遍历的对象集合
varStatus    字符串 保存遍历状态的有界变量名称。类型值为javax.servlet.jsp.jstl.core.LoopTagStatus   
begin 整数

如果指定items,遍历将从指定索引处的项目开始,例如,集合中第一个项目的索引为0。

如果没有指定items,遍历将从设定的索引值开始。如果指定,begin的值必须大于或者等于0

end  整数

如果指定items,遍历将在(含)指定索引处的项目结束。

如果没有指定items,遍历将在索引到达指定值时结束。

step 整数

遍历将只处理间隔指定step的项目,从第一个项目开始。在这种情况下,step的值必须大于或者等于1

    forEach 标签有一个类型为javax.servlet.jsp.jstl.core.LoopTagStatus 的变量 varStatus。LoopTagStatus 接口带有count属性,它返回当前遍历的“次数”。

    2. forTokens 标签

    forTokens 标签用于遍历以特定分隔符隔开的令牌,其语法如下:

<c:forTokens items="stringOfTokens" delims="delimiters" [var="varName"]  [varStatus="varStatusName"]  [begin="begin"]  [end="end"]  [step="step"]>
    body content
</c:forTokens>
属性 类型 描述
var 字符串 引用遍历的当前项目的有界变量名称   
items 支持的任意类型     要遍历的tokens字符串
varStatus      字符串 保存遍历状态的有界变量名称。类型值为javax.servlet.jsp.jstl.core.LoopTagStatus  
begin 整数 遍历的起始索引,此处索引是从0开始的。如有指定,begin的值必须大于等于0
end 整数 遍历的终止索引,此处索引是从0开始的
step 整数 遍历将只处理间隔指定step的token,从第一个token开始。如有指定,step的值必须大于等于1    
delims 字符串 一组分隔符

六、格式化行为

    1. formatNumber 标签

     用于格式化数字。

<fmt: formatNumber value="numericValue" />

    2. formatDate标签

    用于格式化日期。

<fmt: formatDate value="date" />

    3. timeZone标签

    用于定义时区,使其body content中的时间信息按指定时区进行格式化。

<fmt: timeZone value="timeZone">
    body content
</fmt: timeZone>

    4. setTimeZone标签

    用于将指定时区保存在一个有界变量或者时间配置变量中。

<fmt: setTimeZone value="timeZne" />

    5. parseNumber标签

    用于将字符串表示的数字、货币或者百分比解析成数字。

//第一种
<fmt: parseNumber value="numericValue" />

//第二种
<fmt: parseNumber>
    numeric value to parsed
</fmt: parseNumber>

    6. parseDate标签

    以区分地域的格式解析以字符串表示的日期和时间。

//第一种
<fmt: parseDate value="dateString" />

//第二种
<fmt: parseDate>
    date value to be parsed
</fmt: parseDate>

    注:具体的可选属性请上网查阅。

七、函数

    JSTL还定义了一套可以在EL表达式中使用的标准函数,这些函数都集中在function标签库中。

    指令:

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

    调用:

    ${ fn: functionName }

函数 描述 语法 范例
contains    测试一个字符串中是否包含指定子字符串     contains(string, substring)    ${fn:contains("Marry Steven", "Steven")}
containsIngoreCase  与contains相似,但是区分大小写  containsIngoreCase(string, substring)  ${fn:containsIgnoreCase("Marry","MARRY")} 
endsWith  测试一个字符串是否以指定的后缀结尾  endsWith(string, suffix)  ${fn:endsWith("HelloWorld","World")} 
escapeXml 用于给String编码  escapeXml(string)  ${fn:escapeXml("Use <br/> to change lines")} 
indexOf 返回子字符串在某个字符串第一次出现时的索引    indexOf(string, substring)  ${fn:indexOf("carry on","on")} 
join

将一个String数组中的所有元素合并成一个字符串,

并用指定分隔符分开 

join(array,separator)  ${fn:join(myArray,",")} 
length  用于返回集合中的项目数,或者字符串的字符数  length(input)  ${fn:length("HelloWorld")}
replace  将字符串中出现的所有beforeString用afterString替换  replace(string,beforeSubString,afterSubString)   ${fn:replace("HelloWorld","o","e")}  
split  用于将一个字符串分离成一个子字符串数组  split(string, seperater) ${fn:split("my,world")} 
startsWith  测试一个字符串是否以指定前缀开头  startsWith(string, prefix)  ${fn:startsWith("hello","h")} 
substring 截取指定索引开始的子字符串  substring(string,beginIndex,endIndex)  ${fn:substring("Steven",0,3)}
substringAfter  返回指定子字符串第一次出现后的字符串部分  substringAfter(string, substring)  ${fn:substringAfter("Steven","ev")} 
substringBefore  返回指定子字符串第一次穿线前的字符串部分  substringBefore(string, substring)  ${fn:substringBefore("Steven","ev")} 
toLowerCase  将一个字符串转换成它的小写版本  toLowerCase(string)   
toUpperCase  将一个字符串转换成大写版本  toUpperCase(string)   
trim  删除一个字符串开头和结尾的空白  trim(string)   

--- 天若有情天亦老,人间正道是沧桑 ---

猜你喜欢

转载自www.cnblogs.com/cardiolith/p/9474115.html