ThinkChat🤖让你学习和工作更高效,注册即送10W Token,即刻开启你的AI之旅 广告
       JSTL(JSP Standard Tag Library,JSP标准标签库)是一个不断完善的开放源代码的JSP标签库,是由apache的jakarta小组来维护的。JSTL只能运行在支持JSP1.2和Servlet2.3规范的容器上,如tomcat 4.x。在JSP 2.0中也是作为标准支持的。       JSTL 1.0 发布于 2002 年 6 月,由四个定制标记库(core、format、xml 和 sql)和一对通用标记库验证器(ScriptFreeTLV 和 PermittedTaglibsTLV)组成。core 标记库提供了定制操作,通过限制了作用域的变量管理数据,以及执行页面内容的迭代和条件操作。它还提供了用来生成和操作 URL 的标记。顾名思义,format 标记库定义了用来格式化数据(尤其是数字和日期)的操作。它还支持使用本地化资源束进行 JSP 页面的国际化。xml 库包含一些标记,这些标记用来操作通过 XML 表示的数据,而 sql 库定义了用来查询关系数据库的操作。 ### 一、JSTL 库安装       如果要使用JSTL,则必须将jstl.jar和 standard.jar文件放到classpath中,如果你还需要使用XML processing及Database access (SQL)标签,还要将相关JAR文件放到classpath中,这些JAR文件全部存在于下载回来的zip文件中。 Apache Tomcat安装JSTL 库步骤如下: - 下载standard.jar和jstl.jar,这里可以下[download.csdn.net/detail/evankaka/8871459](#),我已打包好的 - standard.jar和jstl.jar文件拷贝到/WEB-INF/lib/下。 使用任何库,你必须在每个JSP文件中的头部包含<taglib>标签。 standard.jar的作用 JSP 标准标签库,和jstl.jar 一起使用,在1.0的版本中,但在jstl-1.2.jar 就不在需要了。 如果你想在项目中使用JSTL和EL表达式,那么你必须要引入这个standard.jar文件。即使你没有引入,那MyEclipse工具自带的类库也会帮你倒入。其他工具不会。 jstl.jar下载地址: [http://repo2.maven.org/maven2/javax/servlet/jstl/](http://repo2.maven.org/maven2/javax/servlet/jstl/) standard.jar下载地址: [http://repo2.maven.org/maven2/taglibs/standard/](http://repo2.maven.org/maven2/taglibs/standard/) 如果是在Maven中可以这么写: ~~~ <!-- standard.jar --> <dependency> <groupId>taglibs</groupId> <artifactId>standard</artifactId> <version>1.1.2</version> </dependency> <!-- JSTL --> <dependency> <groupId>javax.servlet</groupId> <artifactId>jstl</artifactId> <version>1.1.2</version> </dependency> ~~~ ### 二、核心标签 核心标签是最常用的JSTL标签。引用核心标签库的语法如下: ~~~ ~~~ <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> ~~~ ~~~ | 标签 | 描述 | |-----|-----| | [<c:out>](http://www.runoob.com/jsp/jstl-core-out-tag.html) | 用于在JSP中显示数据,就像<%= ... > | | [<c:set>](http://www.runoob.com/jsp/jstl-core-set-tag.html) | 用于保存数据 | | [<c:remove>](http://www.runoob.com/jsp/jstl-core-remove-tag.html) | 用于删除数据 | | [<c:catch>](http://www.runoob.com/jsp/jstl-core-catch-tag.html) | 用来处理产生错误的异常状况,并且将错误信息储存起来 | | [<c:if>](http://www.runoob.com/jsp/jstl-core-if-tag.html) | 与我们在一般程序中用的if一样 | | [<c:choose>](http://www.runoob.com/jsp/jstl-core-choose-tag.html) | 本身只当做<c:when>和<c:otherwise>的父标签 | | [<c:when>](http://www.runoob.com/jsp/jstl-core-choose-tag.html) | <c:choose>的子标签,用来判断条件是否成立 | | [<c:otherwise>](http://www.runoob.com/jsp/jstl-core-choose-tag.html) | <c:choose>的子标签,接在<c:when>标签后,当<c:when>标签判断为false时被执行 | | [<c:import>](http://www.runoob.com/jsp/jstl-core-import-tag.html) | 检索一个绝对或相对 URL,然后将其内容暴露给页面 | | [<c:forEach>](http://www.runoob.com/jsp/jstl-core-foreach-tag.html) | 基础迭代标签,接受多种集合类型 | | [<c:forTokens>](http://www.runoob.com/jsp/jstl-core-foreach-tag.html) | 根据指定的分隔符来分隔内容并迭代输出 | | [<c:param>](http://www.runoob.com/jsp/jstl-core-param-tag.html) | 用来给包含或重定向的页面传递参数 | | [<c:redirect>](http://www.runoob.com/jsp/jstl-core-redirect-tag.html) | 重定向至一个新的URL. | | [<c:url>](http://www.runoob.com/jsp/jstl-core-url-tag.html) | 使用可选的查询参数来创造一个URL | - **<c:if>使用**   <c:if> 标签必须要有test属性,当test中的表达式结果为true时,则会执行本体内容;如果为false,则不会执行。例如:${requestScope.username = = 'admin'},如果requestScope.username等admin时,结果为true;若它的内容不等于admin时,则为false。   接下来看下列的范例:   <c:if test="${requestScope.username = = 'admin' }">   ADMIN您好!! //body部分   </c:if> 如果名称等于admin,则会显示"ADMIN您好!! "的动作,如果相反,则不会执行<c:if>的body部分,所以不会显示"ADMIN您好!! //body部分"。另外<c:if>的本体内容除了能放纯文字,还可以放任何JSP程序代码(Scriptlet)、JSP 标签或者HTML码。   除了test属性之外,<c:if>还有另外两个属性var和scope。当我们执行<c:if>的时候,可以将这次判断后的结果存放到属性var里;scope则是设定var的属性范围。哪些情况才会用到var和scope这两个属性呢?例如:当表达式过长时,我们会希望拆开处理,或是之后还须使用此结果时,也可以用它先将结果暂时保留,以便日后使用。 例子: ~~~ <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <meta http-equiv="Content-type" content="text/html; charset=UTF-9"> </head> <body> <% String amind="Admin"; request.setAttribute("amind",amind); %> <c:if test="${requestScope.amind=='Admin'}" var="condition" scope="request">    您好Admin先生 </c:if> </body> </html> ~~~ 运行结果: **![](https://box.kancloud.cn/2016-02-22_56caf9bad9bac.jpg)** - **<c:choose>使用** <c:choose>用于条件选择,他和<c:when><c:otherwise>一起使用,他们只能组合在一起使用<c:when>代表了<c:choose>的一个条件分支,他必须以<c:choose>作为他的父标签 他必须在<c:otherwise>之前出现,只要遵寻这两个规则,使用起来很简单,下面给出代码: ~~~ <c:choose> <c:when test="expression"> body content </c:when> <c:when test="expression"> body content </c:when> ... <c:otherwise> body content </c:otherwise> </c:choose> ~~~ 如: ~~~ <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> <jsp:useBean id="user" class="com.mucfc.User"/> <jsp:setProperty property="name" name="user" value="arthur"/> <jsp:setProperty property="age" name="user" value="12"/> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <meta http-equiv="Content-type" content="text/html; charset=UTF-8"> </head> <body> <c:choose> <c:when test="${user.name=='arthur'}"> 欢迎朋友:${user.name} </c:when> <c:otherwise> 登录失败 </c:otherwise> </c:choose> <body> </html> ~~~ 运行结果: ![](https://box.kancloud.cn/2016-02-22_56caf9bae9e1f.jpg) - **<c:forEach>** <c:foreach>类似于for和foreach循环  <c:forEach>标签用于通用数据循环,它有以下属性 | 属 性 | 描 述 | 是否必须 | 缺省值 | |-----|-----|-----|-----| | items | 进行循环的项目 | 否 | 无 | | begin | 开始条件 | 否 | 0 | | end | 结束条件 | 否 | 集合中的最后一个项目 | | step | 步长 | 否 | 1 | | var | 代表当前项目的变量名 | 否 | 无 | | varStatus | 显示循环状态的变量 | 否 | 无 | **<c:forEach>标签的语法定义如下所示。** ~~~ <c:forEach var="name" items="expression" varStatus="name" begin="expression" end="expression" step="expression"> body content </c:forEach> ~~~ <c:forEach>标签的items属性支持Java平台所提供的所有标准集合类型。此外,您可以使用该操作来迭代数组(包括基本类型数组)中的元素。它所支持的集合类型以及迭代的元素如下所示: java.util.Collection:调用iterator()来获得的元素。 ava.util.Map:通过java.util.Map.Entry所获得的实例。 java.util.Iterator:迭代器元素。 java.util.Enumeration:枚举元素。 Object实例数组:数组元素。 基本类型值数组:经过包装的数组元素。 用逗号定界的String:分割后的子字符串。 javax.servlet.jsp.jstl.sql.Result:SQL查询所获得的行。 如可以写: ~~~ <%List<String> list=new ArrayList<String>(); list.add("nqwe"); list.add("ftyu"); list.add("vfg"); request.setAttribute("list",list); %> <c:forEach var="str" items="${list}" varStatus="status"> ${status.count}:<c:out value="${str}"/><br> </c:forEach> ~~~ ![](https://box.kancloud.cn/2016-02-22_56caf9bb061a4.jpg) **整数 ** ~~~ <c:forEach var="i" begin="1" end="10" step="1"> <c:out value="${i}" />, </c:forEach><p> ~~~ **计算x的平方 ** ~~~ <table> <tr><th>Value</th> <th>Square</th></tr> <c:forEach var="x" begin="0" end="10" step="2"> <tr><td><c:out value="${x}"/></td> <td><c:out value="${x * x}"/></td></tr> </c:forEach> </table> <p> ~~~ **字符串"47,52,53,55,46,22,16,2" 分隔. ** ~~~ <table border="1"> <c:forTokens items="47,52,53,55,46,22,16,2" delims="," var="dailyPrice"> <tr><td><c:out value="${dailyPrice}"/></td></tr> </c:forTokens> </table><p> ~~~ **使用步长 ** ~~~ <table> <tr><th>second</th> <th>second</th></tr> <c:forEach var="seconds" begin="0" end="${ pageContext.session.maxInactiveInterval}" step="60"> <tr><td><c:out value="${seconds}"/></td> <td><c:out value="${seconds}"/></td></tr> </c:forEach> </table> <p> ~~~ **对数组进行循环 ** ~~~ <% int ai[] = {10, 20, 30, 40, 50}; pageContext.setAttribute("ary", ai); %> <c:forEach var="i" items="${ary}"> <c:out value="${i}"/>* </c:forEach><p> <% Cookie c=new Cookie("cookie1","one"); response.addCookie(c); %> <% Cookie cookies[]=request.getCookies(); Cookie sCookie=null; String sname=null; String name=null; if(cookies==null) // 如果没有任何cookie out.print("none any cookie"); else { //out.print(cookies.length + "<br>"); for(int i=0;i<cookies.length; i++) // 循环列出所有可用的Cookie { sCookie=cookies[i]; sname=sCookie.getName(); name = sCookie.getValue(); out.println(sname + "->" + name + "<br>"); } } %> <table border="1" align="center"> <tr><th>Cookie Name</th> <th>Cookie Value</th></tr> <c:forEach var="cook" items="${pageContext.request.cookies}"> <tr><td><c:out value="${cook.name }"/></td> <td><c:out value="${cook.value}"/></td></tr> </c:forEach> </table> <p> ~~~ **字符串数组循环 ** ~~~ <% String as[] = { "A first string", "La deuxieme string", "Ella troisiemo stringo" }; request.setAttribute("stringArray", as); %><p> <c:forEach var="string" items="${stringArray}"> <c:out value="${string}"/><br> </c:forEach> ~~~ **枚举 ** ~~~ <% Hashtable hashtable1 = new Hashtable(); pageContext.setAttribute("numberMap", hashtable1); hashtable1.put(new Integer(1), "uno"); hashtable1.put(new Integer(2), "dos"); hashtable1.put(new Integer(3), "tres"); hashtable1.put(new Integer(4), "cuatro"); hashtable1.put(new Integer(5), "cinco"); hashtable1.put(new Integer(6), "seis"); hashtable1.put(new Integer(7), "siete"); hashtable1.put(new Integer(8), "ocho"); hashtable1.put(new Integer(9), "nueve"); hashtable1.put(new Integer(10), "diez"); java.util.Enumeration enumeration = hashtable1.keys(); pageContext.setAttribute ("enumeration", enumeration); %> <c:forEach var="item" items="${enumeration}" begin="2" end="10" step="2"> <c:out value="${item}"/><br> </c:forEach><p> ~~~ map ~~~ <c:forEach var="prop" items="${numberMap}" begin="1" end="5"> <c:out value="${prop.key}"/> = <c:out value="${prop.value }"/><br> <c:out value="${prop[key]}"/> </c:forEach> ~~~ - **<c:set>使用** <c:set>标记是JSTL的setProperty动作的友好版本。标签是有用的,因为它的表达式求值,并使用结果的JavaBean或java.util.Map对象设置一个值。 **将value的值储存至范围为scope的varName变量之中** ~~~ <c:set value="value" var="varName" [scope="{ page|request|session|application }"]/> ~~~ **将本体内容的数据储存至范围为scope的varName变量之中:** ~~~ <c:set var="varName" [scope="{ page|request|session|application }"]> … 本体内容 </c:set> ~~~ **将value的值储存至target对象的属性中:** ~~~ <c:set value="value" target="target" property="propertyName" /> ~~~ **将本体内容的数据储存至target对象的属性中:** ~~~ <c:set target="target" property="propertyName"> … 本体内容 </c:set> ~~~ 它有如下属性属性描述是否必须缺省值: <table class="table-view log-set-param "><tbody><tr><td><div class="para">名 称</div></td><td><div class="para">说 明</div></td><td><div class="para">EL</div></td><td><div class="para">类型</div></td><td><div class="para">必须</div></td><td><div class="para">默认值</div></td></tr><tr><td><div class="para">value</div></td><td><div class="para">要被储存的值</div></td><td><div class="para">Y</div></td><td><div class="para">Object</div></td><td><div class="para">否</div></td><td><div class="para">无</div></td></tr><tr><td><div class="para">var</div></td><td><div class="para">欲存入的变量名称</div></td><td><div class="para">N</div></td><td><div class="para">String</div></td><td><div class="para">否</div></td><td><div class="para">无</div></td></tr><tr><td><div class="para">scope</div></td><td><div class="para">var变量的JSP范围</div></td><td><div class="para">N</div></td><td><div class="para">String</div></td><td><div class="para">否</div></td><td><div class="para">pagescope</div></td></tr><tr><td><div class="para">target</div></td><td><div class="para">为一JavaBean或java.util.Map对象</div></td><td><div class="para">Y</div></td><td><div class="para">Object</div></td><td><div class="para">否</div></td><td><div class="para">无</div></td></tr><tr><td><div class="para">property</div></td><td><div class="para">指定target对象的属性</div></td><td><div class="para">Y</div></td><td><div class="para">String</div></td><td><div class="para">否</div></td><td><div class="para">无</div></td></tr></tbody></table> 如果指定了target属性, 那么property属性也必须指定。 可以看个例子: ~~~ <c:set var="num" scope="session" value="${4000*2}"/> <c:out value="${num}"/><br> <c:set target="${user}" property="name" value="linbingwen" /> <c:out value="${user.name}"/> ~~~ 结果: ![](https://box.kancloud.cn/2016-02-22_56caf9bb14975.jpg) - **<c:remove>使用** remove标签一般和set标签配套使用,两者是相对应的,remove标签用于删除某个变量或者属性,使用格式如下: ~~~ <c:remove var=”varName” [scope=”page|request|session|application”] /> ~~~ Remove标签中使用的各属性说明如下: 1. scope : 设定这个需要删除的变量的所在范围. 2. var : 需要删除的变量或者对象属性的名称. 如果没有scope属性,即采用默认值,就相当于调用PageContext.removeAttribute(varName)方法,如果指定了这个变量所在的范围,那么系统会调用PageContext.removeAttribute(varName,scope)方法. - **<c:catch>使用** catch标签的功能和java中的try{…}catch{…}语句的功能很相似,它用于捕获嵌入到其中间语句抛出的异常,这个标签的使用格式如下: ~~~ <c:catch var=”varName”> 相关操作语句 </c:catch> --如果操作语句中出现异常,则catch会将异常保存在 varName变量中. ~~~** ** - **<c:forTokens>使用** 这个标签的作用和Java中的StringTokenizer类的作用非常相似,通过items属性来指定一个特定的字符串,然后通过delims属性指定一种分隔符(可以同时指定多个),通过指定的分隔符把items属性指定的字符串进行分组,与forEach标签一样,forTokens标签也可以指定begin和end以及step属性值. 使用格式如下: ~~~ <c:forTokens items=”stringOfTokens” delims=”delimiters” var=”varName” [varStatus=”varStatusName”] [begin=”begin”] [end=”end”] [step=”step”]> Body content </c:forTokens> ~~~ 标签中的各个属性描述如下: 1. var : 进行迭代的参数名称. 2. items : 指定的进行标签化的字符串. 3. varSatus : 每次迭代的状态信息. 4. delims : 使用这个属性指定的分隔符来分隔items指定的字符串. 5. begin : 开始迭代的位置. 6. end : 迭代结束的位置. 7. step : 迭代的步长. 例: ~~~ <c:out value="forTokens标签实例"/> <h4>使用" | " 作为分隔符</h4> <c:forTokens var="token" items="bleu,rouge|vert,jaune|blanc,rouge" delims="|"> <c:out value="${token}"/><br> </c:forTokens> <h4>使用" | , "作为分隔符</h4> <c:forTokens var="token" items="bleu,rouge|vert,jaune|blanc,rouge" delims="|,"> <c:out value="${token}"/><br> </c:forTokens> ~~~ 代码说明: delims=”|,” , 即使用”|”和”,”同时作为分隔符进行使用.如果需要更多的分隔符就是使用 “|,./” 在引号内输出. ![](https://box.kancloud.cn/2016-02-22_56caf9bb23d61.jpg) - **<c:url>使用** <c:url>标记格式化成一个字符串格式的URL,并将其存储到变量中。这个标签会在必要时自动执行URL重写。 var属性指定的变量将包含格式化的URL。 JSTL url标签只是response.encodeURL()方法的调用一个替代方法。URL标记提供的唯一的真正的优势是正确的URL编码,包括子param标签指定的任何参数。 这个标签主要用来重写url地址,使用格式如下: ~~~ <c:url value=”value” [context=”context”] [var=”varName”] [scope=”page|request|session|application”] /> ~~~ 当进行参数传递时,使用格式如下: ~~~ <c:url value=”value” [context=”context”] [var=”varName”] [scope=”page|request|session|application”] > <c:param name=”paramName” value=”value” /> </c:url> ~~~ 标签中使用的属性描述如下: value: 将要处理的URL地址. context: 当使用相对路径方法指定外部文件时,这个属性指定的是外在文件的名称. var: 给这个URL地址起一个标识. Scope: 规定这个var属性所指定变量的有效范围. - **<c:param>使用** <c:param>标签允许适当的URL请求参数并在URL中指定,它并要求任何必要的URL编码。 在<c:param>标签的name属性表示参数名称,而 value属性指示该参数值: 如下例子: ~~~ <c:url var="url" value="index2.jsp" scope="session" > <c:param name="userName" value="admin"/> <c:param name="password" value="123456"/> </c:url> <c:out value="${url}"/> ~~~ ![](https://box.kancloud.cn/2016-02-22_56caf9bb33a06.jpg) - **<c:import> 使用** 该标签用于把其他今天文件包含到该文件当中,它与传统的<jsp:include>相类似,不同的是<jsp:include>标签只能用来包括该应用中的其他文件,而<c:import>还可以包含外部站点中的静态文件,所以它的功能更加强大.使用格式如下: ~~~ <c:import url=”url” [context=”context”] [var=”varName”] [scope=”page|request|session|application”] [varReader=”varReader”] [charEncodion=”charEncoding”]> Body content </c:import> ~~~ 标签中的属性描述如下: url: 待引用静态文件的URL地址. context: 当采用相对路径访问一个外部静态文件时,这里的context指定这个外部文件的名称. var: 当使用字符串输出时,把输出的内容存储在这个var指定的变量中. scope: 指定var参数变量的有效范围. varReader: 这个属性指定的参数变量类型是Reader,可以用于读取文件的内容. charEncoding: 引入文件所采用的字符编码. Import标签即可以采用相对路径也可以采用绝对路径来引用本地点中的任何静态文件,还可以使用绝对路径引用外部站点中的静态文, 甚至可以是ftp站点中的文件,例如:<c:import var=”myurl” url=”http://www.163.com” />就是引用http://www.163.com 站点的主页面. 可以把引用文件中的内容赋值给var属性指定的变量,然后进行读取,也可以赋值给varReader指定的Reader类型的变量,然后进行相应的读取. 有时引入的文件在本地显示会出现乱码,这时可以通过charEncoding来指定这些内容所采用的字符集编码. - **<c:redirect>使用** Redirect标签用来进行页面之间的重定向,它与传统JSP程序重的<jsp:redirect>标签功能相类似,param标签是与redirect一起使用的,它用来进行参数值的传递,redirect标签的使用格式如下: ~~~ <c:redirect url=”url” [context=”context”]/> ~~~ 在redirect标签中指定param参数的使用格式如下: ~~~ <c:redirect url=”url” []context=”context”> <c:param name=”paramName” value=”value”/> </c:redirect> ~~~ 例: [通过创建c_redirect1.jsp 和 c_redirect2.jsp 两个文件说明] c_redirect1.jsp文件内容如下: ~~~ <c:redirect url=”c_redirect2.jsp” > <c:param name=”userName” value=”admin”/> </c:redirect> ~~~ c_redirect2.jsp 文件内容如下: ~~~ <body> userName=<c:out value=”${param.userName}”> </body> ~~~ c_redirect1.jsp页面文件内容不会显示,因为直接重定向到c_redirect2.jsp,重定向c_redirect2.jsp后,页面中输出 userName=admin ### 三、格式化标签 JSTL格式化标签用来格式化并输出文本、日期、时间、数字。引用格式化标签库的语法如下: ~~~ <%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %> ~~~ | 标签 | 描述 | |-----|-----| | [<fmt:formatNumber>](http://www.runoob.com/jsp/jstl-format-formatnumber-tag.html) | 使用指定的格式或精度格式化数字 | | [<fmt:parseNumber>](http://www.runoob.com/jsp/jstl-format-parsenumber-tag.html) | 解析一个代表着数字,货币或百分比的字符串 | | [<fmt:formatDate>](http://www.runoob.com/jsp/jstl-format-formatdate-tag.html) | 使用指定的风格或模式格式化日期和时间 | | [<fmt:parseDate>](http://www.runoob.com/jsp/jstl-format-parsedate-tag.html) | 解析一个代表着日期或时间的字符串 | | [<fmt:bundle>](http://www.runoob.com/jsp/jstl-format-bundle-tag.html) | 绑定资源 | | [<fmt:setLocale>](http://www.runoob.com/jsp/jstl-format-setlocale-tag.html) | 指定地区 | | [<fmt:setBundle>](http://www.runoob.com/jsp/jstl-format-setbundle-tag.html) | 绑定资源 | | [<fmt:timeZone>](http://www.runoob.com/jsp/jstl-format-timezone-tag.html) | 指定时区 | | [<fmt:setTimeZone>](http://www.runoob.com/jsp/jstl-format-settimezone-tag.html) | 指定时区 | | [<fmt:message>](http://www.runoob.com/jsp/jstl-format-message-tag.html) | 显示资源配置文件信息 | | [<fmt:requestEncoding>](http://www.runoob.com/jsp/jstl-format-requestencoding-tag.html) | 设置request的字符编码 | formatting标签库:就是用于在 JSP 页面中做国际化格式化的动作 分为了两类,分别是:                                                                                                   国际化核心标签:<fmt:setLocale>、<fmt:bundle>、<fmt:setBundle>、<fmt:message>、<fmt:param>、<fmt:requestEncoding> 格式化标签:<fmt:timeZone>、<fmt:setTimeZone>、<fmt:formatNumber>、<fmt:parseNumber>、<fmt:formatDate>、<fmt:parseDate> **1.<fmt:setLocale>标签:用于设置本地化环境 **属性描述  value:Locale 环境的指定,可以是 java.util.Locale 或 String 类型的实例  scope:Locale 环境变量的作用范围(可选)  如:   设置本地环境为繁体中文   <fmt:setLocalevalue="zh_TW"/>   设置本地环境为简体中文   <fmt:setLocalevalue="zh_CN"/> **2.<fmt:requestEncoding>标签:用于为请求设置字符编码 **它只有一个属性 value ,在该属性中可以定义字符编码。  如:   <fmt:requestEncodingvalue="GB2312"/> **3.<fmt:bundle> 、<fmt:setBundle>标签:用于资源配置文件的数据来源 **3.1<fmt:bundle>标签将资源配置文件绑定于它标签体中的显示 属性描述 basename:资源配置文件的指定,只需要指定文件名而无须扩展名 prefix:前置关键字 如: 资源文件中配置的数据为: label.backcolor=#FFF label.fontcolor=#000 则,可以用如下方法取得label的backcolor和fontcolor值:   <fmt:bundle basename="MyResourse"prefix="label.">       <fmt:message key="backcolor"/>      <fmt:message key="fontcolor"/>   </fmt:bundle> 3.2<fmt:setBundle>标签则允许将资源配置文件保存为一个变量,在之后的工作可以根据该变量来进行 属性描述 ,二组标签共有的属性  var:<fmt:setBundle>独有的属性,用于保存资源配置文件为一个变量  scope:变量的作用范围  如:    查找一个名为applicationMessage_zh_CN.properties 的资源配置文件,来作为显示的 Resource绑定   <fmt:setBundle basename="applicationMessage"var="applicationBundle"/>  **4.<fmt:message>标签:用于显示资源配置文件信息(该资源文件必须遵循如下格式:1.扩展名必须为properties,2.文件的内容必须依照key =value的格式;3.文件要放到WEB-INF/classes目录下) **属性描述  key:资源配置文件的“键”指定  bundle:若使用 <fmt:setBundle>保存了资源配置文件,该属性就可以从保存的资源配置文件中进行查找  var:将显示信息保存为一个变量  scope:变量的作用范围  如: 1)用<fmt:setBundle>标签将"applicationMessage"资源配置文件被赋于了变量"applicationBundle"   用<fmt:message>标签显示由<fmt:setBundle>标签保存的资源配置文件中"键"为"passWord"的信息          <fmt:setBundle basename="applicationMessage"var="applicationBundle"/>       <fmt:message key="passWord"bundle="${applicationBundle}" /> 2)用<fmt:bundle>标签定义的"applicationAllMessage"资源配置文件作用于其标签体内的显示   用<fmt:message>标签显示"applicationAllMessage"资源配置文件中"键"为"userName"的信息      <fmt:bundlebasename="applicationAllMessage">          <fmt:message key="userName"/>      </fmt:bundle> **5.<fmt:param 标签:用于参数传递 **<fmt:param>标签应该位于<fmt:message>标签内,将为该消息标签提供参数值。它只有一个属性value  如:在MyResourse.properties文件中,有一个索引值如下(其中,{0}代表占位符): Str2=Hi,{0}  则,使用<fmt:param>标签传入值如下:   <fmt:bundlebasename="MyResourse">       <fmt:message key="Str2">         <fmt:param value="张三" />      </fmt:message>   </fmt:bundle> 也可以在资源文件中指定参数的类型: 如:在MyResourse.properties文件中,有一个索引值如下: Str3={0,date} 则,使用<fmt:param>标签传入值如下:   <% request.setAttribute("now",new Date());%>   <fmt:bundlebasename="MyResourse">       <fmt:message key="Str3">         <fmt:param value="${now}"/>      </fmt:message>   </fmt:bundle> **6.<fmt:timeZone>、<fmt:setTimeZone>标签:用于设定时区 **<fmt:timeZone>标签将使得在其标签体内的工作可以使用该时区设置 <fmt:setTimeZone>标签则允许将时区设置保存为一个变量,在之后的工作可以根据该变量来进行 属性描述  value:时区的设置  var:<fmt:setTimeZone>独有的属性,用于保存时区为一个变量  scope:变量的作用范围  **7.<fmt:formatNumber>标签:用于格式化数字 **属性描述  value:格式化的数字,该数值可以是 String 类型或 java.lang.Number 类型的实例  type:格式化的类型,可能值包括:currency(货币)、number(数字)和percent(百分比) pattern:格式化模式  var:结果保存变量  scope:变量的作用范围  maxIntegerDigits:指定格式化结果的最大值  minIntegerDigits:指定格式化结果的最小值  maxFractionDigits:指定格式化结果的最大值,带小数  minFractionDigits:指定格式化结果的最小值,带小数  如:    结果将被保存在“money ”变量中,将根据 Locale 环境显示当地的货币格式      <fmt:formatNumber value="1000.888" type="currency"var="money"/> **8.<fmt:parseNumber>标签:用于解析数字 **属性描述  value:将被解析的字符串  type:解析格式化的类型  pattern:解析格式化模式  var:结果保存变量,类型为 java.lang.Number  scope:变量的作用范围  parseLocale:以本地化的形式来解析字符串,该属性的内容应为 String 或 java.util.Locale类型的实例  如:   将"15%"转换为数字      <fmt:parseNumber value="15%" type="percent"var="num"/>