Jstl之核心标签库与格式标签库使用
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/
standard.jar下载地址:
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> | 用于在JSP中显示数据,就像<%= ... > |
<c:set> | 用于保存数据 |
<c:remove> | 用于删除数据 |
<c:catch> | 用来处理产生错误的异常状况,而且将错误信息储存起来 |
<c:if> | 与我们在一般程序中用的if一样 |
<c:choose> | 本身仅仅当做<c:when>和<c:otherwise>的父标签 |
<c:when> | <c:choose>的子标签,用来推断条件是否成立 |
<c:otherwise> | <c:choose>的子标签。接在<c:when>标签后,当<c:when>标签推断为false时被运行 |
<c:import> | 检索一个绝对或相对 URL,然后将其内容暴露给页面 |
<c:forEach> | 基础迭代标签。接受多种集合类型 |
<c:forTokens> | 依据指定的分隔符来分隔内容并迭代输出 |
<c:param> | 用来给包括或重定向的页面传递參数 |
<c:redirect> | 重定向至一个新的URL. |
<c:url> | 使用可选的查询參数来创造一个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>
运行结果:
- <c:choose>使用
<c:choose>用于条件选择,他和<c:when><c:otherwise>一起使用,他们仅仅能组合在一起使用<c:when>代表了<c:choose>的一个条件分支,他必须以<c:choose>作为他的父标签
他必须在<c:otherwise>之前出现,仅仅要遵寻这两个规则,使用起来非常easy,以下给出代码:
<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>
运行结果:
- <c:forEach>
<c:foreach>相似于for和foreach循环
<c:forEach>标签用于通用数据循环,它有以下属性
属 性 | 描 述 | 是否必须 | 缺省值 |
items | 进行循环的项目 | 否 | 无 |
begin | 開始条件 | 否 | 0 |
end | 结束条件 | 否 | 集合中的最后一个项目 |
step | 步长 | 否 | 1 |
var | 代表当前项目的变量名 | 否 | 无 |
varStatus | 显示循环状态的变量 | 否 | 无 |
<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>
<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对象设置一个值。
<c:set value="value" var="varName" [scope="{ page|request|session|application }"]/>
<c:set var="varName" [scope="{ page|request|session|application }"]> … 本体内容 </c:set>
将value的值储存至target对象的属性中:
<c:set value="value" target="target" property="propertyName" />
<c:set target="target" property="propertyName"> … 本体内容 </c:set>
名 称 | 说 明 | EL | 类型 | 必须 | 默认值 |
value | 要被储存的值 | Y | Object | 否 | 无 |
var | 欲存入的变量名称 | N | String | 否 | 无 |
scope | var变量的JSP范围 | N | String | 否 | pagescope |
target | 为一JavaBean或java.util.Map对象 | Y | Object | 否 | 无 |
property | 指定target对象的属性 | Y | String | 否 | 无 |
能够看个样例:
<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}"/>
结果:
- <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=”|,” , 即使用”|”和”,”同一时候作为分隔符进行使用.假设须要很多其它的分隔符就是使用 “|,./” 在引號内输出.
- <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}"/>
- <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> | 使用指定的格式或精度格式化数字 |
<fmt:parseNumber> | 解析一个代表着数字。货币或百分比的字符串 |
<fmt:formatDate> | 使用指定的风格或模式格式化日期和时间 |
<fmt:parseDate> | 解析一个代表着日期或时间的字符串 |
<fmt:bundle> | 绑定资源 |
<fmt:setLocale> | 指定地区 |
<fmt:setBundle> | 绑定资源 |
<fmt:timeZone> | 指定时区 |
<fmt:setTimeZone> | 指定时区 |
<fmt:message> | 显示资源配置文件信息 |
<fmt:requestEncoding> | 设置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 环境变量的作用范围(可选)
如:
2.<fmt:requestEncoding>标签:用于为请求设置字符编码
它仅仅有一个属性 value ,在该属性中能够定义字符编码。
如:
3.<fmt:bundle> 、<fmt:setBundle>标签:用于资源配置文件的数据来源
3.1<fmt:bundle>标签将资源配置文件绑定于它标签体中的显示
属性描写叙述
basename:资源配置文件的指定,仅仅须要指定文件名称而无须扩展名
prefix:前置keyword
如:
资源文件里配置的数据为:
label.backcolor=#FFF
label.fontcolor=#000
则,能够用例如以下方法取得label的backcolor和fontcolor值:
3.2<fmt:setBundle>标签则同意将资源配置文件保存为一个变量,在之后的工作能够依据该变量来进行
属性描写叙述 ,二组标签共同拥有的属性
var:<fmt:setBundle>独有的属性。用于保存资源配置文件为一个变量
scope:变量的作用范围
如:
4.<fmt:message>标签:用于显示资源配置文件信息(该资源文件必须遵循例如以下格式:1.扩展名必须为properties,2.文件的内容必须按照key =value的格式;3.文件要放到WEB-INF/classes文件夹下)
属性描写叙述
key:资源配置文件的“键”指定
bundle:若使用 <fmt:setBundle>保存了资源配置文件。该属性就能够从保存的资源配置文件里进行查找
var:将显示信息保存为一个变量
scope:变量的作用范围
如:
1)用<fmt:setBundle>标签将"applicationMessage"资源配置文件被赋于了变量"applicationBundle"
2)用<fmt:bundle>标签定义的"applicationAllMessage"资源配置文件作用于其标签体内的显示
5.<fmt:param 标签:用于參数传递
<fmt:param>标签应该位于<fmt:message>标签内,将为该消息标签提供參数值。它仅仅有一个属性value
如:在MyResourse.properties文件里,有一个索引值例如以下(当中,{0}代表占位符):
Str2=Hi,{0}
则,使用<fmt:param>标签传入值例如以下:
也能够在资源文件里指定參数的类型:
如:在MyResourse.properties文件里,有一个索引值例如以下:
Str3={0,date}
则,使用<fmt:param>标签传入值例如以下:
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:指定格式化结果的最小值,带小数
如:
8.<fmt:parseNumber>标签:用于解析数字
属性描写叙述
value:将被解析的字符串
type:解析格式化的类型
pattern:解析格式化模式
var:结果保存变量,类型为 java.lang.Number
scope:变量的作用范围
parseLocale:以本地化的形式来解析字符串,该属性的内容应为 String 或 java.util.Locale类型的实例
如: