1.jstl标签库
标签库功能描述 | 标签库的URI | 建议前缀 |
---|---|---|
核心标签库 | http://java.sun.com/jsp/jstl/core | c |
XML标签库 | http://java.sun.com/jsp/jstl/xml | x |
国际化/格式化标签库 | http://java.sun.com/jsp/jstl/fmt | fmt |
数据库标签库 | http://java.sun.com/jsp/jstl/sql | sql |
EL自定义函数 | http://java.sun.com/jsp/jstl/functions | fn |
2.JSTL的各个标签库的作用
(1)核心标签库中包含了实现WEB应用中的通用操作的标签。例如,用于输出一个变量内容的<c:out>标签、用于条件判断的<c:if>标签、用于迭代循环的<c:forEach>标签。
(2)国际化/格式化标签库中包含实现WEB应用程序的国际化的标签。例如,设置JSP页面的本地信息、设置JSP页面的时区、绑定资源文件,使本地敏感的数据(例如数值、日期等)按照JSP页面中设置的本地格式显示。
(3)数据库标签库中包含用于访问数据库和对数据库中的数据进行操作的标签。例如,从数据源中获得数据库连接、从数据库表中检索数据等。由于在软件分层的开发模型中,JSP页面仅用作表现层,我们一般不在JSP页面中直接操作数据库,而是在业务逻辑层或数据访问层操作数据库,所以,JSTL中提供的这套数据库标签库没有多大的实用价值。
(4)XML标签库中包含对XML文档中的数据进行操作的标签。例如,解析XML文档、输出XML文档中的内容,以及迭代处理XML文档中的元素。因为XML广泛应用于WEB开发,对XML文档的处理非常重要,XML标签库使处理XML文档变得简单方便,这也是JSTL的一个重要特征。
(5)JSTL中提供的一套EL自定义函数包含了JSP页面制作者经常要用到的字符串操作。例如,提取字符串中的子字符串、获取字符串的长度和处理字符串中的空格等。
3.核心标签库
3.1.<c:out>标签
目的:输出一段文本内容到客户端浏览器
特殊字符转换:
3.1.1.<c:out>标签标签有两种语法格式:
语法1,没有标签体的情况:
<c:out value=“value”
[escapeXml="{true|false}"]
[default=“defaultValue”] />
语法2,有标签体的情况,在标签体中指定输出的默认值:
<c:out value=“value”
[escapeXml="{true|false}"] >
default value
</c:out>
3.1.2.<c:out>标签的属性
属性名 | 是否支持EL | 属性类型 | 属 性 描 述 |
---|---|---|---|
value | true | Object | 指定要输出的内容 |
escapeXml | true | Boolean | 指定是否将>、<、&、’、" 等特殊字符进行HTML编码转换后再进行输出。默认值为true |
default | true | Object | 指定如果value属性的值为null时所输出的默认值 |
3.1.3.例程1
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ page contentType="text/html;charset=gb2312" %>
<%
session.setAttribute("test_session", "testValue_session");
%>
直接输出一个字符串:
<c:out value="test" default="123456" /><br /><hr />
输出Web域中不存在的属性的值:<br />
<c:out value="${test_request}" default="这个属性不存在"/><br /><hr />
输出Web域中的test_session属性的值:<br />
<c:out value="${test_session}" />
输出结果:
3.1.4.例程2:没有设置escapeXml属性
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<c:out value="${null}" >
<meta http-equiv="refresh" content="0;url=http://www.it315.org" />
</c:out>
输出结果:
3.1.5.例程3:escapeXml属性设置为了false
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<c:out value="${null}" escapeXml="false">
<meta http-equiv="refresh" content="0;url=http://www.it315.org" />
</c:out>
输出结果:
3.2.<c:set>标签
3.2.1.<c:set>标签的作用
<c:set>标签用于设置各种Web域中的属性,或者设置Web域中的java.util.Map类型的属性对象或JavaBean类型的属性对象的属性。
3.2.2.<c:set>标签有四种语法格式:
语法1,使用value属性设置指定域中的某个属性的值:
<c:set value=“value”
var=“varName”
[scope="{page|request|session|application}"] />
语法2,在标签体中设置指定域中的某个属性的值:
<c:set var=“varName”
[scope="{page|request|session|application}"]>
body content
</c:set>
语法3,使用value属性设置Web域中的一个属性对象的某个属性:
<c:set value=“value”
target=“target”
property=“propertyName” />
语法4,在标签体中设置Web域中的一个属性对象的某个属性性:
<c:set target=“target”
property=“propertyName”>
body content
</c:set>
3.2.3.<c:set>标签的属性
属性名 | 是否支持EL | 属性类型 | 属 性 描 述 |
---|---|---|---|
value | true | Object | 用于指定属性值 |
var | false | String | 用于指定要设置的Web域属性的名称 |
scope | false | String | 用于指定属性所在的Web域 |
target | true | Object | 用于指定要设置属性的对象,这个对象必须是JavaBean对象或java.util.Map对象 |
property | true | string | 用于指定当前要为对象设置的属性名称 |
3.2.4.使用<c:set>标签设置某个Web域中的属性的一个演示例子程序
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ page contentType="text/html;charset=gb2312" %>
<c:set var="userName" scope="session">
zxx
</c:set>
输出session 作用域中的userNamer属性的值:
<c:out value="${userName}" /><br /><hr />
输出session 作用域中的bookname属性的值:
<c:set var="bookname" scope="session" />
<c:out value="${bookname}" />
运行结果:
3.2.5.使用<c:set>标签设置UserBean对象和Map对象的属性的一个演示例子程序。
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ page contentType="text/html;charset=gb2312" %>
<%@ page import="java.util.HashMap" %>
<jsp:useBean id="user" class="org.it315.UserBean" />
<%
HashMap preferences = new HashMap();
session.setAttribute("preferences",preferences);
%>
设置和输出UserBean对象的userName属性值:
<c:set value="zxx" target="${user}" property="userName" />
<c:out value="${user.userName}" /><br /><hr />
设置和输出UserBean对象的password属性值:
<c:set target="${user}" property="password" />
<c:out value="${user.password}" /><br /><hr />
设置和输出Map对象的color关键字的值:
<c:set target="${preferences}" property="color" value="${param.color}" />
<c:out value="${preferences.color}" />
输出结果:
3.3.<c:if>标签
3.3.1.<c:if>标签的作用
语法1,没有标签体的情况:
<c:if test=“testCondition” var=“varName”
[scope="{page|request|session|application}"] />
语法2,有标签体的情况,在标签体中指定要执行的内容:
<c:if test=“testCondition” [var=“varName”]
[scope="{page|request|session|application}"]>
body content
</c:if>
3.3.2.<c:if>标签的属性
属性名 | 是否支持EL | 属性类型 | 属 性 描 述 |
---|---|---|---|
test | true | boolean | 决定是否处理标签体中的内容的条件表达式 |
var | false | String | 用于指定将test属性的执行结果保存到某个Web域中的某个属性的名称 |
scope | false | String | 指定将test属性的执行结果保存到哪个Web域中 |
3.3.3.例程1
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ page contentType="text/html;charset=gb2312" %>
<jsp:useBean id="user" class="org.it315.UserBean" />
<c:set value="${param.count}" target="${user}" property="visitCount" />
<c:if test="${user.visitCount == 1}">
这是您第一次访问本网站,欢迎您!
</c:if>
输入地址:
http://localhost:8080/JSTL/c_if.jsp?count=1
输出结果:
3.4.<c:choose>标签
3.4.1.<c:choose>标签的作用
<c:choose>标签用于指定多个条件选择的组合边界,它必须与<c:when>和<c:otherwise>标签一起使用。使用<c:choose>,<c:when>和<c:otherwise>三个标签,可以构造类似 “if-else if-else” 的复杂条件判断结构。
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ page contentType="text/html;charset=gb2312" %>
<c:set value="${param.count}" var="count" />
<c:choose>
<c:when test="${count == 0}">
对不起,没有符合您要求的记录。
</c:when>
<c:otherwise>
符合您要求的记录共有${count}条.
</c:otherwise>
</c:choose>
在浏览器地址栏输入如下地址访问例程8-11:
http://localhost:8080/JSTL/c_choose.jsp?count=0
例程8-11的运行结果如图8.9所示。如果将参数count的值修改为10,则运行结果如图8.10所示。
3.3.4.例程2-是一个综合使用<c:if>标签和<c:choose>等标签的例子程序
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<c:if test="${pageContext.request.method=='POST'}">
<c:choose>
<c:when test="${param.favor == 'computer'}">
Your favourite course is <b>computer</b>.
</c:when>
<c:otherwise>
Your favourite course is <i>other</i>.
</c:otherwise>
</c:choose>
</c:if>
<form method="POST">What is your favourite course?<br/>
<input type="text" name="favor" />
<input type="submit" value="submit" />
</form>
操作:
在浏览器地址栏中直接访问c_customLogic.jsp的运行结果如图8.11所示,在文本框中输入“computer”,单击其中的submit按钮后的运行结果如图8.12所示。
输出结果:
3.4.<c:forEach>标签
3.4.1.<c:forEach>标签的作用
对一个集合对象中的元素进行循环迭代操作
3.4.2.<c:forEach>标签有两种语法格式
语法1,在集合对象中迭代:
<c:forEach [var=“varName”]
items=“collection”
[varStatus=“varStatusName”]
[begin=“begin”] [end=“end”] [step=“step”]>
body content
</c:forEach>
语法2,迭代固定的次数:
<c:forEach [var=“varName”]
[varStatus=“varStatusName”]
begin=“begin” end=“end” [step=“step”]>
body content
</c:forEach>
3.4.2.<c:forEach>标签的属性
属性名 | 是否支持EL | 属性类型 | 属 性 描 述 |
---|---|---|---|
var | false | String | 指定将当前迭代到的元素保存到page这个Web域中的属性名称 |
items | true | 任何支持的类型 | 将要迭代的集合对象 |
varStatus | false | String | 指定将代表当前迭代状态信息的对象保存到page这个Web域中的属性名称 |
begin | true | int | 如果指定items属性,就从集合中的第begin个元素开始进行迭代,begin的索引值从0开始编号;如果没有指定items属性,就从begin指定的值开始迭代,直到end值时结束迭代 |
end | true | int | 参看begin属性的描述 |
step | true | int | 指定迭代的步长,即迭代因子的迭代增量 |
3.4.3.<c:forEach>标签的items属性的值支持下面的数据类型:
- 任意类型的数组
- java.util.Collection
- java.util.Iterator
- java.util.Enumeration
- java.util.Map
- String
items属性还支持与数据库有关的数据类型java.sql.ResultSet(包括javax.sql.RowSet),这些数据类型将在8.5 节的数据库标签中进行介绍。对字符串的迭代操作通常使用<c:forTokens>标签或JSTL函数,例如fn:split和fn:jion,JSTL函数将在8.7节进行介绍。
3.4.4.例程1-迭代Collection类型的集合对象
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ page contentType="text/html;charset=gb2312" %>
<%@ page import="java.util.*,org.it315.UserBean" %>
<%
Collection users = new ArrayList();
for(int i=0; i<5; i++)
{
UserBean user = new UserBean();
user.setUserName("user" + i);
user.setPassword("guess" + i);
users.add(user);
}
session.setAttribute("users", users);
%>
<div style="text-align:center">User List
<table border="1">
<tr><td>用户名</td><td>密码</td></tr>
<c:forEach var="user" items="${users}">
<tr>
<td>${user.userName}</td><td>${user.password}</td>
</tr>
</c:forEach>
</table></div>
输出结果:
3.4.5.例程2-迭代Map对象
使用<c:forEach>标签迭代Map类型的集合对象时,迭代出的每个元素的类型为Map.Entry,Map.Entry代表Map集合中的一个条目项,其中的getKey()方法可获得条目项的关键字,getValue()方法可获得条目项的值。
EL中的requestScope隐含对象代表request作用域中的所有属性的Map对象,所以我们可以使用<c:forEach>标签迭代输出EL中的requestScope隐含对象中的所有元素,如例程8-14所示。
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ page contentType="text/html;charset=gb2312" %>
<%
request.setAttribute("attr1","value1");
request.setAttribute("attr2","value2");
%>
<div style="text-align:center">Properties(Map)
<table border="1">
<tr><td>Map的关键字</td><td>Map的对应关键字的值</td></tr>
<c:forEach var="entry" items="${requestScope}">
<tr><td>${entry.key}</td><td>${entry.value}</td></tr>
</c:forEach>
</table></div>
输出结果:
3.4.6.迭代指定的次数
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ page contentType="text/html;charset=gb2312" %>
从11到16迭代,指定迭代步长为2:
<c:forEach var="i" begin="11" end="16" step="2">
${i}
</c:forEach><br /><hr />
从0到5迭代,没有指定迭代步长:
<c:forEach var="i" begin="0" end="5">
${i}
</c:forEach>
输出结果:
3.4.7.指定迭代集合对象的范围和步长
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ page contentType="text/html;charset=gb2312" %>
<%@ page import="java.util.*,org.it315.UserBean" %>
<%
Collection users = new ArrayList();
for(int i=0; i<6; i++)
{
UserBean user = new UserBean();
user.setUserName("user" + i);
user.setPassword("guest" + i);
users.add(user);
}
session.setAttribute("users", users);
%>
<div style="text-align:center">User List(指定迭代范围和步长)
<table border="1">
<tr><td>用户名</td><td>密码</td></tr>
<c:forEach var="user" items="${users}" end="5" step="2">
<tr>
<td>${user.userName}</td><td>${user.password}</td>
</tr>
</c:forEach>
</table></div>
输出结果:
3.4.8.获取迭代的状态信息
<c:forEach>标签可以将代表当前迭代状态信息的对象保存到page域中,varStatus属性指定了这个对象保存在page域中的属性名称。
- public java.lang.Integer getBegin()
- 返回为标签设置的begin属性的值,如果没有设置begin属性则返回null
- public int getCount()
- 返回当前已循环迭代的次数
- public java.lang.Object getCurrent()
- 返回当前迭代到的元素对象
- public java.lang.Integer getEnd()
- 返回为标签设置的end属性的值,如果没有设置end属性则返回null
- public int getIndex()
- 返回当前迭代的索引号
- public java.lang.Integer getStep()
- 返回为标签设置的step属性的值,如果没有设置step属性则返回null
- public boolean isFirst()
- 返回当前是否是第一次迭代操作
- public boolean isLast()
- 返回当前是否是最后一次迭代操作
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ page contentType="text/html;charset=gb2312" %>
<%@ page import="java.util.*,org.it315.UserBean" %>
<%
Collection users = new ArrayList();
for(int i=0; i<6; i++)
{
UserBean user = new UserBean();
user.setUserName("user" + i);
user.setPassword("guest" + i);
users.add(user);
}
session.setAttribute("users", users);
%>
<div style="text-align:center">User List
<table border="1">
<tr><td>用户名</td><td>密码</td><td>index</td>
<td>count</td><td>first?</td><td>last?</td></tr>
<c:forEach var="user" items="${users}" varStatus="sta" begin="1" step="2">
<tr>
<td>${user.userName}</td><td>${user.password}</td>
<td>${sta.index}</td><td>${sta.count}</td>
<td>${sta.first}</td><td>${sta.last}</td>
</tr>
</c:forEach>
</table></div><hr>
<div style="text-align:center">迭代固定的次数
<table border="1">
<tr><td>数值</td><td>index</td><td>count</td>
<td>first?</td><td>last?</td></tr>
<c:forEach var="i" varStatus="sta1" begin="101" end="103">
<tr>
<td>${i}</td><td>${sta1.index}</td><td>${sta1.count}</td>
<td>${sta1.first}</td><td>${sta1.last}</td>
</tr>
</c:forEach>
</table></div>
运行结果:
3.4.9.与条件标签结合使用
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ page contentType="text/html;charset=gb2312" %>
<div style="text-align:center">
<table border="1"><tr><td>number</td><td>count</td><td>even|odd</td></tr>
<c:forEach var="i" begin="11" end="13" varStatus="status">
<tr><td>${i}</td><td>${status.count}</td><td>
<c:choose>
<c:when test="${status.count % 2 == 0}">
偶数行
</c:when>
<c:otherwise>
奇数行
</c:otherwise>
</c:choose></td></tr>
</c:forEach>
<table></div>
输出结果:
ikskj3-1566351222412)]
3.4.9.与条件标签结合使用
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ page contentType="text/html;charset=gb2312" %>
<div style="text-align:center">
<table border="1"><tr><td>number</td><td>count</td><td>even|odd</td></tr>
<c:forEach var="i" begin="11" end="13" varStatus="status">
<tr><td>${i}</td><td>${status.count}</td><td>
<c:choose>
<c:when test="${status.count % 2 == 0}">
偶数行
</c:when>
<c:otherwise>
奇数行
</c:otherwise>
</c:choose></td></tr>
</c:forEach>
<table></div>
输出结果: