zoukankan      html  css  js  c++  java
  • ⑤早起的鸟儿有虫吃-JSTL核心标签库[收藏]

    介绍

      JSTL 全名为Java Server Pages Standard Tag LibraryJSP Standard Tag Library,它的中文名称为JSP 标准标签函数库。 Web 程序开发人员能够利用JSTLEL来开发Web 程序,取代传统直接在页面上嵌入Java程序(Scripting)的做法,以提高程序可读性、维护性和方便性。 JSTL是一个标准的已制定好的标签库,可以应用于各种领域,如:基本输入输出、流程控制、循环、XML文件剖析、数据库查询及国际化和文字格式标准化的应用等。JSTL所提供的标签函数库主要分为五大类:

          (1)核心标签库 (Core tag library)

          (2I18N 格式标签库 (I18N-capable formatting tag library)

          (3SQL 标签库 (SQL tag library)

          (4XML 标签库 (XML tag library)

          (5)函数标签库 (Functions tag library)

    JSTL

    前缀

    URI

    核心标签库

    c

    http://java.sun.com/jsp/jstl/core

    I18N格式标签库

    fmt

    http://java.sun.com/jsp/jstl/xml

    SQL标签库

    sql

    http://java.sun.com/jsp/jstl/sql

    XML标签库

    xml

    http://java.sun.com/jsp/jstl/fmt

    函数标签库

    fn

    http://java.sun.com/jsp/jstl/functions

     预备:

       若要在JSP 网页中使用JSTL ,一定要先做下面这行声明:

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

     

    核心标签库 (Core tag library)

    Core 标签库,又被称为核心标签库,该标签库的工作是对于 JSP 页面一般处理的封装。在该标签库中的标签一共有 14 个,被分为了四类,分别是:

    q         通用核心标签: <c:out>  <c:set>  <c:remove>  <c:catch> 

    q         条件控制标签: <c:if>  <c:choose>  <c:when>  <c:otherwise> 

    q         循环控制标签: <c:forEach>  <c:forTokens> 

    q         URL 相关标签: <c:import>  <c:url>  <c:redirect>  <c:param> 

    <c:out>

    <c:out>主要用来显示数据的内容,就像是 <%= scripting-language %> 一样,例如:Hello ! <c:out value="${username}" />

    语法

    语法1:没有本体(body)内容

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

    语法2:有本体内容

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

    default value

    </c:out>

    属性名称

    说明

    EL

    类型

    必须

    默认值

    value

    需要显示出来的值

    Y

    Object

    default

    如果value的值为null则显示default的值

    Y

    Object

    escapeXml

    是否转换特殊字符,如:<转换成&lt;

    Y

    boolean

    true

     

    注意

    表格中的EL字段,表示此属性的值是否可以为EL 表达式,例如:Y表示 attribute = "${表达式}"为符合语法的,则反之。

     

    Null 和错误处理

    · 假若 valuenull,会显示default 的值;假若没有设定default的值,则会显示一个空

    的字符串。

    说明

    一般来说,<c:out>默认会将 <>、’、” 和 转换为 &lt;&gt;&#039;&#034; 和 &amp;

    假若不想转换时,只需要设定<c:out>escapeXml 属性为fasle 就可以了。

    范例

    <c:out value="Hello JSP 2.0 !! " />

    <c:out value="${ 3 + 5 }" />

    <c:out value="${ param.data }" default="No Data" />

    <c:out value="<p>有特殊字符</p>" />

    <c:out value="<p>有特殊字符</p>" escapeXml="false" />

    1.在网页上显示 Hello JSP 2.0 !! 

    2.在网页上显示 8

    3.在网页上显示由窗体传送过来的data 参数之值,假若没有data 参数,或data 参数的值为null 时,则网页上会显示No Data

    4.在网页上显示“<p>有特殊字符</p>”;

    5.在网页上显示“有特殊字符”。

     

    <c:set>

    <c:set>主要用来将变量储存至JSP范围中或是JavaBean的属性中。

    语法

    语法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="target" property="propertyName" />

    语法4

    将本体内容的数据储存至 target 对象的属性中

    <c:set target="target" property="propertyName">

    … 本体内容

    </c:set>

    属性

    名称

    说明

    EL

    类型

    必须

    默认值

    value

    要被储存的值

    Y

    Object

    var

    欲存入的变量名称

    N

    String

    scopevar

    变量的JSP范围

    N

    String

    page

    target

    为一JavaBeanjava.util.Map对象

    Y

    Object

    property

    指定target对象的属性

    Y

    String

    范例

    <c:set var="number" scope="request" value="${1 + 1}" />

    <c:set var="number" scope="session" />

    ${3 + 5}

    </c:set>

    <c:set var="number" scope="request" value="${ param.number }" />

    <c:set target="User" property="name" value="${ param.Username}" />

    1.将存入Request 范围的number 变量中;

    2.将存入Session 范围的number 变量中;<c:set>是把本体(body)运算后的结果来当做value的值。

    3.假若 ${param.number}null 时,则移除Request 范围的number 变量;若${param.number}不为null 时,则将 ${param.number}的值存入Request 范围的number 变量中;

    4.假若 ${param.Username}null 时,则设定User(JavaBean)name 属性为null;若不为

    null 时,则将 ${param.Username}的值存入User(JavaBean)name 属性(setter 机制)

    注意

    上述范例的3.中,假若 ${param.number}null时,则表示移除Request范围的number变量。

     

    <c:remove>

    <c:remove>主要用来移除变量。

    语法

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

    属性

    名称

    说明

    EL

    类型

    必须

    默认值

    var

    欲移除的变量名称

    N

    String

    scope

    var变量的JSP范围

    N

    String

    page

    说明

    <c:remove>必须要有var 属性,即要被移除的属性名称,scope 则可有可无,例如:

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

    number 变量从Session 范围中移除。若我们不设定scope,则<c:remove>将会从Page

    RequestSession Application 中顺序寻找是否存在名称为number 的数据,若能找到时,则将它移除掉,反之则不会做任何的事情。

    注意:当不指定scope时,回remove掉从page到application的var指定的变量

     

    <c:catch>

    <c:catch>主要用来处理产生错误的异常状况,并且将错误信息储存起来。

    语法

    <c:catch [var="varName"] >

    … 欲抓取错误的部分

    </c:catch>

    属性

    名称

    说明

    EL

    类型

    必须

    默认值

    var

    用来储存错误信息的变量

    N

    String

    说明

    <c:catch>主要将可能发生错误的部分放在<c:catch></c:catch>之间。如果真的发生错

    误,可以将错误信息储存至varName 变量中,例如:

    <c:catch var="message">

    : //可能发生错误的部分

    </c:catch>

    另外,当错误发生在<c:catch></c:catch>之间时,则只有<c:catch></c:catch>之间的程序

    会被中止忽略,但整个网页不会被中止。 

     

    <c:if>

    <c:if>的用途就和我们一般在程序中用的if 一样。

    语法

    语法1:没有本体内容(body)

    <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,则执行本体内容,false则相反

    Y

    boolean

    var

    用来储存test运算后的结果,即truefalse

    N

    String

    scope

    var变量的JSP范围

    N

    String

    page

    <c:choose>

    <c:choose>本身只当做 <c:when> 和 <c:otherwise> 的父标签。

    语法

    <c:choose>

    本体内容( <when> 和 <otherwise> )

    </c:choose>

    限制

    <c:choose>的本体内容只能有:

    ·空白

    ·或多个 <c:when>

    ·或多个 <c:otherwise>

    说明

    若使用<c:when><c:otherwise>来做流程控制时,两者都必须为<c:choose>的子标签.

     

    <c:when>

    <c:when>的用途就和我们一般在程序中用的when 一样。

    语法

    <c:when test="testCondition" >

    本体内容

    </c:when>

    属性

    名称

    说明

    EL

    类型

    必须

    默认值

    Test

    如果表达式的结果为true,则执行本体内容,false则相反

    Y

    boolean

     

    限制

    ☆ <c:when>必须在<c:choose></c:choose>之间

    ☆ 在同一个<c:choose>中时,<c:when>必须在<c:otherwise>之前

    说明

    <c:when>必须有test 属性,当test中的表达式结果为true时,则会执行本体内容;如果为

    false时,则不会执行。

     

    <c:otherwise>

    在同一个 <c:choose> 中,当所有 <c:when> 的条件都没有成立时,则执行<c:otherwise> 

    本体内容。

    语法

    <c:otherwise>

    本体内容

    </c:otherwise>


    <c:forEach>

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

    限制

    ·假若有begin 属性时,begin 必须大于等于 0

    ·假若有end 属性时,必须大于begin

    ·假若有step 属性时,step 必须大于等于0

    Null 和错误处理

    ·假若items null 时,则表示为一空的集合对象

    ·假若begin 大于或等于items 时,则迭代不运算

     

     


    <%@ page contentType="text/html;charset=GB2312 " %>
    <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
    <html>
    <head>
    <title>CH7 - Core_forEach.jsp</title>
    </head>
    <body>
    <h2><c:out value="<c:forEach> 的用法" /></h2>
    <%
    String atts[] = new String [5];
    atts[
    0]="hello";
    atts[
    1]="this";
    atts[
    2]="is";
    atts[
    3]="a";
    atts[
    4]="pen";
    request.setAttribute(
    "atts", atts);
    %>
    <c:forEach items="${atts}" var="item" >
    ${item}
    </br>
    </c:forEach>
    </body>
    </html>

    <c:forEach>除了支持数组之外,还有标准J2SE 的集合类型,例如:ArrayList、List、
    LinkedList、Vector、Stack和Set 等等;另外还包括java.util.Map 类的对象.

    <c:forEach>并不只是用来浏览集合对象而已,读者可以从语法2中发现,items并不存在

    ,但是当没有使用items 属性时,就一定要使用begin end 这两个属性。

     


    <%@ page contentType="text/html;charset=GB2312" %>
    <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
    <html>
    <head>
    <title>CH7 - Core_forEach2.jsp</title>
    </head>
    <body>
    <h2><c:out value="<c:forEach> 循环" /></h2>
    <c:forEach begin="1" end="10" var="item" >
    ${item}
    </br>
    </c:forEach>
    </body>
    </html>

    上述范例中,我们并没有执行浏览集合对象,只是设定begin 和end 属性的值,这样它就
    变成一个普通的循环。此范例是将循环设定为:从1 开始跑到10,总共会重复循环10 次,并
    且将数字放到item 的属性当中. 

    begin主要用来设定在集合对象中开始的位置(注意:第一个位置为0);end 用来设定结束的位置;而step 则是用来设定现在指到的成员和下一个将被指到成员之间的间隔.

    另外,<c:forEach>还提供varStatus 属性,主要用来存放现在指到之成员的相关信息。例如: varStatus="s",那么将会把信息存放在名称为s的属性当中。varStatus属性还有另外四个属性:indexcountfirst last,它们各自代表的意义如表:

     

    属性

    类型

    意义

    index

    number

    现在指到成员的索引

    count

    number

    总共已经指到成员的总数

    first

    boolean

    现在指到的成员是否为第一个成员

    last

    boolean

    现在指到的成员是否为最后一个成员

     我们可以使用varStatus 属性取得循环正在浏览之成员的信息,下面为一个简单的范例:

     


    <%@ page contentType="text/html;charset=GB2312" %>
    <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
    <html>
    <head>
    </head>
    <body>
    <h2><c:out value="<c:forEach> varStatus 的四种属性" /></h2>
    <%
    String atts[] = new String [5];
    atts[
    0]="hello";
    atts[
    1]="this";
    atts[
    2]="is";
    atts[
    3]="a";
    atts[
    4]="pen";
    request.setAttribute(
    "atts", atts);
    %>
    <c:forEach items="${atts}" var="item"varStatus="s">
    <h2><c:out value="${item}"/>的四种属性:</h2>
    index:${s.index}
    </br>
    count:${s.count}
    </br>
    first:${s.first}
    </br>
    last:${s.last}
    </br>
    </c:forEach>
    </body>
    </html>

     

     

    还有一个例子:

    我要获取:http://localhost:8080/t/index.jsp?a=123&b=256&com=297中的参数列表按如下:

    键com:297
    键b:256
    键a:123

    可以结合EL表单式实现:

    <c:forEach items="${param}" var="b">
            键${b.key}:${b.value }
    <br/>
    </c:forEach>

     

     <c:forTokens> 

    <c:forTokens> 用来浏览一字符串中所有的成员,其成员是由定义符号(delimiters)所分隔的。
    语法:
    <c:forTokens   items="stringOfTokens"

            delims="delimiters"

            [var="varName"]

            [varStatus="varStatusName"]

            [begin="begin"]

            [end="end"]

            [step="step"]>
    本体内容
    </c:forTokens>  


    var       用来存放现在指到的成员N String 否无
    items   被迭代的字符串Y String 是无
    delims     定义用来分割字符串的字符N String 是无
    varStatus 用来存放现在指到的相关成员信息N String 否无
    begin       开始的位置Y int 否0
    end         结束的位置Y int 否最后一个成员
    step    每次迭代的间隔数Y int 否1

    说明
    <c:forTokens>的begin、end、step、var 和varStatus 用法都和<c:forEach>一样,因此,笔者在这里就只介绍items 和delims 两个属性:items 的内容必须为字符串;而delims 是用来分割items 中定义的字符串之字符。
    范例
    下面为一个典型的<c:forTokens>的范例:

    <c:forTokens items="A,B,C,D,E" delims="," var="item" >
    ${item}
    </c:forTokens>

    上面范例执行后,将会在网页中输出ABCDE。它会把符号“,”当做分割的标记,拆成5 个部分,也就是执行循环5 次,但是并没有将A,B,C,D,E 中的“,”显示出来。items 也可以放入EL 的表达式,如下:

    复制代码
    <%
    String phoneNumber = "123-456-7899";
    request.setAttribute(
    "userPhone", phoneNumber);
    %>
    <c:forTokens items="${userPhone}" delims="-" var="item" >
    ${item}
    </c:forTokens>
    复制代码

    这个范例将会在网页上打印1234567899,也就是把123-456-7899以“-”当做分割标记,将字符串拆为3 份,每执行一次循环就将浏览的部分放到名称为item 的属性当中。delims 不只指定一种字符来分割字符串,它还可以一次设定多个分割字符串用的字符。如下面这个范例:

    <c:forTokens items="A,B;C-D,E" delims=",;-" var="item" >
    ${item}
    </c:forTokens>

    此范例会在网页输出ABCDE,也就是说,delims 可以一次设定所有想当做分割字符串用的字符。其实用<c:forEach>也能做到分割字符串,写法如下:

    <c:forEach items="A,B,C,D,E" var="item" >
    ${item}
    </c:forEach>

    上述范例同样也会在网页输出ABCDE。<c:forEach>并没有delims这个属性,因此<c:forEach>无法设定分割字符串用的字符,而<c:forEach>分割字符串用的字符只有“,”,这和使用<c:forTokens>,delims 属性设为“,”的结果相同。所以如果使用<c:forTokens>来分割字符串,功能和弹性上会比使用<c:forEach>来得较大。

  • 相关阅读:
    XML Serializable Generic Dictionary
    MSBuild Community Tasks Project
    Firebird 数据库资源
    Atlas Samples & Suse Linux 10.1
    IBATISNETNET 1.3 开发指南系列文章
    线程安全的Generic Dictionary
    商务智能:SQL2005给我们的机会
    准备写一个Ibatisnet开发指南
    取到当前正在执行的script元素
    IE10 CSS hack
  • 原文地址:https://www.cnblogs.com/Alandre/p/3597819.html
Copyright © 2011-2022 走看看