整体概览:
jstl 标签库,按其功能划分,有以下五大类标签:核心标签库(core),xml标签库,国际化标签库(i18n),sql 标签库,函数标签库(fn),其相关的 uri 和前缀如下,
uri 和 前缀如下表:
标签库 | uri | prefix |
Core | http://java.sun.com/jsp/jstl/core | c |
XML | http://java.sun.com/jsp/jstl/xml | x |
I18N(国际化) | http://java.sun.com/jsp/jstl/fmt | fmt |
SQL | http://java.sun.com/jsp/jstl/sql | sql |
Functions | http://java.sun.com/jsp/jstl/functions | fn |
另外对于各个标签能实现的功能,简略如下:
标签 | core | xml | i18n | sql | functions |
子功能 | 1、操作变量 2、流程控制 3、操作 url 4、其他 |
1、核心 2、流程控制 3、字符转换 |
1、本地化 2、格式化信息 3、数据日期的格式化 |
1、database(sql) | 1、集合的长度 2、操作字符串 |
在使用各种标签之前,要加上指令标签 taglib,<%@ taglib uri="..." prefix="..." %>,如 core 标签的使用:
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
这一次主要谈一下如何使用 jstl 里 core 标签,其他的标签的使用将会后续谈到。
一、core 标签的概览
core 标签库里有 13 个标签,根据其功能来划分,可以划分为下面几类:
子功能 | 标签 |
操作变量 |
remove set |
流程控制 |
choose when otherwise forEach forTokes if |
操作 url |
import param redirect param url param |
其他 |
catch out |
下面具体谈一下各类子功能标签的使用
二、core 标签——操作变量
<c:set> 用于将变量存储在 JSP 内或 javaBean 属性里。<c:set> 的各种属性介绍如下:
属性名 | 必需? | 数据类型 | 描述 |
var | false | java.lang.String |
变量名 |
value | false | java.lang.String |
赋值 var 的值 |
target | false | java.lang.String |
目标对象,必须是一个 javaBean 对象或 java.util.Map 对象 |
property | false | java.lang.String |
属性名(目标对象必须有对应的setXxx()方法 |
scope | false | java.lang.String |
作用域,默认为 page |
Demo如下:
//示例如下
<c:set value="张三" var="name" scope="session"></c:set>
<c:set var="name" scope="session">李四</c:set>
<c:set value="赵五" target="${person}" property="name"></c:set>
<c:set target="${person}" property="age">19</c:set>
对应的看一下<c:remove> 标签,其作用刚好和<c:set>相反,用来删除某作用域内的一个变量。<c:remove>各种属性描述如下:
属性名 | 必须? | 数据类型 | 描述 |
var | true | java.lang.String |
变量名 |
scope | false | java.lang.String |
作用域 |
Demo:
二、core 标签 —— 流程控制
1、<c:if> 标签,其功能就像java 里的 if 语句,使用方法如下,<c:if>各属性描述如下表:
<c:if test="条件表达式" var="name" [scope="page|request|session|application"]></c:if>
属性名 | 必须? | 数据类型 | 描述 |
test | true | boolean |
条件判断语句,为true 时执行标签体中的代码 |
var | false | java.lang.String |
保存条件表达结果的变量名,类型为 Boolean |
scope | false | java.lang.String |
作用域 |
Demo:
<c:if test="${person.name == '张四'}">
<c:set var="name" value="张三"/>
...
</c:if>
2、<c:choose>、<c:when> 和 <c:otherwise>,这三个标签用于排他性选择判断,类似于 java 里的 switch 语句。使用方法如下,各属性的描述如下表:
<c:choose>
<c:when test="条件表达式1" >
...
</c:when>
<c:when test="条件表达式2" >
...
</c:when>
<c:when test="条件表达式3" >
...
</c:when>
<c:otherwise>
...//以上表达式都不成里时执行的语句
</c:otherwise>
</c:choose>
(1)<c:choose> ,<c:otherwise>内没有任何属性
<c:when> | ||||
属性名 | 必须? | 数据类型 | 描述 | |
test | true | boolean |
当条件表达式为 true 时,才执行标签体的代码块 |
Demo:
<c:choose>
<c:when test="${person.name == ’张三’}" >
我的名字叫 张三。
</c:when>
<c:when test="${person.name == ’李四’}" >
...
</c:when>
<c:when test="${person.name == ’王五’}" >
...
</c:when>
<c:otherwise>
...
</c:otherwise>
</c:choose>
3、<c:forEach> 和 <c:forTokens> 都是用于迭代和循环遍历。当中<c:forEach> 有以下两种使用方式:
(1)知道具体的循环次数,类似于java 里的for 循环。可以用以下方式
<c:forEach begin="begin" end="end" [var="varName"] [varStatus="varStatusName"][step="step"]>
<!-- 标签体 -->
</c:forEach>
(2)不知道具体迭代的次数,可以用以下方式,类似于 java 里的 foreach 循环:
<c:forEach begin="begin" end="end" [var="varName"] [varStatus="varStatusName"][step="step"]>
<!-- 标签体 -->
</c:forEach>
<c:forEach>各属性的描述如下:
属性名 | 必须? | 数据类型 | 描述 |
items | false | java.lang.Object |
要进行迭代的 Collection 对象 |
begin | false | int |
如果指定了属性“items”,则从items 的索引为 begin 的元素开始迭代;如果没有指定items,则以begin 作为迭代的初始索引, |
end | false | int |
如果指定了属性“items”,则迭代到 items 的索引为 end 的元素;如果没有指定items,则以end作为迭代的终止索引, |
step | false | int |
迭代的步长 |
var | false | java.lang.String |
在第一种使用方式里指当前迭代迭代对象的索引值;在第二种使用方式了,指当前迭代的对象。 |
varStatus | false | java.lang.String |
代表迭代的状态,可用来访问迭代自身的信息,是javax.servlet.jsp.jstl.core.LoopTagStatus 对象。 |
Demo:
<c:forEach var="people" items="${sessionScope.peoples}">
...
<c:out value="${people.name}" />
...
</c:forEach>
现在在来谈以下<c:forTokens>,其作用与<c:foreach>很相似,不同的是在 <c:forToken> 还有一个属性“delims”,进行分隔的点,示例如下:
<c:forTokens items="Zara,nuha,roshy" delims="," var="name">
<c:out value="${name}"/>
</c:forTokens>
输出如下:Zara nuha roshy
三、core 便签 —— 操作 url
在 JSP 里,<c:import><c:url><c:redirect><c:param>可实现 url 资源的连接。导入、重定向等处理。
1、<c:import> 把其他静态或动态文件包含到 JSP 页面。与<jsp:include>的区别是后者只能包含同一个web应用中的文件,前者可以包含其他web应用中的文件,甚至是网络上的资源。语法格式如下:
<c:import url="url" [context="context"] [var="varName"] [scope="{page|request|session|application}"] [charEncoding="charEncoding"]>
各属性的描述如下:
属性名 | 必须? | 数据类型 | 描述 |
url | true | java.lang.String |
待导入资源的URL |
var | false | java.lang.String |
存放资源内容的变量(String) |
scope | false | java.lang.String |
作用域,默认是 page |
varReader | false | java.lang.String |
用于读取资源,其参数类型是reader |
context | false | java.lang.String |
当使用相对路径访问外部context资源时,context指定了这个资源的名字。 |
charEncoding | false | java.lang.String |
资源的字符编码 |
主要有以下两种用法:
(1)资源的内容使用String对象向外暴露,意思是把文件内容以String 类型存入指定的变量 var。
<c:import url="url" [context="context"] [var="varName"] [scope="{page|request|session|application}"] [charEncoding="charEncoding"]>
<c:param name="name" value="value">
</c:import>
(2)资源的内容使用Reader对象向外暴露。
<c:import url="url" [context="context"] varReader="varReaderName" [charEncoding="charEncoding"]>
<c:param name="name" value="value">
</c:import>
Demo:
<c:import url="http://www.baidu.com" var="data"/>
<!-- 加上下面这一行,会输出html 代码 -->
<c:out value="${data }"></c:out>
2、<c:redirect> 该标签用来实现请求的重定向。例如,对用户输入的用户名和密码进行验证,不成功则重定向到登录页面。或者实现Web应用不同模块之间的衔接,用法如下:
<c:redirect url="url" [context="context"]>
<c:param name="name" value="value">
</c:redirect>
各属性描述如下:
属性名 | 必须? | 数据类型 | 描述 |
url | false | java.lang.String |
要被导向的资源的 url |
context | false | java.lang.String |
当使用相对路径访问外部context资源时,context指定了这个资源的名字。 |
Demo:
<c:redirect url="login.jsp">
<c:param name="username">yelang</c:param>
<c:param name="password">123456</c:param>
</c:redirect>
3、<c:url> 用于动态生成一个 String 类型的URL,可以同<c:redirect>标签共同使用,也可以使用HTML的<a>标签实验超链接。语法如下:
<c:url value="value" [var="name"] [scope="..."] [context="context"]>
<c:param name="name" value="value">
</c:url>
各属性描述如下:
属性名 | 必须? | 数据类型 | 描述 |
var | false | java.lang.String |
存放 url 的字符串变量 |
scope | false | java.lang.String |
作用域 |
value | false | java.lang.String |
被处理的 url |
context | false | java.lang.String |
当使用相对路径访问外部context资源时,context指定了这个资源的名字。 |
Demo:
<h4>使用url标签生成一个动态的url,并把值存入session中.</h4>
<c:url value="/login.jsp" var="url" scope="session" />
<a href="${url}">首页
最后补充一下,在<c:redirect><c:url><c:impot> 的标签体内都可以使用 <c:param>,其作用都是一样的,就是向导入的 url 传入参数,例如在重定向至登录页面时,可传入用户名和密码(参数),当然实际情况我们很少会这样做。现在了解一下<c:param>的用法和属性,
<c:param name="name" value="value">
属性名 | 必须? | 数据类型 | 描述 |
name | true | java.lang.String |
参数名 |
value | false | java.lang.String |
参数的值 |
四、core 便签 —— 其他 catch 和 out
<c:out> 用来显示数据对象(字符串、表达式、文本、session变量等)的内容或结果,等同于使用Java脚本:<% out.println("hello") %> <% =表达式 %>。<c:out>语法格式如下:
<c:out value="value" [escapeXml="{true|false}"] [default="defaultValue"] />
各属性描述如下:
属性名 | 必须? | 数据类型 | 描述 |
value | true | java.lang.String |
标签输出的值,可以是常量、变量、表达式或 el 表达式 |
default | false | java.lang.String |
默认值 |
escapeXml | false | java.lang.String |
是否转换特殊字符,默认为 true |
字符转换规则如下:
字符 | 转换后的实体代码 |
< | < |
> | > |
' | '; |
" | "; |
& | & |
Demo :
<c:out value="2 < 5" escapeXml="false" default="默认值" />
//输出:2 < 5
<c:out value="2 < 5" escapeXml="true" default="默认值" />
//输出: 2 < 5
2、<c:catch>主要用来处理产生错误的异常状况,并且将异常信息储存起来。使用格式如下:
<c:catch [var="varName"] >
… 欲抓取错误的部分
</c:catch>
属性描述如下:
属性名 | 必须? | 数据类型 | 描述 |
var | false | java.lang.String |
用来储存异常信息的变量。 |
Demo:
<c:catch var="error_Message">
<%
String eFormat = "not number";
int i = Integer.parseInt(eFormat);
%>
</c:catch>
<c:out value="${error_Message}" />