一、JSTL简介
1、JSTL介绍
JSP Standard Tag Library(JSP标准标签库,简称JSTL)是一个JSP标签集合,它封装了JSP应用的通用核心功能。
JSTL支持通用的、结构化的任务,比如迭代,条件判断,XML文档操作,国际化标签,SQL标签。 除了这些,它还提供了一个框架来使用集成JSTL的自定义标签。
根据JSTL标签所提供的功能,可以将其分为5个类别。
2、JSTL 下载架包
官网下载:http://tomcat.apache.org/taglibs/standard/
如果不使用 JSTL1.0标签,可以忽略taglibs-standard-jstlel包,taglibs-standard-compat包,应该是兼容以前版本标签库,
所以一般只需要 taglibs-standard-impl 和 taglibs-standard-spec 两个jar包,也可以不用下载,在tomcat的webapps\examples\WEB-INF\lib目录copy即可
3、使用
将架包放到项目WEB-INF\lib目录中,Build Path。新建一个jsp页面,引用JSTL标签库即可使用
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
二、核心标签
核心标签是最常用的 JSTL标签。引用核心标签库的语法如下:
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
1、一般行为标签
<c:out> | 用于在JSP中显示数据,就像<%= ... > |
<c:set> | 用于保存数据 |
<c:remove> | 用于删除数据 |
<c:catch> | 用来处理产生错误的异常状况,并且将错误信息储存起来 |
“scope” 是可选的,如果没有使用这个属性,则默认为页面作用域。具体的,当没有使用这个属性时,容器会依次在页面作用域、请求作用域、会话作用域、应用作用域查找。
scope="{page|request|session|application}"
1)<c:out> 标签
<c:out>标签用来显示一个表达式的结果,与<%= %>作用相似,
<c:out>标签会自动忽略XML标记字符,所以它们不会被当做标签来处理。
属性 | 描述 | 是否必要 | 默认值 |
---|---|---|---|
value | 要输出的内容 | 是 | 无 |
default | 输出的默认值 | 否 | 主体中的内容 |
escapeXml | 是否忽略XML特殊字符 | 否 | true |
<h4>jstl标签库</h4>
<c:out value="<要显示的数据对象(未使用转义字符)>" escapeXml="true" default="默认值"></c:out><br/>
<c:out value="<要显示的数据对象(使用转义字符)>" escapeXml="false" default="默认值"></c:out><br/>
<c:out value="${null}" escapeXml="false">使用的表达式结果为null,则输出该默认值</c:out><br/>
2)<c:set> 标签
<c:set>标签用于设置变量值和对象属性。
这个标签之所以很有用,是因为它会计算表达式的值。
属性 | 描述 | 是否必要 | 默认值 |
---|---|---|---|
value | 要存储的值 | 否 | 主体的内容 |
target | 要修改的属性所属的对象 | 否 | 无 |
property | 要修改的属性 | 否 | 无 |
var | 存储信息的变量 | 否 | 无 |
scope | var属性的作用域 | 否 | Page |
如果指定了target属性,那么property属性也需要被指定。
<c:set var="salary" scope="session" value="${2000*2}"/>
<c:out value="${salary}"/><br/>
<%
//注意导包 <%@ page import="cn.jq.myservlet.model.User"
User user = new User("李斯","1","20");
request.setAttribute("user", user);
%>
<c:if test="${user.sex=='1' }">
<c:set var="sex" value="男"></c:set>
</c:if>
<c:if test="${user.sex=='0' }">
<c:set var="sex" value="女"></c:set>
</c:if>
<c:out value="${sex}"/>
<c:remove var="sex"/>
<p>删除 sex 变量后的值: <c:out value="${sex}"/></p>
3)<c:remove> 标签:不常用
<c:remove>标签用于移除一个变量,可以指定这个变量的作用域,若未指定,则默认为变量第一次出现的作用域。
可以用来确保JSP完成清理工作。
属性 | 描述 | 是否必要 | 默认值 |
---|---|---|---|
var | 要移除的变量名称 | 是 | 无 |
scope | 变量所属的作用域 | 否 | 所有作用域 |
4)<c:catch> 标签:不常用
2、URL处理标签
<c:import> | 检索一个绝对或相对 URL,然后将其内容暴露给页面 |
<c:param> | 用来给包含或重定向的页面传递参数 |
<c:redirect> | 重定向至一个新的URL. |
<c:url> | 使用可选的查询参数来创造一个URL |
1)<c:url> 标签
<c:url>标签将URL格式化为一个字符串,然后存储在一个变量中。
<c:url>标签只是用于调用response.encodeURL()方法的一种可选的方法。优势在提供了合适的URL编码,包括<c:param>中指定的参数。
属性 | 描述 | 是否必要 | 默认值 |
---|---|---|---|
value | 基础URL | 是 | 无 |
context | 本地网络应用程序的名称 | 否 | 当前应用程序 |
var | 代表URL的变量名 | 否 | Print to page |
scope | var属性的作用域 | 否 | Page |
<c:url value="http://www.baidu.com" var="baidu">
<c:param name="id" value="11"></c:param>
</c:url>
<a href="${baidu }">
<c:out value="<c:url>" />标签生成超链接
</a>
其他不常用,需要使用百度一下就可以
3、流程控制标签
<c:if> | 与我们在一般程序中用的if一样 |
<c:choose> | 本身只当做<c:when>和<c:otherwise>的父标签 |
<c:when> | <c:choose>的子标签,用来判断条件是否成立 |
<c:otherwise> | <c:choose>的子标签,接在<c:when>标签后,当<c:when>标签判断为false时被执行 |
1)<c:if> 标签
<c:if>标签判断表达式的值,如果表达式的值为 true 则执行其主体内容。
属性 | 描述 | 是否必要 | 默认值 |
---|---|---|---|
test | 条件 | 是 | 无 |
var | 用于存储条件结果的变量 | 否 | 无 |
scope | var属性的作用域 | 否 | page |
<%
User user = new User("李斯","1","20");
request.setAttribute("user", user);
%>
<c:out value="<c:if>标签"></c:out>
<c:if test="${empty user }"><a href="/myservlet/login.jsp">亲,请登录</a></c:if>
<c:if test="${not empty user }">欢迎您,${user.username }</c:if>
2)<c:choose>, <c:when>, <c:otherwise> 标签
<c:choose>标签与Java switch语句的功能一样。
属性 | 描述 | 是否必要 | 默认值 |
---|---|---|---|
test | 条件 | 是 | 无 |
<%
User user = new User("李斯","1","20");
request.setAttribute("user", user);
%>
<c:out value="<c:choose>标签"></c:out>
<c:choose>
<c:when test="${empty user }"><a href="/myservlet/login.jsp">亲,请登录</a></c:when>
<c:otherwise>欢迎您,${user.username }</c:otherwise>
</c:choose>
<c:choose>
<c:when test="${10>2 }">10>2</c:when>
</c:choose>
4、控制迭代循环标签
1)<c:forEach> 标签
封装了Java中的for,while,do-while循环。迭代一个集合中的对象或者迭代特定次数。
属性 | 描述 | 是否必要 | 默认值 |
---|---|---|---|
items | 要被循环的信息 | 否 | 无 |
begin | 开始的元素(0=第一个元素,1=第二个元素) | 否 | 0 |
end | 最后一个元素(0=第一个元素,1=第二个元素) | 否 | Last element |
step | 每一次迭代的步长 | 否 | 1 |
var | 代表当前条目的变量名称 | 否 | 无 |
varStatus | 代表循环状态的变量名称 | 否 | 无 |
(1)List<Object>集合对象迭代
<%
User user1 = new User("张三","女","18");
User user2 = new User("李斯","男","20");
List<User> userlist = new ArrayList<>();
userlist.add(user1);
userlist.add(user2);
request.setAttribute("userlist", userlist);
%>
<c:out value="List<Object>集合对象迭代 与 c:forEach varStatus 属性:" />
<table border="1">
<tr>
<th>varStatus 属性index</th>
<th>varStatus 属性current</th>
<th>varStatus 属性count</th>
<th>用户名</th>
<th>性别</th>
<th>年龄</th>
</tr>
<c:forEach items="${userlist }" var="user" varStatus="status">
<tr>
<td>${status.index }</td>
<td>${status.current }</td>
<td>${status.count }</td>
<td>${user.username }</td>
<td>${user.sex }</td>
<td>${user.age }</td>
</tr>
</c:forEach>
</table><br/>
(2)Map<String, Object>集合对象迭代
<%
Map<String, Object> map1 = new HashMap<>();
map1.put("张三", "女");
map1.put("李斯", "男");
map1.put("王武", "男");
request.setAttribute("map1", map1);
Map<String, Object> map2 = new HashMap<>();
map2.put("userlist1", userlist);
map2.put("userlist2", userlist);
request.setAttribute("map2", map2);
%>
<c:out value="Map<String, Object>集合对象迭代" />
<table border="1">
<tr>
<th>用户名</th>
<th>性别</th>
</tr>
<c:forEach items="${map1 }" var="map1">
<tr>
<td>${map1.key }</td>
<td>${map1.value }</td>
</tr>
</c:forEach>
</table>
<table border="1">
<tr>
<th>用户名</th>
<th>性别</th>
<th>年龄</th>
</tr>
<c:forEach items="${map2 }" var="map2">
<c:if test="${map2.key == 'userlist1' }">
<c:forEach items="${map2.value }" var="user">
<tr>
<td>${user.username }</td>
<td>${user.sex }</td>
<td>${user.age }</td>
</tr>
</c:forEach>
</c:if>
</c:forEach>
</table>
(3)List<Map<String, Object>>集合对象迭代1
<%
Map<String, Object> map1 = new HashMap<>();
map1.put("张三", "女");
map1.put("李斯", "男");
map1.put("王武", "男");
List<Map<String, Object>> userlist1 = new ArrayList<>();
userlist1.add(map1);
request.setAttribute("userlist1", userlist1);
%>
<c:out value="List<Map<String, Object>>集合对象迭代1" />
<table border="1">
<tr>
<th>用户名</th>
<th>性别</th>
</tr>
<c:forEach items="${userlist1 }" var="map1">
<c:forEach items="${map1 }" var="map">
<tr>
<td>${map.key}</td>
<td>${map.value }</td>
</tr>
</c:forEach>
</c:forEach>
</table>
(4)List<Map<String, Object>>集合对象迭代2
<%
User user1 = new User("张三","女","18");
User user2 = new User("李斯","男","20");
User user3 = new User("王武","男","22");
List<User> userlist = new ArrayList<>();
userlist.add(user1);
userlist.add(user2);
userlist.add(user3);
Map<String, Object> map2 = new HashMap<>();
map2.put("userlist1", userlist);
map2.put("userlist2", userlist);
List<Map<String, Object>> userlist2 = new ArrayList<>();
userlist2.add(map2);
request.setAttribute("userlist2", userlist2);
%>
<c:out value="List<Map<String, Object>>集合对象迭代2" />
<table border="1">
<tr>
<th>用户名</th>
<th>性别</th>
<th>年龄</th>
</tr>
<c:forEach items="${userlist2 }" var="map2">
<c:forEach items="${map2 }" var="map">
<c:forEach items="${map.value }" var="user">
<tr>
<td>${user.username }</td>
<td>${user.sex }</td>
<td>${user.age }</td>
</tr>
</c:forEach>
</c:forEach>
</c:forEach>
</table>
(5)迭代特定次数
<c:out value="迭代特定次数,1到10的和:" />
<c:forEach var="i" begin="1" end="10" step="1">
<c:set var="sum" value="${sum=sum + i}"/>
</c:forEach>
<c:out value="${sum}"/>
---
迭代特定次数,1到10的和: 55
2)<c:forTokens>标签:不常用
通过指定分隔符将字符串分隔为一个数组然后迭代它们。
<c:forTokens items="google,runoob,taobao" delims="," var="name">
<c:out value="${name}"/>
</c:forTokens>
---
google runoob taobao
三、格式化标签
JSTL格式化标签用来格式化并输出文本、日期、时间、数字。引用格式化标签库的语法如下:
<%@ 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)<fmt:formatDate> 标签
<fmt:formatDate>标签用于使用不同的方式格式化日期。
属性 | 描述 | 是否必要 | 默认值 |
---|---|---|---|
value | 要显示的日期 | 是 | 无 |
type | DATE, TIME, 或 BOTH | 否 | date |
dateStyle | FULL, LONG, MEDIUM, SHORT, 或 DEFAULT | 否 | default |
timeStyle | FULL, LONG, MEDIUM, SHORT, 或 DEFAULT | 否 | default |
pattern | 自定义格式模式 | 否 | 无 |
timeZone | 显示日期的时区 | 否 | 默认时区 |
var | 存储格式化日期的变量名 | 否 | 显示在页面 |
scope | 存储格式化日志变量的范围 | 否 | 页面 |
<fmt:formatDate> 标签格式模式
代码 | 描述 | 实例 |
---|---|---|
G | 时代标志 | AD |
y | 不包含纪元的年份。如果不包含纪元的年份小于 10,则显示不具有前导零的年份。 | 2002 |
M | 月份数字。一位数的月份没有前导零。 | April & 04 |
d | 月中的某一天。一位数的日期没有前导零。 | 20 |
h | 12 小时制的小时。一位数的小时数没有前导零。 | 12 |
H | 24 小时制的小时。一位数的小时数没有前导零。 | 0 |
m | 分钟。一位数的分钟数没有前导零。 | 45 |
s | 秒。一位数的秒数没有前导零。 | 52 |
S | 毫秒 | 970 |
E | 周几 | Tuesday |
D | 一年中的第几天 | 180 |
F | 一个月中的第几个周几 | 2 (一个月中的第二个星期三) |
w | 一年中的第几周r | 27 |
W | 一个月中的第几周 | 2 |
a | a.m./p.m. 指示符 | PM |
k | 小时(12 小时制的小时) | 24 |
K | 小时(24 小时制的小时) | 0 |
z | 时区 | 中部标准时间 |
' | 转义文本 | |
'' | 单引号 |
<%
Date date = new Date();
request.setAttribute("date", date);
%>
<fmt:formatDate pattern="yyyy-MM-dd HH:mm:ss" value="${date}" />
---
2018-12-27 15:15:29
---与input结合使用
<input type="text" readonly value="<fmt:formatDate value="${date}" pattern="yyyy-MM-dd HH:mm:ss" />">
其他格式化使用到再去查
四、JSTL函数
JSTL包含一系列标准函数,大部分是通用的字符串处理函数。引用JSTL函数库的语法如下:
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions"%>
函数 | 描述 |
---|---|
fn:contains() | 测试输入的字符串是否包含指定的子串 |
fn:containsIgnoreCase() | 测试输入的字符串是否包含指定的子串,大小写不敏感 |
fn:endsWith() | 测试输入的字符串是否以指定的后缀结尾 |
fn:escapeXml() | 跳过可以作为XML标记的字符 |
fn:indexOf() | 返回指定字符串在输入字符串中出现的位置 |
fn:join() | 将数组中的元素合成一个字符串然后输出 |
fn:length() | 返回字符串长度 |
fn:replace() | 将输入字符串中指定的位置替换为指定的字符串然后返回 |
fn:split() | 将字符串用指定的分隔符分隔然后组成一个子字符串数组并返回 |
fn:startsWith() | 测试输入字符串是否以指定的前缀开始 |
fn:substring() | 返回字符串的子集 |
fn:substringAfter() | 返回字符串在指定子串之后的子集 |
fn:substringBefore() | 返回字符串在指定子串之前的子集 |
fn:toLowerCase() | 将字符串中的字符转为小写 |
fn:toUpperCase() | 将字符串中的字符转为大写 |
fn:trim() | 移除首位的空白符 |
<c:set var="theString" value="I am from runoob"/>
<c:if test="${fn:contains(theString, 'runoob')}">
<p>找到 runoob<p>
</c:if>
也不怎么常用: 可查看 菜鸟教程
好多标签都不怎么用,掌握常用的语法模板即可,其他的需要使用再去查。
ends~