JSTL
Java Server Pages Standard Tag Libray(JSTL):JSP 标准标签库,是一个定制标签类库的集合,用于解决一些常见的问题,例如迭代一个映射或者集合、条件测试、XML 处理,甚至数据库和访问数据库操作等。
核心标签库:
http://java.sun.com/jsp/jstl/core
包含 Web 应用的常见工作,比如:循环、表达式赋值、基本输入输出等
格式化标签库:
http://java.sun.com/jsp/jstl/fmt
用来格式化显示数据的工作,比如:对不同区域的日期格式化等。
为了在 JSP 页面使用 JSTL 类库,必须以下列格式使用 taglib 指令:
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
前缀可以是任意内容,遵循规范可以使团队中由不同人员编写的代码更加相似;所以,建议使用事先设计好的前缀。
此时需要导入两个jar 包
官方下载地址:http://archive.apache.org/dist/jakarta/taglibs/standard/binaries/
下载 jakarta-taglibs-standard-1.1.2.zip 包并解压,将 jakarta-taglibs-standard-1.1.2/lib/ 下的两个 jar 文件:
standard.jar 和 jstl.jar 文件拷贝到项目的指定目录下。
条件动作标签
if 标签
<c:if test="<boolean>" var="<string>" scope="<string>">
...
</c:if>
属性:
属性 | 描述 | 是否必要 | 默认值 |
---|---|---|---|
test | 条件 | 是 | 无 |
var | 用于存储条件结果的变量(限域变量名) | 否 | 无 |
scope | var属性的作用域 : 可取值:page|request|session|appliction | 否 | page |
示例
<%
request.setAttribute("flag",true);
request.setAttribute("num",1);
%>
<c:if test="${flag}">
<p>结果为true<p>
</c:if>
<c:if test="${num > 0}">
<p>num的值比0大<p>
</c:if>
注: JSTL中没有else标签,为了模拟 else 的情景,需要使用两个 if 标签,并且这两个标签为相反的条件。
choose**、**when 和 otherwise 标签
choose 和 when 标签的作用与 Java 中的 switch 和 case 关键字相似,用于在众多选项中做出选择。
属性:
choose标签没有属性。
when标签只有一个test属性。
otherwise标签没有属性
示例
<%
request.setAttribute("score", 90);
%>
<c:choose>
<c:when test="${score < 60 }">
<h3>不及格</h3>
</c:when>
<c:when test="${score >= 60 && score < 80 }">
<h3>革命尚未成功,同志仍需努力!</h3>
</c:when>
<c:otherwise>
<h3>你很棒棒哦!</h3>
</c:otherwise>
</c:choose>
注意点:
choose标签和otherwise标签没有属性,而when标签必须设置test属性
choose标签中必须有至少一个when标签,可以没有otherwise标签
otherwise标签必须放在最后一个when标签之后
choose标签中只能有when标签和otherwise标签,when标签和otherwise标签可以嵌套其他标签
otherwise标签在所有的when标签不执行的情况下才会执行
迭代标签
forEach标签
语法格式:
<c:forEach
items="<object>"
begin="<int>"
end="<int>"
step="<int>"
var="<string>"
varStatus="<string>">
</c:forEach
属性:
属性 | 描述 | 是否必要 | 默认值 |
---|---|---|---|
items | 要被循环的数据 | 否 | 无 |
begin | 开始的元素(0=第一个元素,1=第二个元素) | 否 | 0 |
end | 最后一个元素(0=第一个元素,1=第二个元素) | 否 | Last element |
step | 每一次迭代的步长 | 否 | 1 |
var | 代表当前条目的变量名称 | 否 | 无 |
varStatus | 代表循环状态的变量名称 | 否 | 无 |
forEach varStatus 属性
index: 当前这次迭代从 0 开始的迭代索引
count: 当前这次迭代从 1 开始的迭代计数
first: 用来表明当前这轮迭代是否为第一次迭代的标志
last: 用来表明当前这轮迭代是否为最后一次迭代的标志
示例:
1.遍历主体内容多次
<c:forEach begin="开始数" end="结束数" step="迭代数" var="限域变量名">
</c:forEach>
相当于java的for循环:
for(int i = 0; i < 10; i++) {
}
<!-- 遍历主体内容多次 -->
<c:forEach begin="0" end="10" var="i" >
标题${i }<br>
</c:forEach>
2.循环
<c:forEach items="被循环的集合" var="限域变量名" varStatus="当前成员对象的相关信息">
</c:forEach>
相当于java的foreach循环:
for(String str : list) {
}
<%
List<String> list = new ArrayList<String>();
for (int i = 1; i <= 10; i++) {
list.add("A:" + i);
}
pageContext.setAttribute("li", list);
%>
<!-- 循环集合 -->
<c:forEach items="${li }" 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="${li }" 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>
<!-- 循环对象集合 -->
<%
List<User> userList = new ArrayList<User>();
User user = new User(1,"zhangsan","123456");
User user2 = new User(2,"lisi","123321");
User user3 = new User(3,"wangwu","654321");
userList.add(user);
userList.add(user2);
userList.add(user3);
// 将数据设置到作用域中
request.setAttribute("userList", userList);
%>
<c:if test="${!empty userList }">
<table align="center" width="800" border="1" style="border-collapse: collapse;">
<tr>
<th>用户编号</th>
<th>用户名称</th>
<th>用户密码</th>
<th>用户操作</th>
</tr>
<c:forEach items="${userList }" var="user">
<tr align="center">
<td>${user.userId }</td>
<td>${user.uname }</td>
<td>${user.upwd }</td>
<td>
<button>修改</button>
<button>删除</button>
</td>
</tr>
</c:forEach>
</table>
</c:if>
<!-- 遍历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>
formatDate标签
formatDate标签用于使用不同的方式格式化日期。(将Date型数据转换成指定格式的字符串类型。)
语法格式
<fmt:formatDate
value="<string>"
type="<string>"
dateStyle="<string>"
timeStyle="<string>"
pattern="<string>"
timeZone="<string>"
var="<string>"
scope="<string>"/>
属性:
属性 | 描述 | 是否必要 | 默认值 |
---|---|---|---|
value | 要显示的日期 | 是 | 无 |
type | DATE, TIME, 或 BOTH | 否 | date |
dataStyle | FULL, LONG, MEDIUM, SHORT, 或 DEFAULT | 否 | default |
timeStyle | FULL, LONG, MEDIUM, SHORT, 或 DEFAULT | 否 | default |
pattern | 自定义格式模式 | 否 | 无 |
timeZone | 显示日期的时区 | 否 | 默认时区 |
var | 存储格式化日期的变量名 | 否 | 显示在页面 |
scope | 存储格式化日志变量的范围 | 否 | 页面 |
示例
<%
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" dateStyle="full"/><br/> <fmt:formatDate value="${myDate }" type="both" dateStyle="long"/><br/> <fmt:formatDate value="${myDate }" type="both" dateStyle="short"/><br/> <fmt:formatDate value="${myDate }" type="both" timeStyle="full"/><br/> <fmt:formatDate value="${myDate }" type="both" timeStyle="long"/><br/> <fmt:formatDate value="${myDate }" pattern="HH:mm yyyy/MM/dd"/><br/>