jstl标签库详解

第9章 JSTL标签库

JSTL标签库的使用是为类弥补html表的不足,规范自定义标签的使用而诞生的。在告别modle1模式开发应用程序后,人们开始注重软件的分层设计,不希望在jsp页面中出现java逻辑代码,同时也由于自定义标签的开发难度较大和不利于技术标准化产生了自定义标签库。JSTL标签库可分为5类:


q        核心标签库


q        I18N格式化标签库


q        SQL标签库


q        XML标签库


q        函数标签库


本章将对这些内容一一讲述。


9.1 核心标签库

JSTL的核心标签库标签共13个,从功能上可以分为4类:表达式控制标签、流程控制标签、循环标签、URL操作标签。使用这些标签能够完成JSP页面的基本功能,减少编码工作。


(1)表达式控制标签:out标签、set标签、remove标签、catch标签。


(2)流程控制标签:if标签、choose标签、when标签、otherwise标签。


(3)循环标签:forEach标签、forTokens标签。


(4)URL操作标签:import标签、url标签、redirect标签。


在JSP页面引入核心标签库的代码为:


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


下面将按照功能分类,分别讲解每个标签的功能和使用方式。


9.2.1 表达式控制标签


表达式控制分类中包括<c:out>、<c:set>、<c:remove>、<c:chtch>4个标签,现在分别介绍它们的功能和语法。


1.<c:out>标签


【功能】:用来显示数据对象(字符串、表达式)的内容或结果。


在使用Java脚本输出时常使用的方式为:


<% out.println(“字符串”)%>


<%=表达式%>


在web开发中,为了避免暴露逻辑代码会尽量减少页面中的Java脚本,使用<c:out>标签就可以实现以上功能。


<c:out value=”字符串”>


<c:out value=”EL表达式”>


提示:JSTL的使用是和EL表达式分不开的,EL表达式虽然可以直接将结果返回给页面,但有时得到的结果为空,<c:out>有特定的结果处理功能,EL的单独使用会降低程序的易读性,建议把EL的结果输入放入<c:out>标签中。


<c:out>标签的使用有两种语法格式。


【语法1】:


<c:out value=”要显示的数据对象” [escapeXml=”true|false”] [default=”默认值”]>


【语法2】:


<c:out value=”要显示的数据对象” [escapeXml=”true|false”]>默认值


</c:out>


这两种方式没有本质的区别,只是格式上的差别。标签的属性介绍如下。


q        value:指定要输出的变量或表达式。


q        escapeXml:设定是否转换特殊字符(如&lt、&gt等一些转义字符),在默认值为true的情况下直接在输出&lt的,如果改为false将会进行转义输出“<”等。


q        default:为默认输出结果。如果使用表达式得到的结果为null(注意与空区别),将会输出默认结果。


【示例代码】:代码9.1演示了<c:out>的使用,以及在不同属性值状态下的结果。


代码9.1 <c:out>标签使用示例:coredemo01.jsp


1     <%@ page pageEncoding="gbk" %>


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


3     <html>


4     <head>


5              <title>out标签的使用</title>


6     </head>


7     <body>


8              <li>(1)<c:out value="北京源智天下科技有限公司"></c:out></li>


9              <li>(2)<c:out value="&lt未使用字符转义&gt" /></li>


10              <li>(3)<c:out value="&lt使用字符转义&gt" escapeXml="false"></c:out></li>


11              <li>(4)<c:out value="${null}">使用了默认值</c:out></li>


12              <li>(5)<c:out value="${null}"></c:out></li>


13     </body>


14     </html>


【代码解析】:


(1)第8行为<c:out>的value属性赋值为字符串。


(2)第9行和第10行对比,在改变escapeXml属性后页面输出的转义字符。


(3)第11行value得到null,如果方法体内有值,将输出方法体中的字符串,否则不输出,第12行没有输出结果。


程序运行结果如图9.1所示。




图9.1 coredemo01.jsp运行结果


【代码解析】:


(1)直接输出了一个字符串。


(2)字符串中有转义字符,但在默认情况下没有转换。


(3)使用了转义字符&lt和&gt分别转换成<和>符号。


(4)设定了默认值,从EL表达式${null}得到空值,所以直接输出设定的默认值。


(5)未设定默认值,输出结果为空。


2.<c:set>标签


功能:主要用于将变量存取于JSP范围中或JavaBean属性中。


<c:set>标签的编写共有4种语法格式。


语法1:存值,把一个值放在指定(page、session等)的map中。


<c:set value=”值1” var=”name1” [scope=”page|request|session|application”]>


含义:把一个变量名为name1值为“值1”的变量存储在指定的scope范围内。


语法2:


<c:set var=”name2” [scope=”page|request|session|application”]>


值2


</c:set>


含义:把一个变量名为name2,值为值2的变量存储在指定的scope范围内。


语法3:


<c:set value=”值3” target=”JavaBean对象” property=”属性名”/>


含义:把一个值为“值3”赋值给指定的JavaBean的属性名。相当与setter()方法。


语法4:


<c:set target=”JavaBean对象” property=”属性名”>


值4


</c:set>


含义:把一个值4赋值给指定的JavaBean的属性名。


提示:从共能上分语法1和语法2、语法3和语法4的效果是一样的只是把value值放置的位置不同至于使用那个根据个人的喜爱,语法1和语法2是向scope范围内存储一个值,语法3和语法4是给指定的JavaBean赋值。


【示例代码】:代码给出了给指定scope范围赋值的示例。使用<c:set>标签把值放入session、application对象中。同时使用EL表达式得到存入的值。


代码9.2 使用<c:set>存取值:coredemo02.jsp


1     <%@ page language="java" pageEncoding="gbk"%>


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


3     <html>


4     <head>


5     <title>set标签的使用</title>


6     </head>


7     <body>


8     <li>把一个值放入session中。<c:set value="coo" var="name1" scope="session"></c:set>


9     <li>从session中得到值:${sessionScope.name1 }


10     <li>把另一个值放入application中。<c:set var="name2" scope="application">olive</c:set>


11              <li> 使用out标签和EL表达式嵌套得到值:


12              <c:out value="${applicationScope.name2}">未得到name的值</c:out></li>


13     <li>未指定scope的范围,会从不同的范围内查找得到相应的值:${name1 }、${name2 }


14     </body>


15     </html>


【代码解析】:


(1)第8行通过<c:set>标签将值name1的值放入session范围中。


(2)第9行使用EL表达式得到name1的值。


(3)第10行把name2放入application范围中。


(4)第11行使用EL表达式从application范围中取值,用<c:out>标签输出使得页面规范化。


(5)第13行不指定范围使用EL自动查找得到值。


程序运行的结果如图9.2所示。




图9.2 coredemo02.jsp


在代码中未使用任何Java脚本使用程序的功能。为了对比期间,代码9.3给出了使用Java脚本实现以上功能的例子。


代码9.3 Java脚本实现值的存取:getvalue.jsp


1     <%@page language="java" pageEncoding="gbk"%>


2     <html>


3     <head>


4     <title>set标签的使用</title>


5     </head>


6     <body>


7     <li>把一个值放入session中。<%session.setAttribute("name1","coo"); %></li>


8     <li>从session中得到值:<% out.println(session.getAttribute("name1"));   %></li>


9     <li>把另一个值放入application中。<% application.setAttribute("name2","olive"); %></li>


10     <li> 从application中得到值:<% out.println(application.getAttribute("name2")); %></li>


11     </body>


12     </html>


【代码解析】:使用JSP内置对象的方法实现存值和取值的功能。


程序运行结果如图9.3所示:




图9.3 getvalue.jsp运行结果


提示:本章示例为了方便期间都是从一个页面中存取,在开发中值的存取是为了不同的JSP页面之间共享数据


从两个程序对比来看,JSTL实习了使用标签完成取值赋值的功能,减少代码的编写量同时避免了逻辑代码暴露的危险。


【程序示例】:代码9.4和代码9.5演示使用<c:set标签>操纵JavaBean。


(1)创建一个JavaBean对象。


代码9.4 JavaBean(vo数据传输对象):Person.java


1     package org.olive;


2     public class Person {


3              private String name;                                      //定义私有变量姓名字符串


4              private int age;                                                //定义私用变量年龄整型


5              private char sex;                                             //定义私用变量性别字符性


6              private String home;                                      //定义私用变量家乡字符串


7              public String getName() {                             //name的getter方法


8                        return name;


9              }


10              public void setName(String name) {          //name的setter方法。


11                        this.name = name;


12              }


13              public int getAge() {                                        //age的getter方法


14                        return age;


15              }


16              public void setAge(int age) {                        //age的setter方法


17                        this.age = age;


18              }


19              public char getSex() {                                    //sex的getter方法


20                        return sex;


21              }


22              public void setSex(char sex) {                      //sex的setter方法


23                        this.sex = sex;


24              }


25              public String getHome() {                             //home的getter方法


26                        return home;


27     }


28              public void setHome(String home) {                   //home的setter方法


29                       this.home = home;


30              }


31     }


【代码解析】:一个只有getter和setter方法的JavaBean或者说一个pojo类,作为一个vo(数据传输对象)。定义了四个变量age、name、sex和home。


(2)创建JSP页面,实现对值的操作。


代码9.5 操作JavaBean:coredemo03.jsp


1     <%@ page language="java" pageEncoding="gbk"%>


2     <jsp:useBean id="person" class="org.olive.Person" />


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


4     <html>


5     <head>


6     <title>set标签的使用</title>


7     </head>


8     <body>


9              <c:set target="${person}" property="name">maverick</c:set>


10              <c:set target="${person}" property="age">25</c:set>


11              <c:set target="${person}" property="sex">男</c:set>


12              <c:set target="${person}" property="home">china</c:set>


13              <li>使用的目标对象为:${person }


14              <li>从Bean中获得的name值为:<c:out value="${person.name}"></c:out>


15              <li>从Bean中获得的age值为:<c:out value="${person.age}"></c:out>


16              <li>从Bean中获得的sex值为:<c:out value="${person.sex}"></c:out>


17              <li>从Bean中获得的home值为:<c:out value="${person.home}"></c:out>


18              </body>


19     </html>


【代码解析】:


(1)第1行设置页面格式和字符编码集。


(2)第2行使用JSP的指令元素指定要使用的JavaBean。


(3)第3行引入JSTL核心标签库。


(4)第9~12行设置JavaBean的属性值,等同与setter方法。


(5)使用EL表达式得到JavaBean的属性值,并用out标签输出。


【关键代码】:


<jsp:useBean id="person" class="org.olive.Person" />


负责实例化Bean,id指定实例化后的对象名,可以通过${person}得到person在内存中的值(或者使用person.toString()方法)。


<c:set target="${person}" property="name">maverick</c:set>


Target指向实例化后的对象,property指向要插入值的参数名。


注意:使用target时一定要指向实例化后的JavaBean对象,也就是要跟<jsp:useBean>配套使用,也可以java脚本实例化,但这就失去了是用标签的本质意义。


使用Java脚本实例化:


<%@page import=”org.olive.Person”%


<% Person person=new Person(); %>


程序运行结果如图9.4所示。




图9.4 coredemo03.jsp运行结果


3.<c:remove>标签


<c:remove>标签主要用来从指定的JSP范围内移除指定的变量。


【语法】:


<c:remove var=”变量名” [scope=”page|request|session|application”]/>


其中var属性是必须的,scope可以以省略。


【示例程序】:代码9.6使用set标签在session中插入2个值,然后用remove标签移除。


代码9.6 <c:remove>标签示例:coredemo04.jsp


1       <%@ page language="java" pageEncoding="gbk"%>


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


3       <html>


4       <head>


5       <title>remove标签的使用</title>


6       </head>


7       <body>


8                <li><c:set var="name" scope="session">olive</c:set>


9                <li><c:set var="age" scope="session">25</c:set>


10              <li><c:set var="sex" scope="session">男</c:set>


11              <li><c:out value="${sessionScope.name}"></c:out>


12              <li><c:out value="${sessionScope.age}"></c:out>


13              <li><c:out value="${sessionScope.sex}"></c:out>


14              <li><c:remove var="age"/>


15              <li><c:out value="${sessionScope.name}"></c:out>


16              <li><c:out value="${sessionScope.age}"></c:out>


17              <li><c:out value="${sessionScope.sex}"></c:out>


18              </body>


19    </html>


【代码解析】:


(1)第8~9行使用set标签向session中插入三个值:name值为olive、age值为25、sex值为男。


(2)第11~13行使用out和EL表达式输出name、age、sex的值。


(3)第14行使用remove标签移除age的值,然后使用步骤第11~13行中的三个输出作为比较。


4.<c:catch>标签


用来处理JSP页面中产生的异常,并将异常信息存储。


【语法】:


<c:catch var=”name1”>


容易产生异常的代码


</c:catch>


【参数说明】:


var表示由用户定义存取异常信息的变量的名称。省略后也可以实现异常的捕获,当就不能显示的输出异常信息。


【示例代码】:代码9.7使用<c:catch></c:catch>标签,并设计一个异常并输出异常信息。


代码9.7 <c:catch>标签使用示例:coredemo05.jsp


1       <%@ page language="java" pageEncoding="gbk"%>


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


3       <html>


4       <head>


5       <title>JSTL: -- catch标签实例</title>


6       </head>


7       <body>


8       <h4>catch标签实例</h4>


9       <hr>


10              <c:catch  var=”error”>


11     <       c:set target="Dank" property="hao"></c:set>


12              </c:catch>


13     <c:out value="${errors}"/>


14     </body>


15     </html>


【代码解析】:


(1)第10~12把容易产生异常的代码放在<c:catch></c:catch>中,自定义一个变量error用于存储异常信息。


(2)第11行实现了一段异常代码,向一个不存在的JavaBean中插入一个值。


(3)第13行用EL表达式得到error的值,并使用<c:out>标签输出。


程序结果如图所示。




图9.5 coredemo05.jsp


图中异常信息的提示为:在<set>标签中用不正确的参数“hao”。如果不捕获程序中的异常,也就是不使用<c:catch></c:catch>捕获容易产生异常的代码,将会出现如图9.6所示,这是在开发中不允许的。




图9.6 程序异常


提示:本示例没有使用捕获Java脚本的样式,如果使用标签再使用Java脚本的意义不大,由此可以看出<c:catch/>主要用于页面标签产生的异常。


9.2.2 流程控制标签


流程控制标签主要用于对页面简单业务逻辑进行控制。流程控制标签包含有4个:<c:if>标签、<c:choose>标签、<c:when>标签和<c:otherwise>标签。下面将介绍这些标签的功能和使用方式。


1.<c:if>标签


<c:if>同程序中的if作用相同,用来实现条件控制。


【语法1】:


<c:if test=”条件1” var=”name” [scope=”page|request|session|application”]>


【语法2】:


<c:if test=”条件2” var=”name”[scope=”page|request|session|application”]>


【参数说明】:


(1)test属性用于存放判断的条件,一般使用EL表达式来编写。


(2)var指定名称用来存放判断的结果类型为true或false。


(3)scope用来存放var属性存放的范围。


【使用场景】:在开发中经常会出现不同用户的权限,首先对用户名进行判断(包括进行数据库验证,该功能可以由JavaBean实现,使用EL表达式得到一个布尔型的结果),把判断的结果存放在不同的JSP范围内(比如常用的session内),这样在每个页面都可以得到该用户的权限信息,根据不同权限的用户显示不同的结果。


【示例代码】:代码9.8实现了用户输入用户名提交到自身页面,页面判断用户是否为admin,如果是将出现欢迎界面,如果不是显示不同结果。


代码9.8 <c:if>标签使用示例:coredemo06.jsp


1     <%@ page language="java" pageEncoding="gbk"%>


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


3     <html>


4     <head>


5     <title>JSTL: -- if标签示例</title>


6     </head>


7     <body>


8              <h4>if标签示例</h4>


9              <hr>


10              <form action="coredom06.jsp" method="post">


11              <input type="text" name="uname" value="${param.uname}">


12              <input type="submit" value="登录">


13              </form>


14              <c:if test="${param.uname=='admin' }" var=”adminchock”>


15              <c:out value="管理员欢迎您!">


16              </c:out>


17              </c:if>


18              ${adminchock}


19</body>


20</html>


【代码解析】:


(1)第10~13行创建一个表单,表单中的元素为一个text文本输入框,一个提交按钮,并把信息提交给本页。


(2)第14行使用if标签进行判断,如果输入的为admin将显示出定义的字符串,并把检验后的结果赋给adminchock,存储在默认的page范围中。


(3)第18行使用EL表达式得到adminchock的值,如果输入的用户名为admin将显示true。


程序运行效果如图9.7所示。




图9.7 coredemo06.jsp运行结果


提示:可以把adminchock的属性范围设置为session,可以在其他的页面中得到adminchock的值,使用<c:if text=”${adminchock}”><c:if>判断,实现不同的权限。


2.<c:choose>、<c:when>和<c:otherwise>标签


这3个标签通常情况下是一起使用的,<c:choose>标签作为<c:when>和<c:otherwise>标签的父标签来使用。


【语法1】:


<c:choose>


        <c:when>


…..//业务逻辑1


        <c:otherwise>


…..//业务逻辑2


        <c:otherwise>


….//业务逻辑3


</c:choose>


【语法2】:


<c:when text=”条件”>


表达式


</c:when>


【语法3】:


<c:otherwise>


表达式


</c:otherwise>


【参数说明】:


(1)语法1为3个标签的嵌套使用方式,<c:choose>标签只能和<c:when>标签共同使用。


(2)语法2为<c:when>标签的使用方式,该标签都条件进行判断,一般情况下和<c:choose>共同使用。


(3)<c:otherwise>不含有参数,只能跟<c:when>共同使用,并且在嵌套中只允许出现一次。


【示例代码】:代码9.9设定一个score变量的值为85,使用嵌套标签进行判断,根据判断返回结果。


代码9.9 循环控制标签:coredemo07.jsp


1     <%@ page language="java" pageEncoding="gbk"%>


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


3     <html>


4     <head>


5              <title>JSTL: -- choose及其嵌套标签标签示例</title>


6     </head>


7     <body>


8              <h4>choose及其嵌套标签示例</h4>


9     <hr>


10              <c:set var="score">85</c:set>


11              <c:choose>


12              c:when test="${score>=90}">


13              你的成绩为优秀!


14              </c:when>


15              <c:when test="${score>=70&&score<90}">


16              您的成绩为良好!


17              </c:when>


18              <c:when test="${score>60&&score<70}">


19              您的成绩为及格


20              </c:when>


21              <c:otherwise>


22              对不起,您没有通过考试!


23              </c:otherwise>


24              </c:choose>


25              </body>


26     </html>


【代码解析】:


(1)第10行通过set标签设定score的值为85。


(2)第12~22行使用<c:when>进行条件判断。如果大于等于90,输出“您的成绩为优秀”;


如果大于等于70小于90,输出“您的成绩为良好”;大于等于60小于70,输出“您的成绩为及格”;其他(otherwise)输出“对不起,您没能通过考试”。


程序运行结果如图9.8所示。




图9.8 coredemo07.jsp运行结果


9.2.3 循环标签


循环标签主要实现迭代操作。主要包含两个标签:<c:forEach>和<c:forTokens>标签,接下来将详细介绍这两个标签的用法。


1.<c:forEach>标签


该标签根据循环条件遍历集合(Collection)中的元素。


【语法】:


<c:forEach var=”name” items=”Collection” varStatus=”StatusName” begin=”begin” end=”end” step=”step”>


本体内容


</c:forEach>


【参数解析】:


(1)var设定变量名用于存储从集合中取出元素。


(2)items指定要遍历的集合。


(3)varStatus设定变量名,该变量用于存放集合中元素的信息。    


(4)begin、end用于指定遍历的起始位置和终止位置(可选)。


(5)step指定循环的步长。


参数类型和相关说明见表9-1。


表9-1 循环标签属性说明


名称


EL


类型


是否必须


默认值


var


N


String




items


Y


Arrays


Collection


Iterator


Enumeration


Map


String []args




begin


Y


int



0


end


Y


int



集合中最后一个元素


step


Y


int



1


varStatus


N


String




其中varStatus有4个状态属性(见表9-2)。


表9-2 varStatus的4个状态


属性名


类型


说明


index


int


当前循环的索引值


count


int


循环的次数


frist


boolean


是否为第一个位置


last


boolean


是否为第二个位置


【示例代码】:代码9.10实现了遍历的两种方式:设定起始位置、不设定起始位置。同时实现了获得原属的状态信息。


代码9.10 <c:forEach>标签使用示例:coredemo08.jsp


1     <%@ page contentType="text/html;charset=GBK" %>


2     <%@page import="java.util.List"%>


3     <%@page import="java.util.ArrayList"%>


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


5     <html>


6     <head>


7              <title>JSTL: -- forEach标签实例</title>


8     </head>


9     <body>


10     <h4><c:out value="forEach实例"/></h4>


11     <hr>


12              <%


13                       List a=new ArrayList();


14                       a.add("贝贝");


15                       a.add("晶晶");


16                       a.add("欢欢");


17                       a.add("莹莹");


18                        a.add("妮妮");


19              request.setAttribute("a",a);


20              %>


21              <B><c:out value="不指定begin和end的迭代:" /></B><br>


22             <c:forEach var="fuwa" items="${a}">


23             &nbsp;<c:out value="${fuwa}"/><br>


24              </c:forEach>


25              <B><c:out value="指定begin和end的迭代:" /></B><br>


26              <c:forEach var="fuwa" items="${a}" begin="1" end="3" step="2">


27              &nbsp;<c:out value="${fuwa}" /><br>


28              </c:forEach>


29              <B><c:out value="输出整个迭代的信息:" /></B><br>


30              <c:forEach var="fuwa" items="${a}" begin="3" end="4" step="1" varStatus="s">


31              &nbsp;<c:out value="${fuwa}" />的四种属性:<br>


32              &nbsp;&nbsp;所在位置,即索引:<c:out value="${s.index}" /><br>


33              &nbsp;&nbsp;总共已迭代的次数:<c:out value="${s.count}" /><br>


34              &nbsp;&nbsp;是否为第一个位置:<c:out value="${s.first}" /><br>


35              &nbsp;&nbsp;是否为最后一个位置:<c:out value="${s.last}" /><br>


36              </c:forEach>


37     </body>


38     </html>


【代码解析】:


(1)第13~18行通过Java脚本创建了一个集合对象a,并添加元素。


(2)第19行使用setAttribute()方法把集合存入request范围内。


(3)第22~24行未指定begin和end属性,直接从集合开始遍历到集合结束为止。


(4)第26~28行指定从集合的第二个(index值为1)元素开始,到第四个(index值为3)元素截止(index的值从0开始)。并指定step为2即每隔两个遍历一次。


(5)第30~35指定varStatus的属性名为s,并取出存储的状态信息。


程序运行结果如图9.9所示。




图9.9 coredemo08.jsp运行结果


【总结】:


(1)从图中可以看到不使用begin和end的迭代,从集合的第一个元素开始,遍历到最后一个元素。


(2)指定begin的值为1、end的值为3、step的值为2,从第二个开始首先得到晶晶,每两个遍历一次,则下一个显示的结果为莹莹,end为3则遍历结束。


(3)从指定的begin和end的值来看遍历第四个和第五个,因得到莹莹和妮妮。相关状态信息如图所示。


提示:本例使用的list是在JSP页面中使用Java脚本创建的,是因为JSTL缺少创建集合的功能,在开发中一般不会如此,可通过访问数据库得到数据集合,和通过设定JavaBean的值得到数据集合


2.<c:forTokens>


该标签用于浏览字符串,并根据指定的字符将字符串截取。


语法:


<c:forTokens items=”strigOfTokens” delims=””delimiters [var=”name” begin=”begin” end=”end” step=”len” varStatus=”statusName”] >


【参数说明】


(1)items指定被迭代的字符串。


(2)delims指定使用的分隔符。


(3)var指定用来存放遍历到的成员。


(4)begin指定遍历的开始位置(int型从取值0开始)。


(5)end指定遍历结束的位置(int型,默认集合中最后一个元素)。


(6)step遍历的步长(大于0的整型)。


(7)varStatus存放遍历到的成员的状态信息。


【示例代码】:代码9.11实现了遍历一个有符号的字符串,把指定的符号移除。指定begin和end值,并获得遍历到的元素的状态信息。


代码9.11 <c:forTokens>标签的示例:coredemo09.jsp


1     <%@ page contentType="text/html;charset=GBK" %>


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


3     <html>


4     <head>


5              <title>JSTL: -- forTokens标签实例</title>


6     </head>


7     <body>


8     <h4><c:out value="forToken实例"/></h4>


9     <hr>


10              <c:forTokens items="北、京、欢、迎、您" delims="" var="c1">


11              <c:out value="${c1}"></c:out>


12              </c:forTokens><br>


13              <c:forTokens items="123-4567-8854" delims="-" var="t">


14              <c:out value="${t}"></c:out>


15             </c:forTokens><br>


16    <c:forTokens items="1*2*3*4*5*6*7" delims="*" begin="1" end="3" var="n" varStatus="s">


17              &nbsp;<c:out value="${n}" />的四种属性:<br>


18              &nbsp;&nbsp;所在位置,即索引:<c:out value="${s.index}" /><br>


19              &nbsp;&nbsp;总共已迭代的次数:<c:out value="${s.count}" /><br>


20              &nbsp;&nbsp;是否为第一个位置:<c:out value="${s.first}" /><br>


21              &nbsp;&nbsp;是否为最后一个位置:<c:out value="${s.last}" /><br>


22     </c:forTokens>


23    </body>


24     </html>


【代码解析】:


(1)本示例共实现了3个<c:forToken>循环,10~12行第一个循环实现了遍历给定字符串“北、京、欢、迎、您”,并除去循环中遇到的“、”号。


(2)13~15行第2个循环遍历一串带有分隔符的电话号码,不读取分隔符号,将显示一个字符串。


(3)16~22行第3个循环遍历一个带“*”号的字符串,根据指定的起始位置把元素取出,并显示每个元素的状态信息。


提示:分隔符的作用是根据标识,截取字符串。如果未设定分隔符或在字符串中没有找到分隔付,将把整个元素作为一个元素截取。在实际应用中用于在除去某些符号在页面中显示。


程序运行结果如图9.10所示。




图9.10 coredemo08.jsp


<c:forToken>的属性varStatus的使用同<c:forEach>的使用方法相同,在此就再不表述。


9.2.4 URL操作标签


JSTL包含3个与URL操作有关的标签,分别为:<c:import>、<c:redirect>和<c:url>标签。它们的作用为:显示其他文件的内容、网页导向、产生URL。下面将详细介绍这3个标签的使用方法。


1.<c:import>标签


该标签可以把其他静态或动态文件包含到本JSP页面。同<jsp:include>的区别为:只能包含同一个web应用中的文件。而<c:import>可以包含其他web应用中的文件,甚至是网络上的资源。


语法1:


<c:import url=”url” [context=”context”][ value=”value”]


[scope=”page|request|session|application”] [charEncoding=”encoding”]>


语法2:


<c:import url=”url” varReader=”name” [context=”context”][charEncoding=”encoding”]>


主要参数见表9-3。


表9-3 <c:import>标签参数说明


名称


说明


EL


类型


必须


默认值


url


被导入资源的URL路径


Y


String




context


相同服务器下其他的web工程,必须以“"”开头


Y


String




var


以String类型存入被包含文件的内容。


N


String




Scope


var变量的JSP范围


N


String



page


charEncoding


被导入文件的编码格式


Y


String




varReader


以Reader类型存储被包含文件内容


N


String




【参数说明】:


(1)URL为资源的路径,当应用的资源不存在时系统会抛出异常,因此该语句应该放在<c:catch></c:catch>语句块中捕获。应用资源有两种方式:绝对路径和相对路径。使用绝对路径示例如下:


<c:import url=”http://www.baidu.com”>


使用相对路径的实例如下:


<c:import url=”aa.txt”>


aa.txt放在同一文件目录。


如果以“/”开头表示应用的根目录下。例如:tomcat应用程序的根目录文件夹为webapps。导入webapps下的文件bb.txt的编写方式为:


<c:import url=”/bb.txt”>


如果访问webapps管理文件夹中其他web应用就要用context属性。


(2)context属性用于在访问其他web应用的文件时,指定根目录。例如,访问root下的index.jsp的实现代码为:


<c:import url=”/index.jsp” context=”/root”>


等同于webapps/root/index.jsp


(3)var、scope、charEncoding、varReader是可选属性。具体使用方式见示例代码。


【示例代码】:代码9.12实现了从绝对路径导入文件和从相对路径导入,同时使用var对象指定用变量来存储文件,并输出存入的文件内容。


代码9.12 <c:import>标签示例:coredemo10.jsp


1     <%@ page contentType="text/html;charset=GBK" %>


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


3     <html>


4     <head>


5              <title>JSTL: -- import标签实例</title>


6     </head>


7     <body>


8     <h4><c:out value="import实例"/></h4>


9     <hr>


10     <h4><c:out value="绝对路径引用的实例" /></h4>


11     <c:catch var="error1">


12     <c:import url="http://www.baidu.com"/>


13    </c:catch>


14    <c:out value="${error1}"></c:out>


15    <hr>


16     <h4>


17     <c:out value="相对路径引用的实例,引用本应用中的文件" /></h4>


18     <c:catch>


19     <c:import url="a1.txt" charEncoding="gbk"/>


20     </c:catch>


21     <hr>


22     <h4><c:out value="使用字符串输出、相对路径引用的实例,并保存在session范围内" /></h4>


23     <c:catch var="error3">


24     <c:import var="myurl" url="a1.txt" scope="session" charEncoding="gbk"></c:import>


25     <c:out value="${myurl}"></c:out>


26     <c:out value="${myurl}" />


27     </c:catch>


28     <c:out value="${error3}"></c:out>


29     </body>


30     </html>


【代码解析】:


(1)第12行使用绝对路径导入百度首页,导入时使用<c:catch></c:catch>(11和12行)捕获异常。


(2)使用相对路径导入同一文件夹下的a1.txt文件,接收的字符编码格式使用charEncoding设置为gbk。


(3)同样导入a1.txt,不同的时使用var定义的变量接收要导入的文件,并存储在session中,如果在其他页面同样也要导入该文件,只须使用<c:out>输出a1.txt的值即可。


程序结果如图9.11所示。




图9.11 coredemo10.jsp运行结果


【说明】:


(1)在使用绝对路径导入时,因为电脑没有联网所以抛出异常。


(2)使用相对路径输出时,同样是引入的a1.txt文件显示的结果却不相同,这可以说明直接使用<c:import>导入,不设定var参数是直接在页面中显示的文本信息。而使用var参数输出时输出的实现存入的字符串。


提示:读者在练习时可以使用Tomcat的首页来导入url=”http://127.0.0.1:8080”来显示效果。


2.<c:redirect>标签


该标签用来实现了请求的重定向。同时可以在url中加入指定的参数。例如:对用户输入的用户名和密码进行验证,如果验证不成功重定向到登录页面;或者实现web应用不同模块之间的衔接。


【语法1】:


<c:redirect url=”url” [context=”context”]>


【语法2】:


<c:redirect url=”url”[context=”context”]>


<c:param name=”name1” value=”value1”>


</c:redirect>


【参数说明】:


(1)url指定重定向页面的地址,可以是一个string类型的绝对地址或相对地址。


(2)用于导入其他web应用中的页面。


【示例代码】:代码9.13实现了当请求页面时重定向到tomcat首页。


代码9.13 <c:redirect>标签示例:coredemo11.jsp


<%@ page contentType="text/html;charset=GBK" %>


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


<c:redirect url="http://127.0.0.1:8080">


<c:param name="uname">olive</c:param>


<c:param name="password">01234</c:param>


</c:redirect>


【代码解析】


(1)使用重定向与载入页面不同,载入页面时在本页面中插入其他页面,而重定向是请求转发,等于在页面中重新输入了一次url。当重定向到某个页面时浏览器中的地址会发生变化。


(2)使用重定向时不用使用<c:catch>语句,当输入页面访问不到时,浏览器会报错,跟程序运行无关。如果使用重定向时页面定义的内容将不会得到显示。


(3)在重定向时为URL添加了两个参数和参数值:uname=olive和password=01234。


程序运行结果如图9.12所示。




图9.12 coredemo11.jsp运行结果


提示:注意图中的URL地址已经发生转变,同时可以看到传入的参数以参数值。


3.<c:url>标签


该标签用于动态生成一个String类型的URL,可以同<c:redirect>标签共同使用,也可以使用html的<a>标签实现超链接。


【语法1】:指定一个url不做修改,可以选择把该url存储在JSP不同的范围中。


<c:url value=”value” [var=”name”][scope=”page|request|session|application”]


[context=”context”]/>


【语法2】:给url加上指定参数及参数值,可以选择以name存储该url。


<c:url value=”value” [var=”name”][scope=”page|request|session|application”]


[context=”context”]>


<c:param name=”参数名” value=”值”>


</c:url>


【示例代码】:代码9.14实现了使用动态生成url实现了网页的超链接。


代码9.14 <c:url>标签示例:coredemo12.jsp


<%@ page contentType="text/html;charset=GBK" %>


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


<c:out value="url标签使用"></c:out>


<h4>使用url标签生成一个动态的url,并把值存入session中.</h4>


<hr>


<c:url value="http://127.0.0.1:8080" var="url" scope="session">


</c:url>


<a href="${url}">Tomcat首页</a>


程序运行结果如图9.13所示。




图9.13 coredemo12.jsp运行结果


单击图中超链接可以直接访问到Tomcat首页。


你可能感兴趣的:(el表达式,jstl,>,c标签,)