欢迎来到我的主页:【一只认真写代码的程序猿】
本篇文章收录于专栏【JSP相关】
如果这篇文章对你有帮助,希望点赞收藏加关注啦~
本文所有内容相关代码都可在以下仓库中找到:
https://github.com/Echo-Nie/JSPLearn
1 JSTL
1.1 标签使用
Java Server Pages Standard Tag Libray(STL):JSP 标准标签库。
是一个定制标签类库的集合,用于解决一些常见的问题,例如迭代一个映射或者集合、条件测试、XML处理,甚至数据库和访问数据库操作等。
核心标签库:包含web常见工作,如循环、表达式赋值、基本输入输出等。
格式化标签库:用来格式化显示数据的工作,比如:对不同区域的日期格式化。
要在JSP中使用JSTL类库,必须使用下面的taglib指令:
<%@taglib uri="" prefix="" %>
如:
<%@taglib uri="http://java.sun.com/jsp/jstl/cire" prefix="c" %>
前缀可以是任意内容,遵循规范形成相同的码风会比较好,使用实现设计好的前缀即可。
在官网(Index of /dist/jakarta/taglibs/standard/binaries)下载好Jakarta-taglib-standard-1.1.2.zip解压后将lib下的两个jar包拷贝到指定目录下
1.2 条件动作标签
条件动作指令用于处理页面的输出结果依赖于某些输入值的情况,在lava 中是利用 if、 if..else 和 switch 语句来进行处理的。在JSTL中也有4个标签可以执行条件式动作指令:if、choose、when和otherwise。
if标签
if它的主体内容,测试结果保存在一个Boolean 对象中,并创建一个限域变量来引用 Boolean 对象。可以利用 var 属性设置限域变量名,利用 scope 属性来指定其作用范围。
<c:if test="<boolean>" var="<string>" scope="<string>">
...
</c:if>
<html>
<head>
<title>JSTL的使用</title>
<%--
首先拷贝两个jar包到web-INF的lib目录下;再导入jst和standard的jar包到项目中
--%>
</head>
<body>
<c:if test="${1==1}">
Hello JSTL
</c:if>
<%
request.setAttribute("num", 10);
request.setAttribute("num1", 10);
%>
<c:if test="${num>0}">
数据大于0
</c:if>
<br>
<c:if test="${num>100}" var="flag" scope="request"></c:if>
${flag}--${pageScope.flag}${requestScope.flag}--${sessionScope.flag}
<c:if test="${num1>20}" var="flag1" scope="request"></c:if>
${flag1}--${requestScope.flag1}--${sessionScope.flag1}
<%-- false--false-- --%>
<%--
test条件判断,操作的是域对象,接受返回结果是boolean类型的值
var是限域对象,存放在作用域中的变量名,用来接受判断结果的值
scope是限域变量名的范围,page-request-session-application
--%>
</body>
</html>
属性 | 描述 | 是否必要 | 默认值 |
---|---|---|---|
test | 条件 | 是 | 无 |
var | 用于存储条件结果的变量(限域变量名) | 否 | 无 |
scope | 可取值:page|request|session|application | 否 | page |
choose-when-otherwise标签
相当于就是switch-case;choose 和 when 标签的作用与lava 中的 switch 和 case 关键字相似,用于在众多选项中做出选择。也就是说:他们为相互排斥的条件式执行提供相关内容。
switch语句中有case,而choose标签中对应有when,switch语句中有default,而choose标签中有otherwise.
<c:choose>
<c:when test="<boolean>">
...
</c:when>
<c:when test="<boolean>">
...
</c:when>
...
<c:otherwise>
...
</c:otherwise>
</c:choose>
1.3 迭代标签
forEach 是将一个主体内容迭代多次,或者迭代一个对象集合。可以迭代的对象包括所有的java.util.Collection 和java.util.Map 接口的实现,以及对象或者基本类型的数组。
还可 以迭代java.util.lterator 和 java.util.Enumeration,但不能在多个动作指令中使用 lterator 或者 Enumeration,因为lterator 或者 Enumeration都不能重置(reset)。各属性含义如下:
属性 | 描述 | 是否必要 | 默认值 |
---|---|---|---|
items | 要被循环的数据 | 否 | 无 |
begin | 开始的元素(0=第一个元素,1=第二个元素) | 否 | 0 |
end | 最后一个元素(0=第一个元素,1=第二个元素) | 否 | Lastelement |
<c:forEach
items="<object>"
begin="<int>"
end="<int>"
step="<int>"
var="<string>
varstatus="<string>"
</c:forEach>
<!-- 遍历主体内容多次 -->
<c:forEach begin="0" end="10" var="i">
标题 $ti<br>
</c:forEach>
<!-- 循环 -->
<%
List<String> list = new ArrayList<String>();
for (int i = 1; i <= 10; i++) {
list.add("A:" + i);
}
pageContext.setAttribute("li", list);
%>
<!-- 循环集合 -->
<c:forEach items="${1i}" var="item">
${item}
</c:forEach>
<hr>
<table align="center" width="800" border="1" style="border-collapse: collapse;">
<tr>
<th>名称</th>
<th>当前成员下标</th>
<th>当前成员循环数</th>
<th>是否第一次被循环</th>
<th>是否最后一次被循环</th>
</tr>
<c:forEach items="${1i}" var="item" varStatus="itemp">
<tr>
<td>${item}</td>
<td>${itemp.index}</td>
<td>${itemp.count}</td>
<td>${itemp.first}</td>
<td>${itemp.last}</td>
</tr>
</c:forEach>
</table>
<!-- 遍历Map -->
<%
Map<String, Object> map = new HashMap<String, Object>();
map.put("map1", "aaa");
map.put("map2", "bbb");
map.put("map3", "ccc");
pageContext.setAttribute("map", map);
%>
<c:forEach items="${map}" var="mymap">
键:${mymap.key} -- 值:${mymap.value} <br>
</c:forEach>
2 格式化动作标签(偏)
JSTL提供了格式化和解析数字和日期的标签,我们讨论里面有:formatNumber、formatDate、parseNumber及parseDate.
2.1 formatNumber
用于格式化数字,百分比,货币。该标签用指定的格式或精度来格式化数字,将数值型数据转换成指定格式的字符串类型。语法模板如下:
<fmt :formatNumber
value="<string>"
type="<string>"
var="<string>"
scope="<string>"/>
属性 | 描述 | 是否必要 | 默认值 |
---|---|---|---|
value | 要显示的数字 | 是 | 无 |
type | number,currency, 或 percent类型 | 否 | Number |
var | 存储格式化数字的变量 | 否 | Print to page |
scope | var属性的作用域 | 否 | page |
<fmt:formatNumber value="10" type="currency" var="num"/> ${num} <br>
<fmt:formatNumber value="10" type="percent" /><br>
<fmt:formatNumber value="10" type="currency" /><br>
<%--设置时区--%>
<fmt:setLocale value="en_US"/>
<fmt:formatNumber value="10" type="currency"/>
2.2 formatDate
标签用于使用不同的方式格式化日期。将Rate型数据转换成指定格式的字符串类型。
属性 | 描述 | 是否必要 | 默认值 |
---|---|---|---|
value | 要显示的日期 | 是 | 无 |
type | DATE, TIME, 或 BOTH | 否 | date |
dateStyle | FULL, LONG, MEDIUM, SHORT, 或 DEFAULT | 否 | default |
timeStyle | FULL, LONG, MEDIUM, SHORT, 或 DEFAULT | 否 | default |
pattern | 自定义格式模式 | 否 | 无 |
timeZone | 显示日期的时区 | 否 | 默认时区 |
var | 存储格式化日期的变量名 | 否 | 页面 |
scope | 存储格式化日志变量的范围 | 否 | 页面 |
代码 | 描述 | 实例 |
---|---|---|
y | 年份小于10,显示不具有前导零的年份。 | 2002 |
M | 月份数字。一位数的月份没有前导零。 | April & 04 |
d | 月中的某一天。一位数的日期没有前导零。 | 20 |
h | 12小时制的小时。一位数的小时数没有前导零。 | 12 |
H | 24小时制的小时。一位数的小时数没有前导零。 | 0 |
m | 分钟。一位数的分钟数没有前导零。 | 45 |
s | 秒。一位数的秒数没有前导零。 | 52 |
<%--格式化日期--%>
<%
request.setAttribute("myDate",new Date());
%>
${myDate} <br>
<fmt:formatDate value="${myDate}"/> <br>
<fmt:formatDate value="${myDate}" type="date"/> <br>
<fmt:formatDate value="${myDate}" type="time"/> <br>
<fmt:formatDate value="${myDate}" type="both"/> <br>
<fmt:formatDate value="${myDate}" type="both"/> <br>
<fmt:formatDate value="${myDate}" type="both" dateStyle="FULL"/> <br>
<fmt:formatDate value="${myDate}" type="both" dateStyle="short"/> <br>
<fmt:formatDate value="${myDate}" pattern="yyyy-MM-dd"/> <br>
2.3 parseNumber与Date
parseNumber标签用来解析数字,百分数,货币。将数字、货币或百分比类型的字符串转换成数值型。
<fmt:parseNumber
value="<string>"
type="<string"
var="<string>"
scope="<string>"/>
属性 | 描述 | 是否必要 | 默认值 |
---|---|---|---|
value | 要解析的数字 | 否 | Body |
type | NUMBER, CURRENCY, 或 PERCENT | 否 | number |
var | 存储待解析数字的变量 | 否 | Print to page |
scope | var属性的作用域 | 否 | page |
<%--parseNumber的使用--%>
<%--<fmt:setLocale value="zh_CN"/>--%>
<%--转换回中国时区,就可以用¥--%>
<fmt:parseNumber value="100"/><br>
<fmt:parseNumber value="100" type="number"/><br>
<fmt:parseNumber value="100%" type="percent"/><br>
<fmt:parseNumber value="$10.00" type="currency"/><br>
<%--因为前面设置了US时区,这里不能用“¥”,会报错,必须用对应时区的货币标识符才可以--%>
parseDate:解析日期,把指定格式的字符串转成日期。
<fmt:parseDate value="2024-12-11" type="date"/><br>
<fmt:parseDate value="2024/12/11" pattern="yyyy/MM/dd"/><br>