• 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)   

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

  • 相关阅读:
    JavaWeb网上商城项目中用户注册,使用MailServer和FoxMail搭建本地邮件服务器
    myeclipse编码问题
    Date日期类型的绑定
    springmvc学习之jdk版本,tomcat版本,spring版本
    mybatis-ehcache整合中出现的异常 ibatis处理器异常(executor.ExecutorException)解决方法
    .net里面<app.config>中value值不能填写特殊符号问题
    sqldeveloper中Excel数据的导入与导出
    IntelliJ IDEA 2019.2最新版本免费激活码(转)
    sqlserver 的一些小总结
    SQL 跨数据库同步数据 、跨数据库跨更新数据
  • 原文地址:https://www.cnblogs.com/cardiolith/p/9474115.html
Copyright © 2020-2023  润新知