什么是JSTL
JSTL 是什么:Java ServerPages Standard Tag Library 标准标签库 (JSTL) 包含的各种标签可用于JSP 页面中。
为什么要用JSTL:可以编写没有java代码的jsp页面。使JSP页面很容易被WEB设计人员理解,表达更清晰。减少程序出错,使程序容易维护。
JSTL标签库的使用是为类弥补html表的不足,规范自定义标签的使用而诞生的。在告别modle1模式开发应用程序后,人们开始注重软件的分层设计,不希望在jsp页面中出现java逻辑代码,同时也由于自定义标签的开发难度较大和不利于技术标准化产生了自定义标签库。
JSTL标签库可分为5类:
1.核心标签库: 为日常任务提供通用支持,如显示和设置变量,重复使用一组项目,测试条件以及其他操作(如导入和重定向web页面等).
2.国际化(I18N)标签库: 支持多种语言的引用程序.
3.SQL标签库: 对访问和修改数据库提供标准化支持.
4.XML标签库: 对XML文件处理和操作提供支持,包括XML节点的解析,迭代,基于XML数据的条件评估以及可扩展样式语言转换(Extensible Style Language Transformations , XSLT)的执行.
5.函数标签库: 通过在EL表达式中调用函数标签库中的函数来实现特定的操作,例如: ${fn:contains(sring,substring)},其功能是判断string字符串中是否包含substring字符串.
安装JSTL
JSTL 库安装
Apache Tomcat安装JSTL 库步骤如下:
从Apache的标准标签库中下载的二进包(jakarta-taglibs-standard-current.zip)。
官方下载地址:
http://archive.apache.org/dist/jakarta/taglibs/standard/binaries/
下载jakarta-taglibs-standard-1.1.2.zip包并解压,
将jakarta-taglibs-standard-1.1.2/lib/下的两个jar文件:standard.jar和jstl.jar文件拷贝到/WEB-INF/lib/下。
standard.jar(下载附件 384.04 KB)
jstl.jar(下载附件 20.2 KB)
out标签
核心标签库中最为基本的标签就是,他可以在页面中显示一个字符串或者一个EL表达式的值,其功能与JSP中的<%= 表达式%>类似
使用格式如下:
<c: out value=”object”[escapeXml=”true|false”] />
这个标签还可以有一个体,如下:
<c:out value=”object” [escapeXml=”true|false”] >defalut value</c:out>
这表示当value属性指定的object值为null时,就会显示体中指定的值,也就是default value的值,体中也可以是jsp代码.
中各属性的说明如下:
(1) value : 可以指定一个字符串作为输出内容,也可以指定为EL表达式,例如:${3+5}.
(2) escapeXml : 类型为boolean , 确定 , < , > , & , ‘ , “ 等字符在结构的字符串中是否被转换成字符串实体代码,默认值是true(就是是否按html中的样式进行输出,设置true就是按照字符串原样进行输出,false就是按照html标识符进行输出)
(3) default value : 可以是字符串,也可以是一个EL表达式或者jsp表达式,如果属性(value)指定的表达式或者对象为null,那么将输出这个defalut value部分的值.
例8-2 c_out1.jsp
<body>
username的属性值为:
<c:out value="${param.username }" default="unknown"/><br>
username 的属性值为:
<c:out value="${param.username }">unknown</c:out>
</body>
例 8-3 使用<c:out>标签的escapeXml属性对特殊字符进行转义>`标签的escapeXml属性对特殊字符进行转义>标签的escapeXml属性对特殊字符进行转义
<c:out>标签有一个重要的属性escapeXml,该属性可以将特殊的字符进行HTML编码转换后再输出。比如,将会把它作为普通字符输出,如果想把它当作javascript代码输出,则把escapeXml设置为false
c_out2.jsp
<%@ page language="java"import="java.util.*"pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core"prefix="c"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTDHTML 4.01 Transitional//EN">
<html>
<head>
</head>
<body>
<c:out value="${param.username }" escapeXml="false">
<meta http-equiv="refresh" content="0;url=http://www.itcast.cn"/>
</c:out>
</body>
</html>
set标签
set标签用来在某个范围(request,session或者application)内设置值,或者设置某个对象的属性值.
Set标签使用格式如下:
(1)使用value 属性在一个特定的范围内指定某个变量的值,其使用格式如下:
<c:set var=”varName” value=”varValue” [scope=”page|request|session|application”]/>
(2)当使用value属性在一个特定范围内指定某各变量的值时,也可以包括一个标签体,他的作用与out标签体的作用一样,即value指定的值为null时,默认使用体中指定的值,使用的格式如下:
<c:set var=”varName” value=”varValue” [scope=”page|request|session|application”]>
defaultvalue
</c:set>
例 c_set1.jsp
<body>
session域中username属性的值为:
<c:set var="username" value="itcast" scope="session"/>
<c:out value="${username }"></c:out><hr>
session域中bookName属性的值为:
<c:set var="bookname" scope="session">
Java Web
</c:set>
<c:out value="${bookname }"></c:out>
</body>
(3)设置某一个特定对象属性的使用格式如下:
<c:set property=”propertyName” target=”target” value=”value”/>
(4)在设置某个特定对象的一个属性时,也可以使用一个标签体,并且指定默认的值,使用格式如下:
<c:setproperty=”propertyName” target=”target” value=”value”>
defaultvalue
</c:set>
该标签中的各属性说明如下:
-
value : 该属性指定变量或者对象中某个属性的值,并且可以是一个表达式.
-
scope : 设定变量的有效范围,如果不设置,默认为page.
3). target : 设置属性的一个对象,它必须是JavaBean 或者java.util.Map对象.
4). property : 设置对象中的一个属性.
案例:
实体类:User
User.java
public class User {
private String username;
private String password;
public String getUsername(){
return username;
}
public voidsetUsername(String username) {
this.username =username;
}
public String getPassword(){
return password;
}
public voidsetPassword(String password) {
this.password =password;
}
}
c_set2.jsp
在该文件中使用<c:set>标签设置User对象的username属性和password属性的值,以及设置Map集合某个属性的值。
<body>
<!-- 标签用来在JSP页面中创建一个Bean实例,作用范围为page-->
<jsp:useBean id="user" class="cn.lctvu.entity.User"></jsp:useBean>
<c:set value="itcast" target="${user}" property="username"></c:set>
User对象的username属性的值为:<c:out value="${user.username }"></c:out><br>
<c:set value="123" target="${user }"property="password"></c:set>
User对象的password属性的值为:<c:out value="${user.password }"></c:out><hr>
<%
HashMap map=new HashMap();
request.setAttribute("preferences", map);
%>
map<key,value>
<c:set target="${preferences }" property="color" value="green"/>
Map对象中coloer关键字的值为:<c:out value="${preferences.color}"/>
</body>
remove标签
remove标签一般和set标签配套使用,两者是相对应的,remove标签用于删除某个变量或者属性,使用格式如下:
<c:remove var=”varName”[scope=”page|request|session|application”] />
Remove标签中使用的各属性说明如下:
scope : 设定这个需要删除的变量的所在范围.
var : 需要删除的变量或者对象属性的名称.
如果没有scope属性,即采用默认值,就相当于调用PageContext.removeAttribute(varName)方法,如果指定了这个变量所在的范围,那么系统会调用PageContext.removeAttribute(varName,scope)方法.
例8-7 c_remove.jsp:
<body>
<c:set value="传智播客" var="company" scope="request">
</c:set>
<c:set value="www.itcast.cn" var="url"scope="request"></c:set>
company:<c:out value="${company }"></c:out><br>
url:<c:out value="${url }"></c:out>
<hr>
使用标签移除属性后:
<br>
<c:remove var="company" scope="request"/>
<c:remove var="url" scope="request"/>
company:<c:out value="${company }"></c:out><br>
url:<c:out value="${url }"></c:out>
</body>
catch标签
catch标签的功能和java中的try{…}catch{…}语句的功能很相似,它用于捕获嵌入到其中间语句抛出的异常,这个标签的使用格式如下:
<c:catch var=”varName”> 相关操作语句</c:catch>
—如果操作语句中出现异常,则catch会将异常保存在 varName变量中.
c_catch.jsp
<body>
<c:catch var="myex">
<%int i=10;
int j=0;
System.out.print(i+"/"+j+"="+i/j);
%>
</c:catch>
异常:<c:out value="${myex }"></c:out><br>
异常myex.getMessage:<c:out value="${myex.message }"></c:out><br>
异常myex.getCause:<c:out value="${myex.cause }"></c:out><br>
异常myex.getStackTrace:<c:out value="${myex.stackTrace }"></c:out>
</body>
if标签
这个标签作用与java中的if语句作用相同,用于判断条件语句,主要的使用格式如下
1.在<c:if> 体中不包括标签体的使用格式:
<c:if test=”checkCondition” var=”varName” scope=”page|request|session|application”/>
2.当<c:if> 体中包括体时,使用格式如下:
<c:if test=”checkCondition” var=”varName”scope=”page|request|session|application”>
body content
</c:if>
标签中使用的属性说明:
test: 判断条件的表达式,返回类型为true 或者 false;(也就是if的条件)
var : 这个变量用于保存test条件表达式判断所返回的true或者false值
(if条件执行后所得到的boolean值将要保存在var变量中).
scope: 指定var变量所在的有效范围.
<body>
<c:set value="1" var="visitCount" ></c:set>
<c:if test="${visitCount==1 }"var="t">
this is you first visit . Welcome to the site
<c:out value="${t }"></c:out>
</c:if>
</body>
choose when otherwise标签
这些标签相当于java中的 switch , case , default 条件,使用实例如下:
<c:set var=”num” scope=”page” value=”admin”/>
<c:choose>
<c:when test=”${num==’guest’}”>
<c:out value=”guest”/>
</c:when>
<c:when test=”${num==’admin’}”>
<c:outvalue=”admin”/>
</c:when>
<c:otherwise>
<c:outvalue=”other”/>
</c:otherwise>
</c:choose>
运行jsp页面后,输出 admin
c_choose.jsp
<body>
<c:choose>
<c:when test="${empty param.username }">
unknown user
</c:when>
<c:when test="${param.username=='itcast'}">
${param.username } is manager
</c:when>
<c:otherwise>
${param.username } is employee
</c:otherwise>
</c:choose>
</body>
foreach迭代标签
该标签用来对一个collection集合中的一系列对象进行迭代输出,并且可以指定迭代次数,一般的使用格式如下:
<c:forEach items=”collection” var=”varName”[varstatus=”varStatusName”] [begin=”begin”] [end=”end”] [step=”step”]>
Bodycontent
</c:forEach>
这个标签使用的属性描述如下:
var : 也就是保存在collection集合类中的对象名称.
items : 将要迭代的集合类名.
varStatus : 存储迭代的状态信息,可以访问到迭代自身的信息.
begin : 如果指定了begin值,就表示从items[begin]开始迭代;如果没有指定begin值,则从集合的第一个值开始迭代.
end : 表示迭代到集合的end位时结束,如果没有指定end值,则表示一直迭代到集合的最后一位.
step : 指定迭代的步长.
例 :使用<c:forEach>标签迭代数组
<body>
<%String[] fruits={"apple","orange","grape","banana"}; %>
String数组中的元素:<br>
<c:forEach var="name" items="<%=fruits %>">
${name }<br>
</c:forEach>
例8-12:使用<c:forEach>标签迭代Map集合
<body>
<% Map userMap=new HashMap();
userMap.put("Tom", "123");
userMap.put("Make", "123");
userMap.put("Lina", "123");
%>
HashMap集合中的元素:<br>
<c:forEach var="entry" items="<%=userMap %>">
${entry.key } ${entry.value }<br>
</c:forEach>
</body>
例8-13:使用<c:forEach>标签指定迭代集合对象的范围和步长
<body>
colorsList集合(指定迭代范围和步长)<br>
<%
ListcolorsList=new ArrayList();
colorsList.add("red");
colorsList.add("yellow");
colorsList.add("blue");
colorsList.add("green");
colorsList.add("black");
%>
<c:forEach var="color" items="<%=colorsList%>"begin="1"
end="3"step="2">
${color}
</c:forEach>
例8-14:使用<c:forEach>标签获取迭代集合中元素的状态信息
<body>
<%
ListuserList = new ArrayList();
userList.add("Tom");
userList.add("Make");
userList.add("Lina");
%>
<table border="1">
<tr>
<td>序号</td>
<td>索引</td>
<td>是否为第一个元素</td>
<td>是否为最后一个元素</td>
<td>元素的值</td>
</tr>
<c:forEach var="name" items="<%=userList%>"varStatus="status">
<tr>
<td>${status.count}</td>
<td>${status.index}</td>
<td>${status.first}</td>
<td>${status.last}</td>
<td>${name}</td>
</tr>
</c:forEach>
</table>
</body>
forTokens标签
这个标签通过items属性来指定一个特定的字符串,然后通过delims属性指定一种分隔符(可以同时指定多个),通过指定的分隔符把items属性指定的字符串进行分组,与forEach标签一样,forTokens标签也可以指定begin和end以及step属性值.
使用格式如下:
<c:forTokens items=”stringOfTokens” delims=”delimiters”var=”varName” [varStatus=”varStatusName”] [begin=”begin”] [end=”end”][step=”step”]>
Bodycontent
</c:forTokens>
标签中的各个属性描述如下:
var : 进行迭代的参数名称.
items : 指定的进行标签化的字符串.
varSatus : 每次迭代的状态信息.
delims : 使用这个属性指定的分隔符来分隔items指定的字符串.
begin : 开始迭代的位置.
end : 迭代结束的位置.
step : 迭代的步长.
例8-15 c_fortokens.jsp
<body>
使用“|”和","作为分隔符<br>
<c:forTokens var="token" items="Spring,Summer|autumn,winter" delims="|,">
${token }
</c:forTokens>
<hr>
使用“--” 作为分隔符<br>
<c:forTokens var="token"items="Day--Week--Month--Year"delims="--">
${token }
</c:forTokens>
</body>
url标签
这个标签主要用来重写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:paramname=”paramName” value=”value” />
</c:url>
标签中使用的属性描述如下:
value: 将要处理的URL地址.
context: 用于指定导入同一个服务器下其他Web应用的名称
var: 给这个URL地址起一个标识.
Scope: 规定这个var属性所指定变量的有效范围.
例8-16.jsp
<body>
使用绝对路径构造URL:<br>
<c:url var="myURL" value="http://localhost:8080/JSTLProject/register.jsp">
<c:param name="username" value="张三"></c:param>
<c:param name="country" value="中国"></c:param>
</c:url>
<a href="${myURL }">register.jsp</a><br>
使用相对路径构造URL:<br>
<c:url var="myURL" value="register.jsp?username=Tom&country=France"/>
<a href="${myURL }">register.jsp</a>
</body>
运行该页面后,在浏览器窗口中已经显示了 c_url.jsp页面的内容,此时查看该页面的源文件,可以看到以下信息:
<body>
使用绝对路径构造URL:<br>
<a href="http://localhost:8080/JSTLProject/register.jsp?username=%e5%bc%a0%e4%b8%89&country=%e4%b8%ad%e5%9b%bd">register.jsp</a><br>
使用相对路径构造URL:<br>
<a href="register.jsp?username=Tom&country=France">register.jsp</a>
</body>
我们可以看到在c_url.jsp中构造的URL地址实际上会变成一个超链接,并且使用标签构造的参数会进行URL编码,,将参数“张三”转变为”%e5%bc%a0%e4%b8%89”,中国转换为“%e4%b8%ad%e5%9b%bd”,这样就构成了一个新的URL地址,完成了URL的重写功能。
register.jsp
<body>
<%
String username=request.getParameter("username");
username=new String(username.getBytes("iso-8859-1"),"utf-8");
String country=request.getParameter("country");
country=new String(country.getBytes("iso-8859-1"),"utf-8");
%>
UserName=<%= username%>
Country=<%= country%>
</body>
redirect和param标签
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>
例8-18 c_redirect.jsp
<body>
<c:url var="myURL" value="register.jsp">
<c:param name="username" value="张三" />
<c:param name="country" value="中国" />
</c:url>
<c:redirect url="${myURL }"/>
</body>