JSTL 简介
JSTL 提供了与页面呈现相关的逻辑判断标签,也提供了对应 JSP 标注标签的扩展标签和更多的功能标签,可以分为五类:
- 核心标签库:提供条件判断、属性访问、URL 处理及错误处理等
- I18N 兼容格式标签库:提供数字、日期等的格式化和区域、编码处理等功能
- SQL 标签库
- XML 标签库:提供 XML 解析、流程控制、转换等功能
- 函数标签库:提供常用字串处理的已定义 EL 标签库
idea 使用 JSTL 标签库:
- 在 JSTL 中下载最新的 zip 文件,解压。
- idea 中打开设置,搜索 Schemas and DTDs,点右边的 +,URL中输入 http://java.sun.com/jsp/jstl/core,浏览文件选择刚才解压后文件夹中的 tld 目录下的 c.tld 文件。
- 将 zip 文件夹中的 lib 里的文件复制到项目中的 WEB-INF 的 lib 目录下,或者在 Project Setting -> Libraries 中点+,选择 lib 文件夹里面的文件。
核心标签库
流程处理标签
1 | <c:if test="${param.name == 'momor'&& param.password == '1234'}"> |
如果 test
属性为 true,才会输出 <c:if>
标签中的语句。
1 | <c:choose> |
当 <c:when>
test 为 true 时,只会输出这个标签中的 Body 内容。否则继续判断下一个 <c:when>
标签中的 test,如果所有的 <c:when>
都不满足,就输出 <c:otherwise>
的内容(如果有这个标签)。
1 | <c:forEach var="message" items="${messageService.messages}"> |
类似 Java 中的 forEach 循环,items
属性可以是数组、Collection
、Iterator
、Enumeration
、Map
与字符串。每次会从 items
中取出元素,指定给 var
属性设置的变量。
items
属性是 Map
:
设置给 var
的对象是 Map.Entry
,有 getKey()
getValue()
方法取得键与值。
items
属性是字符串:
以逗号来切割字符串,如果要自定义切割依据可以使用<c:forTokens>
1 | <c:forTokens var="token" delims=";" items="a;b;c;d;e"> |
错误处理标签
错误发生时,在当前网页捕捉异常并显示相关信息。使用 <c:catch>
标签。
1 | <c:catch var="error"> |
用 <c:catch>
标签将可能产生异常的部分包起来,如果有异常会给 var
设值。所有的异常都是 Throwable
的子类,都有 getMessage()
方法。
网页导入、重定向、URL处理标签
包含其他 JSP 网页到当前网页的几种方式:
<%@include file="/...." %>
- 使用
<jsp:include>
标签,动态包含,还可传递参数
JSTL 中有一个 <c:import>
标签,也可以在运行时动态导入到另一个网页。
1 | <c:import url="add.jsp"> |
<c:redirect>
标签,可以重定向网页,类似 Servlet 中的 HttpServletResponse.sendRedirect()
方法,可以使用 <c:param>
标签在重定向时指定参数。
之前利用 response.encodeURL()
方法来作 URL 重写,以在关闭 Cookie 后正常维持 Session 进行会话管理,现在可以用 <c:url>
标签达到同样的目的。
属性处理与输出标签
可以用 JSTL 设置属性:
1 | <c:set var="p1q1" value="${param.p1q1}" scope="session" /> |
var
用来设置属性名,value
设置属性值(可以用 EL 表达式),如果不设置 scope
,会从 page
、request
、session
、application
的范围中查找属性名称,如果找到就在该范围设置,找不到就在page
范围新建。
移除属性:<c:remove var="login" scope="session"/>
<c:set>
可以设置 JavaBean 的属性或 Map
对象的键/值,需要使用 target
属性进行设置。
<c:set target="${pageContext.request}" property="characterEncoding" value="UTF-8" />
如果 target
属性是 JavaBean,就用 JavaBean 的 setXXX
方法为 property
设值。
如果是 Map
对象,则会以 property
为键,以 value
为值。
<c:out>
标签可以输出内容,并用合适的字符替换 <、>、”等字符。eg.<c:out value="some">
如果不想取代字符,可以设置属性 escapeXml
为 false
(默认为 true),如果输出内容的 EL 表达式结果为 null 时,不会显示任何内容,也可以加上 default
属性设置为null时的默认值。