JSTL
JSTL标签库
虽然JSTL称为“标准标签库”,实际上它由5个功能不同的标签库组成,分别是核心标签库、格式标签库、SQL标签库、XML标签库和函数标签库等。在使用这些标签之前必须在JSP页面的顶部使用<%@ taglib%>指令定义引用的标签库和访问前缀,如使用核心标签库的taglib指令格式如下:
1 | <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> |
使用格式标签库的taglib指令格式如下:
1 | <%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %> |
使用SQL标签库的taglib指令格式如下:
1 | <%@ taglib prefix="sql" uri="http://java.sun.com/jsp/jstl/sql" %> |
使用XML标签库的taglib指令格式如下:
1 | <%@ taglib prefix="xml" uri="http://java.sun.com/jsp/jstl/xml" %> |
使用函数标签库的taglib指令格式如下:
1 | <%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %> |
下面介绍JSTL提供的5个标签库。
(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:otherwise>,这些标签的基本作用如表1所示。
(2)格式标签库
格式标签库提供了一个简单的国际化标记,也称为“I18N标签库”,用于处理和解决与国际化相关的问题;另外该标签库中包含用于格式化数字和日期显示格式的标签。由于该标签库在实际项目开发中并不经常应用,所以不详细介绍。
(3)SQL标签库
SQL标签库提供了基本的访问关系型数据的能力,使用该标签可以简化对数据库的访问。如果结合核心标签库,则可以方便地获取结果集并迭代输出结果集中的数据。由于该标签库在实际项目开发中并不经常应用,所以不详细介绍。
(4)XML标签库
XML标签库可以处理和生成XML的标记,使用这些标记可以很方便地开发基于XML的Web应用。由于该标签库在实际项目开发中并不经常应用,所以不详细介绍。
(5)函数标签库
函数标签库提供了一系列字符串操作函数,用于完成分解字符串、连接字符串、返回子串,以及确定字符串是否包含特定的子串等功能。由于该标签库在实际项目开发中并不经常应用,所以不详细介绍。
表达式标签
在JSTL的核心标签库中,包括<c:out>、<c:set>、<c:remove>和<c:catch>标签4个表达式标签。
<c:out>标签
<c:out>标签用于将表达式的值输出到JSP页面中,该标签类似JSP的表达式<%=表达式%>,或者EL表达式${expression}。它有两种语法格式,一种没有标签体;另一种有标签体,这两种语言的输出结果完全相同。<c:out>标签的语法格式如下:语法1——没有标签体:
1 | <c:out value="expression" [escapeXml="true--false"] [default="defaultValue"]/> |
语法2——有标签体:
1 | <c:out value="expression" [escapeXml="true--false"] [default="defaultValue"]> |
(1)value属性:用于指定将要输出的变量或表达式,类似Object,可以使用EL。
(2)escapeXml属性:可选,用于指定是否转换特殊字符。默认值为true,表示转换。例如,将“<”转换为“< ”。可以被转换的字符如表2所示。
(3)default属性:可选,用于指定当value属性值等于null时,将要显示的默认值。如果没有指定该属性,并且value属性的值为null,该标签将输出空的字符串。
<c:set>标签
<c:set>标签用于在指定范围(page、request、session或application)中定义保存某个值的变量,或为指定的对象设置属性值。使用该标签可以在页面中定义变量,而不用在JSP页面中嵌入打乱HTML排版的Java代码。<c:set>标签的4种语法格式如下。语法1:在scope指定的范围内将变量值保存到变量中:
语法1:在scope指定的范围内将变量值保存到变量中:
1 | <c:set var="name" value="value" [scope="范围"]/> |
语法2:在scope指定的范围内将标签体保存到变量中:
1 | <c:set var="name" [scope="page--request--session--application"]> |
语法3:将变量值保存在target属性指定的目标对象的propName属性中:
1 | <c:set var="name" target="object" property="propName"/> |
语法4:将标签体保存到target属性指定的目标对象的propName属性中:
1 | <c:set target="object" property="propName"> |
(1)var属性:用于指定变量名,通过该标签定义的变量名可以通过EL指定为<c:out>的value属性值。
(2)value属性:用于指定变量值,可以使用EL。
(3)scope属性:用于指定变量的作用域,默认值是page,可选值包括page、request、session和application。
(4)target属性:用于指定存储变量值或者标签体的目标对象,可以是JavaBean或Map集合对象。
target属性不能是直接指定的JavaBean或Map,而应该是使用EL表达式或一个脚本表达式指定的对象。这个对象可以通过jsp:useBean指定。例如,要为JavaBean“CartForm”的id属性赋值,那么target属性值应该是target=”${cart}”。而不应该是target=”cart”。其中cart为CartForm的对象。
(5)property属性:用于指定目标对象保存数据的属性名。
<c:remove>标签
<c:remove>标签用于移除指定的JSP范围内的变量,其语法格式如下:
1 | <c:remove var="name" [scope="范围"]/> |
(1)var属性:用于指定要移除的变量名。
(2)scope属性:用于指定变量的有效范围,可选值有page、request、session和application,默认值是page。如果在该标签中没有指定变量的有效范围,那么将分别在page、request、session和application的范围内查找并移除要移除的变量。例如,在一个页面中存在不同范围的两个同名变量。当未指定范围时移除该变量,这两个范围内的变量均将被移除。为此在移除变量时,最好指定变量的有效范围。
当指定的要移除的变量不存在时,并不会抛出异常。
<c:catch>标签
<c:catch>标签用于捕获程序中出现的异常,如果需要,还可以将异常信息保存在指定的变量中。该标签与Java语言中的try…catch语句类似,其语法格式如下:
1 | <c:catch [var="exception"]> |
var属性为可选,用于指定保存异常信息的变量。如果不需要保存异常信息,可以省略该属性。
var属性值只有在<c:catch>标签的后面才有效,即在<c:catch>标签体中无法使用有关异常的任何信息。
URL相关标签
文件导入、重定向和URL地址生成是Web应用中常用的功能,JSTL中提供了与URL相关的标签,分别是<c:import>、<c:redirect>、<c:url>和<c:param>标签,其中<c:param>标签通常与其他标签配合使用。
<c:import>标签
<c:import>标签可以导入站内或其他网站的静态和动态文件到Web页面中,如使用该标签导入其他网站的天气信息到自己的网页中。<c:import>标签与jsp:include动作指令类似,不同是jsp:include只能导入站内资源;而<c:import>标签不仅可以导入站内资源,也可以导入其他网站的资源。
<c:import>标签的语法格式如下。
语法1:
1 | <c:import url="url" [context="context"] [var="name"] [scope="范围"] [charEncoding="encoding"]> |
语法2:
1 | <c:import url="url" varReader="name" [context="context"] [charEncoding="encoding"]> |
该语法将输出产生的URL字符串信息,如果指定了var和scope属性,不再输出相应的URL信息,而是保存在变量中以备后用。
语法2:
1 | <c:url value=:url [var="name"] [scope="范围"] [context="context"]> |
该语法不仅实现了语法1的功能,而且还可以搭配<c:param>标签完成带参数的复杂URL信息。
(1)value属性:用于指定将要处理的URL地址,可以使用EL。
(2)context属性:上下文路径,用于访问同一个服务器的其他Web工程,其值必须以“/”开头。如果指定了该属性,那么url属性值也必须以“/”开头。
(3)var属性:用于指定变量名,该变量用于保存新生成的URL字符串。
(4)scope属性:用于指定变量的存在范围。
<c:redirect>标签
<c:redirect>标签可以将客户端发出的request请求重定向到其他URL服务端,由其他程序处理客户的请求。在这个期间可以修改或添加request请求中的属性,然后把所有属性传递到目标路径。该标签的语法格式如下。
语法1:该语法格式没有标签体,并且不添加传递到目标路径的参数信息:
1 | <c:redirect url="url" [context="/context"]/> |
语法2:该语法格式将客户请求重定向到目标路径,并且在标签体中使用<c:param>标签传递其他参数信息:
1 | <c:redirect url="url" [context="/context"]> |
(1)url属性:必选,用于指定待定向资源的URL,可以使用EL。
(2)context属性:用于在使用相对路径访问外部context资源时指定资源名。
<c:param>标签
<c:param>标签用于为其他标签提供参数信息,与<c:import>、<c:redirect>和<c:url>标签组合可以实现动态定制参数,从而使标签可以完成更复杂的程序应用。该标签的语法格式如下:
1 | <c:param name="paramName" value="paramValue"/> |
(1)name属性:用于指定参数名,可以引用EL。如果参数名为null或是空,该标签将不起任何作用。
(2)value属性:用于指定参数值,可以引用EL。如果参数值为null,则作为空值处理。
流程控制标签
流程控制在程序中会根据不同条件执行不同代码来产生不同的运行结果,使用流程控制可以处理程序中的任何可能发生的事件。在JSTL中包含<c:if>、<c:choose>、<c:when>和<c:otherwise>标签共4种流程控制标签。
<c:if>标签
<c:if>标签可以根据不同条件处理不同的业务,与Java语言中的if语句类似。不过if语句没有else标签。<c:if>标签有两种语法格式。和<c:otherwise>标签可以实现if else的功能。虽然<c:if>标签没有对应的else标签,但是JSTL提供了<c:choose>、<c:when>
语法1:判断条件表达式并将判断结果保存在var属性指定的变量中,而这个变量存在于scope属性所指定的范围中:
1 | <c:if test="condition" var="name" [scope=page--request--session-application]/> |
语法2:该语法格式不但可以将test属性的判断结果保存在指定范围的变量中,而且可以根据条件的判断结果执行标签体。标签体可以是JSP页面能够使用的任何元素,如HTML标记、Java代码或者嵌入其他JSP标签:
1 | <c:if test="condition" var="name" [scope="范围"]> |
(1)test属性:必选,用于指定条件表达式,可以使用EL。
(2)var属性:可选,用于指定变量名,该变量用于保存test属性的判断结果。如果该变量不存在,则创建它。
(3)scope属性:用于指定变量的有效范围,默认值为page,可选值有page、request、session和application。
<c:choose>标签
<c:choose>标签可以根据不同条件完成指定的业务逻辑,如果没有符合条件,则执行默认条件的业务逻辑。该标签只能作为<c:when>和<c:otherwise>标签的父标签,而要实现条件选择逻辑可以在<c:choose>标签中嵌套<c:when>和<c:otherwise>标签来完成。该标签的语法格式如下:
1 | <c:choose> |
<c:choose>标签没有相关属性,只是作为<c:when>和<c:otherwise>标签的父标签来使用。并且在该标签中除了空白字符外,只能包括<c:when>和<c:otherwise>标签。
在一个<c:choose>标签中可以包含多个<c:when>标签来处理不同条件的业务逻辑,但是只能有一个<c:otherwise>标签来处理默认条件的业务逻辑。
在运行时首先判断<c:when>标签的条件是否为true。如果为true,则将<c:when>标签体中的内容显示在页面中;否则判断下一个<c:when>标签的条件。如果该标签的条件也不满足,则继续判断下一个<c:when>标签,直到<c:otherwise>标签体被执行。
<c:when>标签
<c:when>条件测试标签是<c:choose>标签的子标签,它根据不同的条件执行相应的业务逻辑。可以存在多个<c:when>标签来处理不同条件的业务逻辑,其语法格式如下:
1 | <c:when test="condition"> |
test属性为条件表达式,这是<c:when>标签必须定义的属性,它可以引用EL表达式。
在<c:choose>标签中必须有一个<c:when>标签,但是<c:otherwise>标签为可选。如果省略,当所有的<c:when>标签都不满足条件时,将不会处理<c:choose>标签的标签体。
<c:when>标签必须出现在<c:otherwise>标签之前。
<c:otherwise>标签
<c:otherwise>标签也是<c:choose>标签的子标签,用于定义<c:choose>标签中的默认条件处理逻辑。如果没有任何一个结果满足<c:when>标签指定的条件,将会执行这个标签体中定义的逻辑代码,在<c:choose>标签范围内只能存在一个该标签的定义。<c:otherwise>标签的语法格式如下:
1 | <c:otherwise> |
<c:otherwise>标签必须定义在所有<c:when>标签的后面,即它是<c:choose>标签的最后一个子标签。
循环标签
<c:forEach>标签
<c:forEach>循环标签可以根据循环条件遍历数组和集合类中的所有或部分数据,如在使用Hibernate技术访问数据库时返回的数组、java.util.List和java.util.Map对象。它们封装了从数据库中查询的数据,这些数据都是JSP页面需要的。如果在JSP页面中使用Java代码来循环遍历所有数据,会使页面非常混乱,不易分析和维护。使用JSTL的<c:forEach>标签循环显示这些数据不但可以解决JSP页面混乱的问题,而且也提高了代码的可维护性。
<c:forEach>标签的语法格式如下。
语法1:集合成员迭代:
1 | <c:forEach items="data" [var="name"] [begin="start"] [end="finish"] [step="step"] [varStatus="statusName"]> |
其中items属性是必选属性,通常使用EL指定,其他属性均为可选属性。
语法2:数字索引迭代:
1 | <c:forEach begin="start" end="finish" [var="name"] [varStatus="statusName"] [step="step"]> |
其中begin和end属性是必选的属性,其他属性均为可选属性。
(1)items属性:用于指定被循环遍历的对象,多用于数组与集合类。其值可以是数组、集合类、字符串和枚举类型,并且可以通过EL指定。
(2)var属性:用于指定循环体的变量名,该变量用于保存items指定的对象的成员。
(3)begin属性:用于指定循环的起始位置,如果没有指定,则从集合的第1个值开始迭代。可以使用EL。
(4)end属性:用于指定循环的终止位置,如果没有指定,则一直迭代到集合的最后一位。可以使用EL。
(5)step属性:用于指定循环的步长,可以使用EL。
(6)varStatus属性:用于指定循环的状态变量,该属性还有4个状态属性,如表3所示。如果要在循环的过程中得到循环计数,可以应用varStatus属性的状态属性count。
(7)标签体:可以是JSP页面中可显示的任何元素。
<c:forTokens>标签
<c:forTokens>迭代标签可以用指定的分隔符分割一个字符串,根据分割的数量确定循环的次数,其语法格式如下:
1 | <c:forTokens items="String" delims="char" [var="name"] [begin="start"] [end="end"] [step="len"] [varStatus="statusName"]> |
(1)items属性:用于指定要迭代的String对象,该字符串通常由指定的分隔符分隔。
(2)delims属性:用于指定分隔字符串的分隔符,可以同时有多个分隔符。
(3)var属性:用于指定变量名,该变量保存分隔后的字符串。
(4)begin属性:用于指定迭代开始的位置,索引值从0开始。
(5)end属性:用于指定迭代的结束位置。
(6)step属性:用于指定迭代的步长,默认步长为1。
(7)varStatus属性:用于指定循环的状态变量,同<c:forEach>标签,该属性也有4个状态属性。
(8)标签体:可以是JSP页面可显示的任何元素。