JSTL(Java Server Pages Standerd Tag Library,JSP标准标签库)包含用于编写和开发JSP页面的一组标准标签,它可以为用户提供一个无脚本环境。在此环境中,用户可以使用标签编写代码,而无须使用Java脚本。在JSP2.0中已将JSTL作为标准支持。使用JSTL可以取代在传统JSP程序中嵌入Java代码的做法,大大提高了程序的可维护性。
1、JSTL标签库简介
虽然JSTL叫做标准标签库,实际上它是由5个功能不同的标签库组成。这5个标签库分别是核心标签库、格式标签库、SQL标签库、XML标签库和函数标签库等。在使用这些标签之前必须在JSP页面的顶部使用<%@ taglib%>指令定义引用的标签库和访问前缀。
标签库 | taglib指令格式 |
---|---|
核心标签库 | <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> |
格式标签库 | <%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%> |
SQL标签库 | <%@ taglib prefix="sql" uri="http://java.sun.com/jsp/jstl/sql"%> |
XML标签库 | <%@ taglib prefix="x" uri="http://java.sun.com/jsp/jstl/xml"%> |
函数标签库 | <%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions"%> |
1.1 核心标签库
核心标签库主要用于完成JSP页面的常用功能,包括JSTL的表达式标签、URL标签、流程控制标签和循环标签共4种标签。其中,表达式标签包括:<c:out>、<c:set>、<c:remove>和<c:catch>;URL标签包括:<c:import>、<c:redirect>、<c:url>和<c:param>;流程控制标签包括:<c:if>、<c:choose>、<c:when>和<c:otherwise>;循环标签包括:<c:forEach>和<c:forTokens>。
使用核心标签库的taglib指令格式如下:
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
核心标签库的基本作用:
标签 | 说明 |
---|---|
<c:out> | 将表达式的值输出到JSP页面中,相当于JSP表达式<%=表达式%>。 |
<c:set> | 在指定范围中定义变量,或为指定的对象设置属性值。 |
<c:remove> | 从指定的JSP范围中移除指定的变量。 |
<c:catch> | 捕获程序中出现的异常,相当于Java语言中的 try...catch语句。 |
<c:import> | 导入站内或其他网站的静态和动态文件到Web页面中。 |
<c:redirect> | 将客户端发出的request请求重定向到其他URL服务端。 |
<c:url> | 使用正确的URL重写规则构造一个URL。 |
<c:param> | 为其它标签提供参数信息,通常与其它标签结合使用。 |
<c:if> | 根据不同的条件处理不同的业务,与Java语言中的if语句类似,只不过该语句没有else标签。 |
<c:choose>、<c:when><c:otherwise> | 根据不同的条件完成指定的业务逻辑,如果没有符合的条件,则会执行默认条件的业务逻辑,相当于Java语言中的seitch语句。 |
<c:forEach> | 根据循环条件,遍历数组和集合类中的所有或部分数据。 |
<c:forTokens> | 迭代字符串中由分隔符分隔的各成员。 |
1.2 格式标签库
格式标签库提供了一个简单的国际化标记,也被称为 I18N 标签库,用于处理和解决国际化相关的问题。另外,格式化标签库中还包含格式化数字和日期显示格式的标签。
使用格式标签库的taglib指令格式如下:
<%@ 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的字符编码。 |
1.3 SQL标签库
SQL标签库提供了基本的访问关系型数据的能力。使用SQL标签,可以简化对数据库的访问。如结合核心标签库,可以方便地获取结果集,并迭代输出结果集中的数据。
使用SQL标签库的taglib指令格式如下:
<%@ taglib prefix="sql" uri="http://java.sun.com/jsp/jstl/sql"%>
SQL标签库的基本作用:
标签 | 说明 |
---|---|
<sql:setDataSource> | 指定数据源。 |
<sql:query> | 运行SQL查询语句。 |
<sql:update> | 运行SQL更新语句。 |
<sql:param> | 将SQL语句中的参数设为指定值。 |
<sql:dateParam> | 将SQL语句中的日期参数设为指定的java.util.Date 对象值。 |
<sql:transaction> | 在共享数据库连接中提供嵌套的数据库行为元素,将所有语句以一个事务的形式来运行。 |
1.4 XML标签库
XML标签库可以处理和生成XML的标记,使用这些标记可以很方便地开发基于XML的Web应用。
使用XML标签库的taglib指令格式如下:
<%@ taglib prefix="x" uri="http://java.sun.com/jsp/jstl/xml"%>
在使用xml标签前,你必须将 XML 和 XPath 的相关包拷贝至你的<Tomcat 安装目录>\lib下:
XercesImpl.jar 下载地址: http://www.apache.org/dist/xerces/j/
xalan.jar下载地址: http://xml.apache.org/xalan-j/index.html
XML标签库的基本作用:
标签 | 说明 |
---|---|
<x:out> | 与<%= ... >,类似,不过只用于XPath表达式。 |
<x:parse> | 解析 XML 数据。 |
<x:set> | 设置XPath表达式。 |
<x:if> | 判断XPath表达式,若为真,则执行本体中的内容,否则跳过本体。 |
<x:forEach> | 迭代XML文档中的节点。 |
<x:choose> | <x:when>和<x:otherwise>的父标签。 |
<x:when> | <x:choose>的子标签,用来进行条件判断。 |
<x:otherwise> | <x:choose>的子标签,当<x:when>判断为false时被执行。 |
<x:transform> | 将XSL转换应用在XML文档中。 |
<x:param> | 与<x:transform>共同使用,用于设置XSL样式表。 |
1.5 函数标签库
函数标签库提供了一系列字符串操作函数,用于完成分解字符串、连接字符串、返回子串、确定字符串是否包含特定的子串等功能。
使用函数标签库的taglib指令格式如下:
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions"%>
函数标签库的基本作用:
标签 | 说明 |
---|---|
fn:contains(string, substring) | 如果参数string中包含参数substring,返回true。 |
fn:containsIgnoreCase(string, substring) | 如果参数string中包含参数substring(忽略大小写),返回true。 |
fn:endsWith(string, suffix) | 如果参数 string 以参数suffix结尾,返回true。 |
fn:escapeXml(string) | 将有特殊意义的XML (和HTML)转换为对应的XML character entity code,并返回。 |
fn:indexOf(string, substring) | 返回参数substring在参数string中第一次出现的位置。 |
fn:join(array, separator) | 将一个给定的数组array用给定的间隔符separator串在一起,组成一个新的字符串并返回。 |
fn:length(item) | 返回参数item中包含元素的数量。参数Item类型是数组、collection或者String。如果是String类型,返回值是String中的字符数。 |
fn:replace(string, before, after) | 返回一个String对象。用参数after字符串替换参数string中所有出现参数before字符串的地方,并返回替换后的结果。 |
fn:split(string, separator) | 返回一个数组,以参数separator 为分割符分割参数string,分割后的每一部分就是数组的一个元素。 |
fn:startsWith(string, prefix) | 如果参数string以参数prefix开头,返回true。 |
fn:substring(string, begin, end) | 返回参数string部分字符串, 从参数begin开始到参数end位置,包括end位置的字符。 |
fn:substringAfter(string, substring) | 返回参数substring在参数string中后面的那一部分字符串。 |
fn:substringBefore(string, substring) | 返回参数substring在参数string中前面的那一部分字符串。 |
fn:toLowerCase(string) | 将参数string所有的字符变为小写,并将其返回。 |
fn:toUpperCase(string) | 将参数string所有的字符变为大写,并将其返回。 |
fn:trim(string) | 去除参数string 首尾的空格,并将其返回。 |
2、JSTL的配置
由于JSTL还不是JSP 2.0规范中的一部分,所以在使用JSTL之前,需要安装并配置JSTL。
2.1 下载JSTL标签库
从Apache官网的标准标签库中下载的二进包(jakarta-taglibs-standard-current.zip)。
官方下载地址:http://archive.apache.org/dist/jakarta/taglibs/standard/binaries/
选择 jakarta-taglibs-standard-1.1.2.zip 文件下载,下载完成后解压该文件。
如果使用Maven,则pom.xml文件配置如下:
<!-- JSTL标签库 -->
<dependency>
<groupId>javax.servlet.jsp.jstl</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
<dependency>
<groupId>javax.servlet.jsp.jstl</groupId>
<artifactId>jstl-api</artifactId>
<version>1.2</version>
</dependency>
<dependency>
<groupId>org.glassfish.web</groupId>
<artifactId>jstl-impl</artifactId>
<version>1.2</version>
</dependency>
<dependency>
<groupId>taglibs</groupId>
<artifactId>standard</artifactId>
<version>1.1.2</version>
</dependency>
(如果使用Maven,那么以下的2.2步骤就不需要配置了)
2.2 配置JSTL标签库
(1)将解压后的jakarta-taglibs-standard-1.1.2\lib目录下的两个jar文件:jstl.jar 和 standard.jar 文件拷贝到您的Web项目的 /WEB-INF/lib/ 目录中。
(2)jakarta-taglibs-standard-1.1.2\tld目录下的tld文件拷贝到您的Web项目的 /WEB-INF/ 目录中。
(3)在 web.xml 文件中,添加以下配置信息:
<jsp-config>
<taglib>
<taglib-uri>http://java.sun.com/jsp/jstl/core</taglib-uri>
<taglib-location>/WEB-INF/c.tld</taglib-location>
</taglib>
<taglib>
<taglib-uri>http://java.sun.com/jsp/jstl/fmt</taglib-uri>
<taglib-location>/WEB-INF/fmt.tld</taglib-location>
</taglib>
<taglib>
<taglib-uri>http://java.sun.com/jsp/jstl/sql</taglib-uri>
<taglib-location>/WEB-INF/sql.tld</taglib-location>
</taglib>
<taglib>
<taglib-uri>http://java.sun.com/jsp/jstl/xml</taglib-uri>
<taglib-location>/WEB-INF/x.tld</taglib-location>
</taglib>
<taglib>
<taglib-uri>http://java.sun.com/jsp/jstl/functions</taglib-uri>
<taglib-location>/WEB-INF/fn.tld</taglib-location>
</taglib>
</jsp-config>
2.3 验证JSTL的配置是否成功
创建 index.jsp 页面,引用核心标签库:<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>,然后使用<c:out>标签输出字符串。
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>JSTL标签库</title>
</head>
<body>
<c:out value="您好,欢迎访问 pan_junbiao的博客!" /><br/>
<c:out value="博客地址:https://blog.csdn.net/pan_junbiao" />
</body>
</html>
执行结果:
3、表达式标签
在JSTL的核心标签库中,包括了<c:out>、<c:set>、<c:remove>和<c:catch>等4个表达式标签。
3.1 <c:out>输出标签
<c:out>标签用于将表达式的值输出到JSP页面中,该标签类似于JSP的表达式<%=表达式%>,或者EL表达式${expression}。<c:out>标签有两种语法格式,一种没有标签体,另一种有标签体,这两种语言的输出结果完全相同。<c:out>标签的具体语法格式如下:
语法1——没有标签体:
<c:out value="expression" [escapeXml="true|false"] [default="defaultValue"]/>
语法2——有标签体:
<c:out value="expression" [escapeXml="true|false"]>
defalultValue
</c:out>
参数说明:
value:用于指定将要输出的变量或表达式。该属性的值类似于Object,可以使用EL。
default:可选属性,用于指定当value属性值等于null时,将要显示的默认值。如果没有指定该属性,并且value属性的值为null,该标签将输出空的字符串。
escapeXml:可选属性,用于指定是否转换特殊字符,可以被转换的如下表。其属性值为true或false,默认值为true,表示转换。例如,将“<”转换为“<”。
被转换的字符:
字符 | 字符实体代码 |
---|---|
< | < |
> | > |
' | ' |
“ | " |
& | & |
示例:应用<c:out>标签输出字符串。
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>应用<c:out>标签输出字符串</title>
</head>
<body>
escapeXml属性为true时:
<c:out value="<h3>pan_junbiao的博客</h3>" escapeXml="true"/>
<br>
escapeXml属性为false时:
<c:out value="<h3>pan_junbiao的博客</h3>" escapeXml="false"/>
</body>
</html>
执行结果:
从执行结果可以看出,当escapeXml属性值为ture时,输出字符串中的<h3>以字符串的形式输出,而当escapeXml属性值为false时,字符串中的<h3>则被当作HTML标记进行输出。这是因为,当escapeXml属性值为ture时已经将字符串中的“<”和“>”符号转换为对应的实体代码,所以咋输出时,就不会被当做HTML标记进行输出了。通过查看源代码可以看出:
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>应用<c:out>标签输出字符串</title>
</head>
<body>
escapeXml属性为true时:
<h3>pan_junbiao的博客</h3>
<br>
escapeXml属性为false时:
<h3>pan_junbiao的博客</h3>
</body>
</html>
3.2 <c:set>变量设置标签
<c:set>标签用于在指定范围(page、request、session或application)中定义保存某个值的变量,或为指定的对象设置属性值。使用该标签可以在页面中定义变量,而不用在JSP页面中嵌入打乱HTML排版的Java代码。<:set>标签有4种语法格式。
语法1:在scope指定的范围内将变量值存储到变量中。
<c:set var="name" value="value" [scope="范围"]/>
语法2:在scope指定的范围内将标签体存储到变量中。
<c:set var="name" [scope="page|request|session|application"]>
标签体
</c:set>
语法3:将变量值存储在target属性指定的目标对象的propName属性中。
<c:set value="value" target="object" property="propName"/>
语法4:将标签体存储到target属性指定的目标对象的propName属性中。
<c:set target="object" property="propName">
标签体
</c:set>
参数说明:
var:用于指定变量名。通过该标签定义的变量名,可以通过EL表达式语言指定为<c:out>的value属性的值。
value:用于指定变量值,可以使用EL表达式语言。
scope:用于指定变量的作用域,默认值为page。可选值包括:page、request、session和application。
target:用于指定存储变量值或者标签体的目标对象,可以是JavaBean或Map集合对象。
注意:target属性不能是直接指定的JavaBean或Map,而应该是使用EL表达式或一个脚本表达式指定的真正对象。例如,这个对象可以同<jsp:useBean>为JavaBean“CartForm”的id属性赋值,那么target属性值应该是 target="${cart}",而不应该是 target="cart"。其中,cart为CartForm的对象。
property:用于指定目标对象存储数据的属性名。
示例:应用<c:set>标签定义变量并为JavaBean属性赋值。
(1)编写一个名称为UserInfo的JavaBean,并将其保存到com.pjb.bean包中。
package com.pjb.bean;
/**
* 用户信息实体类
*
* @author pan_junbiao
*
*/
public class UserInfo
{
private String name; // 姓名
public String getName()
{
return name;
}
public void setName(String name)
{
this.name = name;
}
}
(2)编写 setTest.jsp 文件,在该文件中应用<c:set>标签定义变量并为JavaBean属性赋值。
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>应用<c:set>标签的应用</title>
</head>
<body>
<ul>
<li>定义request范围内的变量:</li>
<c:set var="userName" value="pan_junbiao的博客" scope="request" />
<c:out value="${requestScope.userName}" />
<li>设置UserInfo对象的name属性:</li>
<jsp:useBean id="myUser" class="com.pjb.bean.UserInfo" />
<c:set target="${myUser}" property="name" value="pan_junbiao的博客" />
<c:out value="${myUser.name}" />
</ul>
</body>
</html>
执行结果:
3.3 <c:remove>变量移除标签
<c:remove>标签用于移除指定的JSP范围内的变量,其语法格式如下:
<c:remove var="name" [scope="范围"]/>
参数说明:
var属性:用于指定要移除的变量名。
scope属性:用于指定变量的有效范围,可选值有page、request、session、application。默认值是page。如果在该标签中没有指定变量的有效范围,那么将分别在page、request、session和application的范围内查找要移除的变量并移除。例如,在一个页面中,存在不同范围的两个同名变量,当不指定范围时移除该变量,这两个范围内的变量都将被移除。为此,在以移除变量时,最好指定变量的有效范围。
说明:当指定的要移除的变量并不存在是,并不会抛出异常。
示例:应用<c:remove>标签移除变量。
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>应用<c:remove>标签移除变量</title>
</head>
<body>
<ul>
<li>定义request范围内的变量userName:</li>
<c:set var="userName" value="pan_junbiao的博客" scope="request"/>
<c:out value="${requestScope.userName}"/>
<li>移除request范围内的变量userName:</li>
<c:remove var="userName" scope="request"/>
<c:out value="${requestScope.userName}" default="空" />
</ul>
</body>
</html>
执行结果:
3.4 <c:catch>捕获异常标签
<c:catch>标签用于捕获程序中出现的异常,如果需要它还可以将异常信息保存在指定的变量中。该标签与Java语言中的try...catch语句类似。<c:catch>标签的语法格式如下:
<c:catch [var="exception"]>
//可能存在异常的代码
</c:catch>
参数说明:
var属性:可选属性,用于指定存储异常信息的变量。如果不需要保存异常信息,可以省略该属性。
注意:var属性值只有在<c:catch>标签的后面才有效,也就是说,在<c:catch>标签体中无法使用有关异常的任何信息。
示例:应用<c:catch>标签捕获异常信息。
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>应用<c:catch>标签捕获异常信息</title>
</head>
<body>
<c:catch var="errorMsg">
<jsp:useBean id="myUser" class="com.pjb.bean.UserInfo" />
<c:set target="${myUser}" property="name2" value="pan_junbiao的博客" />
</c:catch>
异常信息为:
<c:out value="${errorMsg}"/>
</body>
</html>
执行结果:
异常信息为: javax.servlet.jsp.JspTagException: Invalid property in <set>: "name2"
说明:由于JavaBean的UserInfo类中并不存在name2属性,所以执行程序时发生异常。
4、URL相关标签
文件导入、重定向和URL地址生成是Web应用中常用的功能。JSTL中也提供了与URL相关的标签,分别是<c:import>、<c:redirect>、<c:url>和<c:param>。其中,<c:param>标签通常与其它标签配合使用。
4.1 <c:import>导入标签
<c:import>标签可以导入站内或其他网站的静态和动态文件到Web页面中,例如,使用<c:import>标签导入其他网站的天气信息到自己的网页中。<c:import>标签与<jsp:include>动作指令类似,所不同的是<jsp:include>只能导入站内资源,而<c:import>标签不仅可以导入站内资源,也可以导入其他网站的资源。<c:import>标签的语法格式如下:
语法1:
<c:import url="url" [context="context"] [var="name"] [scope="范围"] [charEncoding="encoding"]>
[标签体]
</c:import>
语法2:
<c:import url="url" varReader="name" [context="context"] [charEncoding="encoding"]>
[标签体]
</c:import>
参数说明:
url:用于指定被导入的文件资源的URL。如果指定的url属性为null、空或者无效,将抛出异常。
context:上下文路径,用于访问同一个服务器的其它Web应用,其值必须以“/”开头,如果指定了该属性,那么url属性值也必须以“/”开头。
var:用于指定变量名称。该变量用于以String类型存储获取资源。
scope:用于指定变量的有效范围,可选值有page、request、session、application。默认值是page。
varReader:用于指定一个变量名,该变量用于以Reader类型存储被包含文件内容。导出的Reader对象只能在<c:import>标签的开始标签和结束标签之间使用。
charEncoding:用于指定被导入文件的编码格式。
标签体:可选项,如果需要为导入的文件传递参数,则可以在标签体的位置通过<c:param>标签设置参数。
示例:应用<c:import>标签导入网站Banner。
(1)编写 importText.jsp 页面,<c:import>标签导入网站Banner(对应的文件为 navigation.jsp ),并将参数传递到navigation.jsp页面。
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>应用<c:import>标签导入网站Banner</title>
</head>
<body>
<c:set var="typeName" value="Java开发 | .NET开发 | MySQL数据库 | Oracle数据库" />
<!-- 导入网站Banner -->
<c:import url="navigation.jsp" charEncoding="UTF-8">
<c:param name="typeName" value="${typeName}"></c:param>
</c:import>
</body>
</html>
(2)编写 navigation.jsp 文件。
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<% request.setCharacterEncoding("UTF-8"); %>
<h3>欢迎访问 pan_junbiao的博客</h3>
<b>${param.typeName}</b>
执行结果:
4.2 <c:url>动态生成URL标签
<c:url>标签用于生成一个URL路径的字符串,这个生成的字符串可以赋予HTML的<a>标记实现URL的连接,或者用这个生成的URL字符串实现网页转发与重定向等。在使用该标签生成URL时,还可以与<c:param>标签相结合动态添加URL的参数信息。<c:url>标签的语法格式如下。
语法1:
<c:url value="url" [var="name"] [scope="范围"] [context="context"]/>
该语法将输出产生的URL字符串信息,如果指定了var和scope属性,相应的URL信息就不在输出,而是存储在变量中以备后用。
语法2:
<c:url value="url" var="name"] [scope="范围"] [context="context"]>
<c:param/>
<!--可以有多个<c:param>标签-->
</c:url>
参数说明:
value:用于指定将要处理的URL地址,可以使用EL。
context:上下文路径,用于访问同一个服务器的其它Web应用,其值必须以“/”开头,如果指定了该属性,那么url属性值也必须以“/”开头。
var:用于指定变量名称,该变量用于保存新生成的URL字符串。
scope:用于指定变量的有效范围。
示例:应用<c:url>标签生成带参数的URL地址。
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>应用<c:url>标签生成带参数的URL地址</title>
</head>
<body>
<c:url var="path" value="register.jsp" scope="page">
<c:param name="userId" value="1" />
<c:param name="userName" value="pan_junbiao" />
</c:url>
<a href="${pageScope.path}">提交注册</a>
</body>
</html>
执行程序后,生成的URL地址为:
http://127.0.0.1:8080/jstlweb/register.jsp?userId=1&userName=pan_junbiao
注意:在应用<c:url>标签生成新的URL地址时,空格符将被转换为“+”。
4.3 <c:redirect>重定向标签
<c:redirect>标签可以将客户端发出的request请求重定向到其他URL服务端,由其他程序处理客户的请求。而在这期间可以对request请求中的属性进行修改或添加,然后把所有属性传递到目标路径。该标签的语法格式如下。
语法1:该语法格式没有标签体,并且不添加传递到目标路径的参数信息。
<c:redirect url="url" [context="/context"]/>
语法2:该语法格式将客户请求重定向到目标路径,并且在标签体中使用<c:param>标签传递其他参数信息。
<c:redirect url="url" [context="/context"]>
<c:param/>
<!--可以有多个<c:param>标签-->
</c:redirect>
参数说明:
url:必选属性,用于指定待定向资源的URL,可以使用EL表达式。
context:用于在使用相对路径访问外部context资源时,指定资源的名字。
示例:应用<c:redirect>标签实现重定向并传递参数。
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>应用<c:redirect>标签实现重定向并传递参数</title>
</head>
<body>
<c:redirect url="register.jsp">
<c:param name="userId" value="1" />
<c:param name="userName" value="pan_junbiao" />
</c:redirect>
</body>
</html>
4.4 <c:param>传递参数标签
<c:param>标签只用于为其他标签提供参数信息,它与<c:import>、<c:redirect>和<c:url>标签组合可以实现动态定制参数,从而使标签可以完成更复杂的程序应用。<c:param>标签的语法格式如下:
<c:param name="paramName" value="paramValue"/>
参数说明如下:
name属性:用于指定参数名,可以引用EL。如果参数名为null或是空,该标签将不起任何作用。
value属性:用于指定参数值,可以引用EL。如果参数值为null,该作为空值处理。
示例:应用<c:redirect>标签定义从定向页面,并通过<c:param>标签定义重定向参数。
(1)编写 paramTest.jsp 页面,在该页面中通过<c:redirect>标签定义从定向页面,并通过<c:param>标签定义重定向参数。
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>重定向页面并传递参数</title>
</head>
<body>
<c:redirect url="main.jsp">
<c:param name="userName" value="pan_junbiao" />
</c:redirect>
</body>
</html>
(2)编写 main.jsp 页面,在该页面中通过EL表达式的param隐含对象获取参数。
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>显示结果</title>
</head>
<body>
${param.userName} 您好,欢迎访问 pan_junbiao的博客!
</body>
</html>
5、流程控制标签
流程控制在程序中会根据不同的条件去执行不同的代码来产生不同的运行结果,使用流程控制可以处理程序中的任何可能发生的事情。在JSTL中包含:<c:if>、<c:choose>、<c:when>和<c:otherwise>这4种流程控制标签。
5.1 <c:if>条件判断标签
<c:if>条件判断标签可以根据不同的条件去处理不同的业务。它与Java语言中的if语句类似,只不过该语句没有else标签。<c:if>标签有两种语法格式。
说明:虽然<c:if>标签没有对应的else标签,但是JSTL提供了<c:choose>、<c:when>和<c:otherwise>标签可以实现if...else的功能。
语法1:该语法格式会判断条件表达式,并将条件的判断结果保存在var属性指定的变量中,而这个变量存在于scope属性所指定的范围中。
<c:if test="condition" var="name" [scope=page|request|session|application]/>
语法2:该语法格式不但可以将test属性的判断结果保存在指定范围的变量中,还可以根据条件的判断结果去执行标签体。标签体可以是JSP页面能够使用的任何元素,例如,HTML标记、Java代码或者嵌入其他JSP标签。
<c:if test="condition" var="name" [scope="范围"]>
标签体
</c:if>
参数说明:
test:必选属性,用于指定条件表达式,可以使用EL表达式。
var:可选属性,用于指定变量名,该变量名用于保存test属性的判断结果。如果该变量不存在就创建它。
scope:用于指定变量的有效范围,可选值有page、request、session、application。默认值是page。
示例:应用<c:if>标签根据是否登录显示不同的内容。
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>根据是否登录显示不同的内容</title>
</head>
<body>
<c:if var="result" test="${empty param.username}">
<form name="form1" method="post" action="">
用户名:
<input name="username" type="text" id="username">
<br>
<input type="submit" name="Submit" value="登录">
</form>
</c:if>
<c:if test="${!result}">
[${param.username }] 您好!<br/>
欢迎访问 pan_junbiao的博客!
</c:if>
</body>
</html>
执行结果:
(1)未登录时显示的信息。
(2)登录后显示的内容。
5.2 <c:choose>条件选择标签
<c:choose>标签可以根据不同的条件去完成指定的业务逻辑,如果没有符合的条件会执行默认条件的业务逻辑。<c:choose>标签只能作为<c:when>和<c:otherwise>标签的父标签,而要实现条件选择逻辑可以在<c:choose>标签中嵌套<c:when>和<c:otherwise>标签来完成。<c:choose>标签的语法格式如下:
<c:choose>
标签体<!--由<c:when>标签和<c:otherwise>标签组成-->
</c:choose>
5.3 <c:when>条件测试标签
<c:when>条件测试标签是<c:choose>标签的子标签,它根据不同的条件去执行相应的业务逻辑,可以存在多个<c:when>标签来处理不同条件的业务逻辑。<c:when>标签的语法格式如下:
<c:when test="condition">
标签体
</c:when>
参数说明:
test:为条件表达式,它可以引用EL表达式。
5.4 <c:otherwise>其他条件标签
<c:otherwise>标签也是<c:choose>标签的子标签,用于定义<c:choose>标签中的默认条件处理逻辑,如果没有任何一个结果满足<c:when>标签指定的条件,将会执行这个标签体中定义的逻辑代码。在<c:choose>标签范围内只能存在一个该标签的定义。<c:otherwise>标签的语法格式如下:
<c:otherwise>
标签体
</c:otherwise>
说明:
(1)在<c:choose>标签中,必须有一个<c:when>标签,但是<c:otherwise>标签是可选的。如果省略了<c:otherwise>标签,当所有的<c:when>标签都不满足条件时,将不会处理<c:choose>标签的标签体。
(2)<c:otherwise>标签必须定义在所有<c:when>标签的后面,也就是说,它是<c:choose>标签的最后一个子标签。
示例:实现随机抽奖功能。
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ page import="java.util.Random" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>幸运大抽奖</title>
</head>
<body>
<%--随机生成幸运号码 --%>
<%
Random rnd = new Random();
%>
<%--随机产生一个大于等于0且小于10的整数 --%>
<c:set var="luck">
<%= rnd.nextInt(10) %>
</c:set>
<%--显示幸运号码 --%>
幸运号码:<c:out value="${luck}"/>
<br/>
<%--判断抽奖结果 --%>
<c:choose>
<c:when test="${luck==1}">恭喜您,中了一等奖!</c:when>
<c:when test="${luck==2 || luck==3}">恭喜您,中了二等奖!</c:when>
<c:when test="${luck==4 || luck==5 || luck==6}">恭喜您,中了三等奖!</c:when>
<c:otherwise>谢谢您的参与!</c:otherwise>
</c:choose>
</body>
</html>
执行结果:
6、循环标签
循环是程序算法中的重要环节,有很多的算法都需要在循环中完成,例如递归算法、查询算法和排序算法都需要在循环中完成。JSTL标签库中包括:<c:forEach>和<c:forTokens>两个循环标签。
6.1 <c:forEach>循环标签
<c:forEach>循环标签可以根据循环条件,遍历数组和集合类中的所有或部分数据。<c:forEach>标签的语法格式如下。
语法1:集合成员迭代
<c:forEach items="data" [var="name"] [begin="start"] [end="finish"] [step="step"] [varStatus="statusName"]>
标签体
</c:forEach>
在该语法中,items属性是必选属性,通常使用EL指定,其他属性均为可选属性。
语法2:数字索引迭代
<c:forEach begin="start" end="finish" [var="name"] [varStatus="statusName"] [step="step"]>
标签体
</c:forEach>
在该语法中,begin和end属性是必选的属性,其它属性均为可选属性。
items:用于指定被循环遍历的对象,多用于数组与集合类。该属性的属性值可以是数组、集合类、字符串和枚举类型,并且可以通过EL表达式进行指定。
var:用于指定循环体的变量名,该变量用于存储items指定的对象成员。
begin:用于指定循环的起始位置,如果没有指定,则从集合的第一个值开始迭代,可以使用EL表达式。
end:用于指定循环的终止位置,如果没有指定,则一直迭代到集合的最后一位,可以使用EL表达式。
step:用于指定循环的步长,可以使用EL表达式。
varStatus:用于指定循环的状态变量,该属性还有4个状态属性,如下表:
变量 | 类型 | 描述 |
---|---|---|
index | Int | 当前循环的索引值,从0开始。 |
count | Int | 当前循环的循环计数,从1开始。 |
first | Boolean | 是否为第一次循环。 |
last | Boolean | 是否为最后一次循环。 |
技巧:如果在循环的过程中要得到循环计数,可以应用varStatus属性的状态属性count获得。
示例:应用<c:forEach>标签遍历List集合。
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ page import="java.util.*" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>应用<c:forEach>标签遍历List集合</title>
</head>
<body>
<%
List<String> list=new ArrayList<String>(); //创建List集合的对象
list.add("Java开发"); //向List集合中添加元素
list.add(".NET开发");
list.add("MySQL数据库");
list.add("Oracle数据库");
request.setAttribute("list",list); //将List集合保存到request对象中
%>
<b>遍历List集合的全部元素:</b><br>
<c:forEach items="${requestScope.list}" var="keyword" varStatus="id">
${id.index } ${keyword}<br>
</c:forEach>
<b>遍历List集合中第1个元素以后的元素(不包括第1个元素):</b><br>
<c:forEach items="${requestScope.list}" var="keyword" varStatus="id" begin="1">
${id.index } ${keyword}<br>
</c:forEach>
</body>
</html>
执行结果:
示例:应用<c:forEach>标签列举10以内的全部奇数。
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>应用<c:forEach>列举10以内的全部奇数</title>
</head>
<body>
10以内的全部奇数为:
<c:forEach var="i" begin="1" end="10" step="2">
${i}
</c:forEach>
</body>
</html>
执行结果:
10以内的全部奇数为: 1 3 5 7 9
6.2 <c:forTokens>迭代标签
<c:forTokens>迭代标签可以用指定的分隔符将一个字符串分割开,根据分割的数量确定循环的次数。<c:forTokens>标签的语法格式如下:
<c:forTokens items="String" delims="char" [var="name"] [begin="start"] [end="end"] [step="len"] [varStatus="statusName"]>
标签体
</c:forTokens>
items:用于指定要迭代的String对象,该字符串通常由指定的分隔符分隔。
delims:用于指定分隔字符串的分隔符,可以同时有多个分隔符。
var:用于指定变量名,该变量中保存了分隔后的字符串。
begin:用于指定迭代的起始位置。
end:用于指定迭代的终止位置。
step:用于指定迭代的步长,默认步长为1。
varStatus:用于指定循环的状态变量,同<c:forEach>标签一样,该属性还有4个状态属性。
示例:应用<c:forTokens>标签分隔字符串。
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>应用<c:forTokens>标签分隔字符串</title>
</head>
<body>
<c:set var="sourceStr" value="pan_junbiao的博客、Java Web:程序开发范例宝典、典型模块大全;Java:实例完全自学手册、典型模块大全"/>
<b>原字符串:</b><c:out value="${sourceStr}"/>
<br><b>分割后的字符串:</b><br>
<c:forTokens items="${sourceStr}" delims=":、;" var="item">
${item}<br>
</c:forTokens>
</body>
</html>
执行结果: