JAVA标签库JSTL-EL表达式介绍使用配置手册Java JSTL 2010-09-18 15:40:36 阅读227 评论4 字号:大中小 订阅 JSP 标准标记库(JSP Standard Tag Library,JSTL)是一个实现 Web 应用程序中常见的通用功能的定制标记库集,这些功能包括迭代和条件判断、数据管理格式化、XML 操作以及数据库访问。 JSTL是一个不断完善的开放源代码的JSP标签库,是由apache的jakarta小组来维护的。JSTL只能运行在支持JSP1.2和Servlet2.3规范的容器上,如tomcat 4.x。但是在即将推出的JSP 2.0中是作为标准支持的。JSTL目前的最新版本为1.02,最终发布版为1.0。JSTL包含两个部分:标签库和EL( Language表达式语言)语言。标签库目前支持四种标签:
Core支持JSP中的一些基本的操作; XML processing支持XML文档的处理; I18N capable formatting支持对JSP页面的国际化; Database access (SQL)支持JSP对数据库的操作。
版本 要注意1.0.x和1.1.x两个版本,目前最新版分别为1.0.6和1.1.2 1.1版比1.0版多了fn标签库(常用的字符串操作在里面,特别是length、substring、等用于显示的函数) 各个版本都可以在apache网站下载得到 使用中注意的问题 在仅支持JSP1.2规范的容器中,只能使用jstl 1.0版,所以fn就不能用了,很不爽。${1 + 2}必面都要写在<c:out value='${1 + 2}' />里。在支持JSP2.0规范的容器中,可以直接使用el表达式。 一些BUG 在websphere 6.0(6.0.2.13版以前)中,有fn:length函数的BUG。只有打补丁了。 在websphere 中,如<c:out value='${var == 0 ? "非" : "是" }' />这样的句子会出问题,tomcat下刚运行很好。应该是:jstl只是一个规范,各个web容器对其实现不同的原因吧。
一 JSTL使用配置总结1.web.xml版本为2.3版本的配置引用文档:http://blog.csdn.net/tiancaoyan/archive/2009/06/10/4256637.aspx 使用环境: WebLogic92 + JDK1.5,web.xml版本为2.3, 文件是如下表示: <!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java./dtd/web-app_2_3.dtd"> 使用步骤: l 拷贝jstl.jar,standard.jar文件到Web-INF/lib目录下 l 在引用JSP页面加上: <%@ taglib uri="http://java./jsp/jstl/core" prefix="c"%> l 如web.xml版本为2.3,还要在加上: <%@ page isELIgnored="false"%> 2 web.xml版本为2.4的配置<web-app version="2.4" xmlns="http://java./xml/ns/j2ee" xmlns:xsi="http://www./2001/XMLSchema-instance" xsi:schemaLocation="http://java./xml/ns/j2ee http://java./xml/ns/j2ee/web-app_2_4.xsd"> l 拷贝jstl.jar,standard.jar文件到Web-INF/lib目录下 l 在引用JSP页面加上: <%@ taglib uri="http://java./jsp/jstl/core" prefix="c"%> 3 web.xml版本为2.5的配置在J2EE5.0中已经将JSTL纳入标准规范,将jstl.jar,standard.jar二个jar文件合并为jstl1.2.jar. <web-app version="2.5" xmlns="http://java./xml/ns/javaee" xmlns:xsi="http://www./2001/XMLSchema-instance" xsi:schemaLocation="http://java./xml/ns/javaee http://java./xml/ns/javaee/web-app_2_5.xsd"> l 在引用JSP页面加上: <%@ taglib uri="http://java./jsp/jstl/core" prefix="c"%> 以上的web.xml各个版本在Tomcat6.0.24下也能正常显示. 二 JSTL使用示例JSTL获取值范围. 引用文档:http://blog.csdn.net/tiancaoyan/archive/2009/06/10/4256637.aspx 一个EL表达式包含变量和操作符。任何存储在某个JSP作用范围(如:page、 request、session、application)的bean能被作为一个EL变量来使用。另外,EL支持以下预定义的变量:
操作符描述了你对变量所期望的操作。如果你之前曾经使用过任何编程语言的话,在EL表达式中所使用的操作符对你来说可能看起来很熟悉。因为它们和那些在大多数语言中所支持的操作符一样。 . 访问一个bean属性或者 Map entry [] 访问一个数组或者链表元素 () 对子表达式分组,用来改变赋值顺序 : 条件语句,比如: 条件 ifTrue : ifFalse.如果条件为真,表达式值为前者,反之为后者 + 数学运算符,加操作 - 数学运算符,减操作或者对一个值取反 * 数学运算符,乘操作
/ or div 数学运算符,除操作 % or mod 数学运算符,模操作(取余) == or eq 逻辑运算符,判断符号左右两端是否相等,如果相等返回true,否则返回false != or ne 逻辑运算符,判断符号左右两端是否不相等,如果不相等返回true,否则返回false < or lt 逻辑运算符,判断符号左边是否小于右边,如果小于返回true,否则返回false
> or gt 逻辑运算符,判断符号左边是否大于右边,如果大于返回true,否则返回false <= or le 逻辑运算符,判断符号左边是否小于或者等于右边,如果小于或者等于返回true,否则返回false >= or ge 逻辑运算符,判断符号左边是否大于或者等于右边,如果大于或者等于返回true,否则返回false && or and 逻辑运算符,与操作赋。如果左右两边同为true返回true,否则返回false || or or 逻辑运算符,或操作赋。如果左右两边有任何一边为true返回true,否则返回false ! or not 逻辑运算符,非操作赋。如果对true取运算返回false,否则返回true empty 用来对一个空变量值进行判断: null、一个空String、空数组、空Map、没有条目的Collection集合 func(args) 调用方法, func是方法名,args是参数,可以没有,或者有一个、多个参数.参数间用逗号隔开 一个EL表达式可以包含:数字、文本(在单引号或者双引号之间)、布尔值、null值。 1 获取单个对象 <%request.setAttribute(“username”,”david”)%> ${requestScope.userName} 2遍历Map类型 <% Hashtable hashtable1 = new Hashtable(); hashtable1.put(new Integer(1), "uno"); hashtable1.put(new Integer(2), "dos"); hashtable1.put(new Integer(3), "tres"); request.setAttribute("numberMap", hashtable1); //JSTL最好指定范围访问值: // ${sessionScope. numberMap2},${ applicationScope. numberMap2}. request.getSession().setAttribute("numberMap2",hashtable1); request.getSession() .getServletContext().setAttribute("numberMap3",hashtable1);
%> <c:forEach var="month" items="${numberMap}"> <li>
${month.key}, ${month.value} </li> </c:forEach>
各JSTL相关引用标记 <%@ taglib uri="http://java./jsp/jstl/core" prefix="c"%> <%@ taglib uri="http://java./jsp/jstl/xml" prefix="x"%> <%@ taglib uri="http://java./jsp/jstl/fmt" prefix="f"%> <%@ taglib uri="http://java./jsp/jstl/sql" prefix="sql"%> <%@ taglib uri="http://java./jsp/jstl/functions" prefix="fn"%>
下面介绍一下web.xml的配置 <?xml version="1.0" encoding="UTF-8"?>
JSTL语法及参数详解 JSTL语法及参数 JSTL包含以下的标签: 常用的标签:如<c:out>、<c:remove>、<c:catch>、<c:set>等
一般用途的标签: 1.<c:out> 没有Body时的语法 <c:out value=”value” [escapeXml=”{true|false}”] [default=”defaultValue”]/> 有Body时的语法 <c:out value=”value” [escapeXml=”{true|false}”]> 这里是Body部分 </c:out>
value Object 将要输出的表达式 escapeXml boolean 确定以下字符:<,>,&,’,”在字符串中是否被除数,默认为true default Object 如果vaule计算后的结果是null,那么输出这个默认值
这个标签用于在某个范围(page、request、session、application等)中使用某个名字设定特定的值,或者设定某个已经存在的javabean对象的属性。他类似于<%request.setAttrbute(“name”,”value”);%> 语法1:使用value属性设定一个特定范围中的属性。 <c:set value=”value” var=”varName” [scope=”{page|request|session|application}”]/> 语法2:使用value属性设定一个特定范围中的属性,并带有一个Body。 <c:set var=”varName” [scope=”{page|request|session|application}”]> Body部分 </c:set> 语法3:设置某个特定对象的一个属性。 <c:set value=”value” target=”target” property=”propertyName”/> 语法4:设置某个特定对象的一个属性,并带有一个Body。 <c:set target=”target” property=”propertyName”> Body部分 </c:set>
value Object 将要计算的表到式。 var String 用于表示value 值的属性,如果要在其他标签中使用,就是通过这 个var指定的值来进行的。它相当于在标签定义了一个变量,并且这个变量只能在标签中的一个。 scope String var的有效范围,可以是page|request|session|application中的一个 target String 将要设置属性的对象,它必须是javabean或则java.util.Map对象 property Object 待设定的Target对象中的属性名字,比如在javabean中有个name属性,提供了setUserId方法,那么这里填userId。
<c:remove var=”varName” [scope=”{page|request|session|application}”]/>
这个标签相当于捕获在它里边的标签抛出的异常对象 <c:catch [var=”varName”]> //var是异常的名字 内容 </c:catch>
1. <c:if> 语法1:无Body情况 <c:if test=”testCondition” var=”varName” [scope=”page|request|session|application”]/> 语法2:有Body的情况 <c:if test=”testCondition” var=”varName” [scope=”page|request|session|application”]> Body内容 </c:if>
test Boolean 表达式的条件,相当于if()中的条件判断语句。 var String 表示这个语句的名字。 scope String var这个变量的作用范围。
语法:<c:choose> Body内容(<c:when>和<c:otherwise>子标签) </c:choose> 注意:它的Body只能由以下元素组成: 1) 空格 2) 0或多个<c:when>子标签,<c:when>必须在<c:otherwise>标签之前出现. 3) 0个或多个<c:otherwise>子标签。
代表的是<c:choose>的一个条件分支,只能在<c:choose>中使用 语法:<c:when test=”testCondition”> //test是boolean类型,用于判断条件真假 Body语句 </c:when>
代表的是<c:choose>中的最后选择。必须在最后出现 <c:otherwise> 内容 </c:otherwise>
1.<c:forEach> 语法1:在Collection中迭代 <c:forEach[var=”varName”] items=”collection” [varStatus=”varStatusName”] [begin=”begin”] [end=”end”] [step=”step”] Body内容 </c:foeEach>
<c:forEach [var=”varName”] [varStatus=”varStatusName”] [begin=”begin”] [end=”end”] [step=”step”] Body内容 </c:foeEach>
var String 迭代的参数,它是标签参数,在其他标签中通过它来引用这个标签中的内容。 Items Collection、ArrayList、 要迭代的items集合. Iterator、Map、String、 Eunmeration等 VarStatus String 表示迭代的状态,可以访问迭代自身的信息 Begin int 表示开始迭代的位置。 End int 表示结束迭代的位置。 Step int 表示迭代移动的步长,默认为1。
1.<c:import> 语法1:资源的内容使用String对象向外暴露 <c:import url=”url” [context=”context”] [var=”varName”] [scope=”{page|request|session|application}”] [charEncoding=”charEncoding”]> 内容 </c:import>
<c:import url=”url” [context=”context”] varReader=”varReaderName” [charEncoding=”charEncoding”]> 内容 </c:import> 名字 类型 描述 url String 待导入资源的URL,可以是相对路径和绝对路径,并且可以导入其他主机资源 context String 当使用相对路径访问外部context资源时,context指定了这个资源的名字。 var String 参数的名字。 scope String var参数的作用范围。 cahrEncoding String 输入资源的字符编码。 varReader String 这个参数的类型是Reader,用于读取资源。
语法1:没有Body的情况. <c:redirect url=”value” [context=”context”]/> 语法2:有Body情况下,在Body中指定查询的参数 <c:redirect url=”value” [context=”context”]> <c:param name=”name” value=”value”/> </c:redirect>
语法1:没有Body <c:url value=”value” [context=”context”] [var=”varName”] [scope=”{page|request|session+application}”]/> 语法2:有Body <c:url value=”value” [context=”context”] [var=”varName”] [scope=”{page|request|session+application}”]> <c:param name=”name” value=”value”/> </c:url>
value String URL值 context String 当使用相对路径访问外部context资源时,context指定了这个资源的名字 var String 标识这个URL标量。 Scope String 变量作用范围。
1.<sql:setDataSource> 2.<sql:query> 3.<sql:update> 4.<transaction> 5.<param>
jstl之foreach循环举例: <%@ page contentType="text/html; charset=GBK" %>
<%@ page import="java.util.*" %> <%@ taglib uri="http://java./jstl/core" prefix="c" %> <html> <head> <title>JSTL测试1--c:forEach循环</title> </head> <body> 一、整数 <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> 五、对数组进行循环<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<p> <c:forEach var="prop" items="${numberMap}" begin="1" end="5"> <c:out value="${prop.key}"/> = <c:out value="${prop.value}"/><br> </c:forEach> </body> </html> |
|