JSTL标签库
JSTL(Java Server Pages Standard Tag Library)
当前JSTL版本为1.2
JSTL是为了简化JSP页面设计
JSTL将一些常用的功能使用java类来实现,通过标签在JSP页面使用
使用taglib指令,格式:
<%@ taglib prefix="prefix_name" uri="uri_path"|tagdir="tag_dir" %>
JSTL组成
功能范围 | URI | 前缀(习惯) |
---|---|---|
core | http://java.sun.com/jsp/jstl/core | c |
I18N | http://java.sun.com/jsp/jstl/fmt | fmt |
SQL | http://java.sun.com/jsp/jstl/sql | sql |
XML | http://java.sun.com/jsp/jstl/xml | x |
Functions | http://java.sun.com/jsp/jstl/functions | fn |
core和I18N是使用的最多的一组标签。
core标签库(核心标签)
核心标签是最常用的JSTL标签。引用核心标签库的语法如下:
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
通用标签
out标签(两种)
<c:out value="value" [escapeXml="{true|false}" [default="defaultvalue"] /> <c:out value="value" [escapeXml="{true|false}"> default value </c:out>
- c:前缀
- out:用来输出的标签
- value:用来输出的值
- 中括号中的内容表示可选
- escapeXml:是否需要对XML里面的特殊符号进行转义(例如尖括号),默认为true。” < “转为”& l t ;”,而” > “转为”& g t ;”。
- default表示默认值,当value为null时,将输出默认值。
set标签
<c:set value="value" var="varName" [scope="{page|request|session|application}"] /> <c:set var="varName" [scope="{page|request|session|application}"]> body content </c:set>
remove标签
<c:remove var="varName" [scope="{page|request|session|application}"]>
catch标签(没有var只是简单的处理而不保存,var保存异常,可通过var访问该异常)
<c:catch [var="varName"]> 处理代码 </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 PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>JSTL首页</title>
</head>
<body>
<%-- 如果不指定作用域,默认作用域为page --%>
<c:set value="${'<strong>test</strong>'}" var="test" />
<c:set value="${'<strong>test</strong>'}" var="test" scope="request"></c:set>
<%-- 将XML标签转义输出 --%>
pageScope: <c:out value="${pageScope.test}" escapeXml="false" /><br/>
<%-- 如果request作用域中没有此内容,输出默认值 --%>
requestScope: <c:out value="${requestScope.test}" escapeXml="false" >
<strong>default</strong>
</c:out><br/>
<h3>remove</h3>
<c:remove var="test" scope="request" />
pageScope: <c:out value="${pageScope.test}" escapeXml="false" /><br/>
requestScope: <c:out value="${requestScope.test}" escapeXml="false" >
<strong>default</strong>
</c:out><br/>
</body>
</html>
条件标签
if标签(两种形式)(test里写条件)(var存储的是条件结果,true或false)
<c:if test="testCondition" var="varName" [scope="{page|request|session|application}"] /> <c:if test="testCondition" [var="varName"] [scope="{page|request|session|application}"]> body content </c:if>
choose标签(+表示可以写多个这样的标签)(?表示这个标签可以出现也可以不出现,但是出现只能出现一次)
<c:choose> { <c:when test="testCondition"> body content </c:when> }+ { <c:otherwise> block </c:otherwise> }? </c:choose>
使用示例
一个表单(Form.jsp)
<form action="doAge.jsp" method="post">
年龄:<input type="text" name="age" />
<input type="submit" value="评测" />
</form>
doAge.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 PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>获取表单数据并判断</title>
</head>
<body>
<strong>${param.age}</strong><br/>
<c:if test="${param.age<=18}">
少年
</c:if>
<c:if test="${18<param.age && param.age<=30}">
青年
</c:if>
<c:if test="${30<param.age && param.age<=50}">
中年
</c:if>
<c:if test="${param.age>50}">
老年
</c:if>
<br/>
<c:choose>
<c:when test="${param.age<=18}">
少年
</c:when>
<c:when test="${18<param.age && param.age<=30}">
青年
</c:when>
<c:when test="${30<param.age && param.age<=50}">
中年
</c:when>
<c:otherwise>
老年
</c:otherwise>
</c:choose>
</body>
</html>
迭代标签
forEach
var:通过该变量名称来获取里面存储的值
items:迭代的内容(Collection,Iterator,Enumeration,Map)
varStatus:状态,循坏了几次
begin:开始位置
end:终止位置
step:步长<c:forEach [var="varName"] items="collection" [varStatus="varStatusName"] [begin="begin"] [end="end"] [step="step"]> body content </c:forEach>
forTokens
delims:分隔符,将items字符串数组进行分割
<c:forTokens items="stringofTokens" delims="delimiters" [var="varName"] [varStatus="varStatusName"] [begin="begin"] [end="end"] [step="step"]> body content </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 PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>迭代标签使用示例</title>
</head>
<body>
<%
int arr[]={9,8,7,6,5,4,3,2,1};
%>
<c:forEach items="<%=arr%>" var="num" varStatus="status" begin="2" end="7" step="2">
${status.count} : ${num}<br/>
</c:forEach>
<hr/>
<c:forTokens items="ab,ee;44|123" delims=",;|" var="item">
${item}<br/>
</c:forTokens>
</body>
</html>
导入及重定向标签
import(作用类似include动作,但可导入其他web内容)
*表示可以有零个或多个
url是完整的<c:import url="url" [context="context"] [var="varName"] [scope="{page|request|session|application}"] [charEncoding="charEncoding"]> {<c:param name="name" value="value" />}* </c:import>
url(使用URL重写规则构建一个URL)
context:取一个上下文名称
var:保存重写的结果
scope:设置保存的作用域<c:url value="value" [context="context"] [var="varName"] [scope="{page|request|session|application}"] [charEncoding="charEncoding"] />
使用示例
ImportTest.jsp
(根据重写的URL重定向到doAge.jsp页面,并做相关的处理,地址栏会使用重写的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 PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>导入及重定向标签示例</title>
</head>
<body>
<%-- 输出的URL后面加入了jsessionid --%>
<c:url value="doAge.jsp" var="ageURL"></c:url>
${ageURL}
<%--查看URL页面的编码,再配置合适的编码
<c:import url="http://www.baidu.com" charEncoding="UTF-8"></c:import>
--%>
<%-- 根据重写的URL重定向,并传参数 --%>
<%-- 如果使用重定向,就不要使用import标签--%>
<%-- 此重定向不仅可以定位到我们当前应用页面,也可以定位到其他web页面 --%>
<c:redirect url="${ageURL}">
<c:param name="age" value="21"></c:param>
</c:redirect>
</body>
</html>
I18N标签库
引用I18N标签库的语法如下:
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
setLocale标签
value:表示地区(zh:中文地区,en:使用英文的地区,后面可以跟具体位置,zh_CN中国大陆)
variant:表示操作系统
scope:表示作用域<fmt:setLocale value="locale" [variant="{WIN|MAX|POSIX}"] [scope="{page|request|session|application}"]>
setBundle
<fmt:setBundle basename="basename" [var="varName"] [scope="{page|request|session|application}"]>
message(输出信息,根据键输出对应的值)
bundle:绑定resourceBundle,通过EL表达式获取setBundle中的var
<fmt:message key="msgKey" [bundle="resourceBundle"] [var="varName"] [scope="{page|request|session|application}"]> {<fmt: param>body content</fmt:param>}? </fmt:message>
使用示例
在Java Resource->src文件下,新建两个键值对文件(message_zh.property,message_en.property),一个英文,一个中文(en,zh)
键值对文件的命名要求,文件名加地区加properties后缀(message_en.property, message_zh.properties)
message_zh.property内容:
title为键,后面为值(不需要双引号),输入中文自动转为Unicode码(内容为:这是一个测试页面!)
title=\u8FD9\u662F\u4E00\u4E2A\u6D4B\u8BD5\u9875\u9762\uFF01
message_zh.property内容:
title=This is a test page!
根据键取键值(浏览器设置不同的语言会显示不同语言的内容)
<%@page import="java.util.ResourceBundle"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<%-- 获取并设置地区 --%>
<fmt:setLocale value="${pageContext.request.locale}"/>
<%-- 键值对文件的命名要求,文件名加地区加properties后缀(message_en.property, message_zh.properties) --%>
<%-- basename设置键值对文件的名称,不需要加后缀也不需要加地区名 --%>
<%-- var给此个绑定命名 --%>
<<fmt:setBundle basename="message" var="msg" />
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>I18N标签库演示</title>
</head>
<body>
<%-- 获取地区 --%>
${pageContext.request.locale}
<br/><br/>
<%-- 会根据浏览器设置的语言,自动获取对应地区文件的title键对应的值 --%>
<fmt:message key="title" bundle="${msg }"></fmt:message>
<br/><br/>
<%-- 通过java代码获取 --%>
<%
ResourceBundle bundle=ResourceBundle.getBundle("message", request.getLocale());
out.print(bundle.getString("title"));
%>
</body>
</html>
formatNumber标签(格式化标签)
formatDate标签(日期格式化标签)
通过var定义的变量,保存在作用域里
<fmt:formatDate value="date" [type="{time|date|both}"] [dateStyle="{default|short|medium|long|full}"] [timeStyle="{default|short|medium|long|full}"] [pattern="customPattern"] [var="varName"] [scope="{page|request|session|application}"] />
使用示例
<%-- 格式化标签使用 --%>
<%-- 货币格式,随浏览器设置的语言而变化 --%>
<fmt:formatNumber value="123.456" type="currency" var="cury" />
${cury }
<br/>
<%-- 日期格式化,随浏览器设置的语言而变化 --%>
<fmt:formatDate value="<%=new Date() %>" type="both" var="now"/>
${now }