【1】c:foreach
<c:forEach>
标签用于通用数据循环,它有以下属性。
属 性 | 描 述 | 是否必须 | 缺省值 |
---|---|---|---|
items | 进行循环的项目 | 否 | 无 |
begin | 开始条件 | 否 | 0 |
end | 结束条件 | 否 | 集合中的最后一个项目 |
step | 步长 | 否 | 1 |
var | 代表当前项目的变量名 | 否 | 无 |
varStatus | 显示循环状态的变量 | 否 | 无 |
<c:forEach>
标签的items属性支持Java平台所提供的所有标准集合类型。
此外,您可以使用该操作来迭代数组(包括基本类型数组)中的元素。它所支持的集合类型以及迭代的元素如下所示:
java.util.Collection:调用iterator()来获得的元素。
java.util.Map:通过java.util.Map.Entry所获得的实例。
java.util.Iterator:迭代器元素。
java.util.Enumeration:枚举元素。
Object实例数组:数组元素。
基本类型值数组:经过包装的数组元素。
用逗号定界的String:分割后的子字符串。
javax.servlet.jsp.jstl.sql.Result:SQL查询所获得的行。
不论是对整数还是对集合进行迭代,<c:forEach>
的varStatus属性所起的作用相同。
和var属性一样,varStatus用于创建限定了作用域的变量(改变量只在当前标签体内起作用)。
不过,由varStatus属性命名的变量并不存储当前索引值或当前元素,而是赋予javax.servlet.jsp.jstl.core.LoopTagStatus类的实例。
该类包含了一系列的特性,它们描述了迭代的当前状态,如下这些属性的含义如下所示:
current:当前这次迭代的(集合中的)项。
index:当前这次迭代从0开始的迭代索引。
count:当前这次迭代从1开始的迭代计数。
first:用来表明当前这轮迭代是否为第一次迭代,该属性为boolean类型。
last:用来表明当前这轮迭代是否为最后一次迭代,该属性为boolean类型。
begin:begin属性的值。
end:end属性的值
step:step属性的值
遍历输出表格:
<%
List<Customer> custs2 = new ArrayList<Customer>();
custs2.add(new Customer(1,"AAA",11));//index:0
//custs2.add(new Customer(2,"AAA",11));//index:0
request.setAttribute("custs2",custs2);
%>
<!-- 遍历数据 collection -->
<table border="1">
<c:forEach items="${requestScope.custs2}" var="cust" varStatus="status">
<tr>
<td>${cust.id}</td>
<td>${cust.name}</td>
<td>${cust.age}</td>
<td>${status.index}</td>
<td>${status.count}</td>
<td>${cust.id}</td>
<td>${cust.id}</td>
</tr>
</c:forEach>
</table>
子元素为radio时:
后台是根据标签的name属性获取标签值,当遍历时,应保证每次循环的name属性不同!
<%
request.setCharacterEncoding("UTF-8");
List<Customer> custs = new ArrayList<Customer>();
custs.add(new Customer(1,"AAA",11));//index:0
custs.add(new Customer(2,"BBB",12));
custs.add(new Customer(3,"CCC",13));
custs.add(new Customer(4,"DDD",14));
request.setAttribute("custs",custs);
%>
<form action="testServlet1" method="post">
<br><br>
<c:forEach items="${custs}" var="cust" varStatus="status">
<input type="radio" name="cust${cust.id}" value="${cust.name}"/> ${cust.name}
<input type="radio" name="cust${cust.id}" value="${cust.id}"/> ${cust.id}
<input type="radio" name="cust${cust.id}" value="${cust.age}"/> ${cust.age}
<br/><br/>
</c:forEach>
<br><br>
<input type="submit" value="Submit">
</form>
测试结果如下:
【2】c:if
<c:if>标签判断表达式的值,如果表达式的值为 true 则执行其主体内容。语法格式如下:
<c:if test="<boolean>" var="<string>" scope="<string>">
...
</c:if>
<c:if>
标签有如下属性:
属性 | 描述 | 是否必要 | 默认值 |
---|---|---|---|
test | 条件 | 是 | 无 |
var | 用于存储条件结果的变量 | 否 | 无 |
scope | var属性的作用域 | 否 | page |
实例如下:
<c:set var="salary" scope="session" value="${2000*2}"/>
<c:if test="${salary > 2000}">
<p>我的工资为: <c:out value="${salary}"/><p>
</c:if>
【3】JSP指令
JSP指令用来设置整个JSP页面相关的属性,如网页的编码方式和脚本语言。
指令可以有很多个属性,它们以键值对的形式存在,并用逗号隔开。
JSP中的三种指令标签:
指令 | 描述 |
---|---|
<%@ page … %> | 定义网页依赖属性,比如脚本语言、error页面、缓存需求等等 |
<%@ include … %> | 包含其他文件 |
<%@ taglib … %> | 引入标签库的定义 |
① Page指令
Page指令为容器提供当前页面的使用说明。一个JSP页面可以包含多个page指令。
Page指令的语法格式:
<%@ page attribute="value" %>
②<%@ include与jsp:include
指令
JSP可以通过include指令来包含其他文件。被包含的文件可以是JSP文件、HTML文件或文本文件。包含的文件就好像是该JSP文件的一部分,会被同时编译执行。
Include指令的语法格式如下:
<%@ include file="文件的绝对路径或者相对路径"%>
include 指令中的文件名实际上是一个相对的 URL 地址。
如果没有给文件关联一个路径,JSP编译器默认在当前路径下寻找。
jsp:include
<jsp:include page="被包含文件的路径" flush="true/false">
<jsp:param name="参数名称" value="参数值"/>
</jsp:inclue>
flush属性含义
如果是false就意味着当这个网页完全被读进来以后才输出,如果是true,内部会有一个buffer,当buffer满了就输出,这样如果是true的时候内容是一点一点输出的。
一般只有网页很大的时候才能看出差别,不过网页输出完毕所用的总时间应该是没有什么差别的。这个东西的主要作用是做个缓冲,一点一点的呈现是有过程的,如果网页很大用户等了很久都没结果很显然是很郁闷的一件事
二者的区别
- 执行时间上的区别:
<%@ include file=”relativeURI”%> 是在翻译阶段执行(将JSP页面转换成servlet的阶段)。
<jsp:include page=”relativeURI” flush=”true” /> 在请求处理阶段执行。
- 引入内容的方式区别:
<%@ include file=”relativeURI”%>适用于引入静态文本,也可以这么理解:它是纯粹的把部分代码写到了另一页面(或者说是共享),而那另一页面中不能有相同的变量名,但可以借用主页面的内容。
<jsp:include page=”relativeURI” flush=”true” />引入执行页面或servlet所生成的应答文本。
<%@ include
为静态包含, <%@include
不论包含的是txt文本还是jsp文件,被包含的页面都不会从新编译。
<jsp:include
为动态包含, <jsp:include
如包含jsp文件,这每次加载主页面的时候,被包含的页面都要重新编译。
③ Taglib指令
JSP API允许用户自定义标签,一个自定义标签库就是自定义标签的集合。
Taglib指令引入一个自定义标签集合的定义,包括库路径、自定义标签。
Taglib指令的语法:
<%@ taglib uri="uri" prefix="prefixOfTag" %>
uri属性确定标签库的位置,prefix属性指定标签库的前缀。
④ 通常使用到的指令实例
实例如下:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt"%>
<%@ taglib uri="http://shiro.apache.org/tags" prefix="shiro"%>
⑤ jsp:forward
将当前请求转发到可以处理这个请求的文件上,这个文件可以是jsp文件,也可以是一个可以处理该请求的方法。
语法格式
<jsp:forward page={"相对路径 " | " java程序段"}>
<jsp:forward>
<jsp:param name="parameterName" value="{parameterValue | Java程序段}"/>
</jsp:forward>
【4】c:set
<c:set>
标签用于设置变量值和对象属性。<c:set>标签就是<jsp:setProperty>
行为标签的孪生兄弟。
这个标签之所以很有用呢,是因为它会计算表达式的值,然后使用计算结果来设置 JavaBean 对象或 java.util.Map 对象的值。
语法格式
<c:set
var="<string>"
value="<string>"
target="<string>"
property="<string>"
scope="<string>"/>
属性 | 描述 | 是否必要 | 默认值 |
---|---|---|---|
value | 要存储的值 | 否 | 主体的内容 |
target | 要修改的属性所属的对象 | 否 | 无 |
property | 要修改的属性 | 否 | 无 |
var | 存储信息的变量 | 否 | 无 |
scope | var属性的作用域 | 否 | Page |
如果指定了target属性,那么property属性也需要被指定。
实例如下:
<c:set var="salary" scope="session" value="${2000*2}"/>
【5】c:if在页面比较当前时间与后台传输时间
需求:在页面上比较后台传输过来的时间与当前时间。
① 首先这里需要引入标签,并获取当前时间:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt"%>
<jsp:useBean id="now" class="java.util.Date" scope="page"></jsp:useBean>
② 将上一步获取的时间对象转换为字符串
<fmt:formatDate var="nowDate" value='${now}' pattern='yyyy-MM-dd HH:mm:ss'/>
③ 然后使用c:if进行比较
<c:if test="${startTime> nowDate||endTime<nowDate}">不在时间范围内!</c:if>
【6】c:choose
<c:choose>
标签与Java switch语句的功能一样,用于在众多选项中做出选择。
switch语句中有case,而<c:choose>标签中对应有<c:when>
,switch语句中有default,而<c:choose>标签中有<c:otherwise>
。
语法格式
<c:choose>
<c:when test="<boolean>">
...
</c:when>
<c:when test="<boolean>">
...
</c:when>
...
...
<c:otherwise>
...
</c:otherwise>
</c:choose>
属性
<c:choose>
标签没有属性。<c:when>
标签只有一个属性,test。<c:otherwise>
标签没有属性。
测试实例如下
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<body>
<%-- <jsp:forward page="user/login"></jsp:forward> --%>
<c:set var="counter" value="100"/>
<c:choose>
<c:when test="${counter%2==1}">
<% out.println("it's odd"); %>
</c:when>
<c:otherwise>
<% out.println("it's even"); %>
</c:otherwise>
</c:choose>
</body>
</html>
输出结果为:it's even
(它是偶数)
这里需要说明的是,c:choose c:when c:otherwise是非正即负,即时counter属性不存在,也不会报错,而是会输出it’s even。
【7】fmt日期格式化
先在页面引入:
<%@ taglib prefix="fmt" uri="/WEB-INF/tlds/fmt.tld" %>
使用实例如下:
<td ><fmt:formatDate value="${data.updateTime}" pattern="yyyy-MM-dd HH:mm:ss"/> </td>