Java Server Pages Standard Tag Libray(JSTL):JSP 标准标签库,是一个定制标签类库的集合,用于解决一些常见的问题,例如迭代一个映射或者集合、条件测试、XML 处理,甚至数据库和访问数据库操做等。java
咱们如今只讨论 JSTL 中最重要的标签,迭代集合以及格式化数字和日期几个标签。数据库
核心标签库:apache
http://java.sun.com/jsp/jstl/core 数组
包含 Web 应用的常见工做,好比:循环、表达式赋值、基本输入输出等。session
格式化标签库:app
http://java.sun.com/jsp/jstl/fmt jsp
用来格式化显示数据的工做,好比:对不一样区域的日期格式化等。ide
为了在 JSP 页面使用 JSTL 类库,必须如下列格式使用 taglib 指令:测试
<%@taglib uri="" prefix="" %>
例如:设计
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
前缀能够是任意内容,遵循规范可使团队中由不一样人员编写的代码更加类似;因此,建议使用事先设计好的前缀。
此时须要导入两个jar 包
从Apache的标准标签库中下载的二进包(jakarta-taglibs-standard-current.zip)。
官方下载地址: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 文件拷贝到项目的指定目录下。
条件动做指令用于处理页面的输出结果依赖于某些输入值的状况,在 Java 中是利用 if、 if…else 和 switch 语句来进行处理的。在 JSTL 中也有 4 个标签能够执行条件式动做指令:if、 choose、when 和 otherwise。
if 标签先对某个条件进行测试,若是该条件运算结果为 true, 则处理它的主体内容,测试结果保存在一个 Boolean 对象中,并建立一个限域变量来引用 Boolean 对象。能够利用 var 属性设置限域变量名,利用 scope 属性来指定其做用范围。
<c:if test="<boolean>" var="<string>" scope="<string>"> ... </c:if>
if 标签有以下属性:
属性 | 描述 | 是否必要 | 默认值 |
---|---|---|---|
test | 条件 | 是 | 无 |
var | 用于存储条件结果的变量(限域变量名) | 否 | 无 |
scope | var属性的做用域<br />可取值:page|request|session|application | 否 | 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>
注:<font color="red"> JSTL中没有else标签</font>,为了模拟 else 的情景,须要使用两个 if 标签,而且这两个标签为相反的条件。
choose 和 when 标签的做用与 Java 中的 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>
<% 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>
forEach 是将一个主体内容迭代屡次,或者迭代一个对象集合。能够迭代的对象包括全部的 java.util.Collection 和 java.util.Map 接口的实现,以及对象或者基本类型的数组。他还可 以迭代 java.util.Iterator 和 java.util.Enumeration,但不能在多个动做指令中使用 Iterator 或者 Enumeration,由于 Iterator 或者 Enumeration 都不能重置(reset)。 各属性含义以下:
<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 属性
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>
JSTL 提供了格式化和解析数字和日期的标签,咱们讨论里面有:formatNumber、formatDate、parseNumber及parseDate。
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="number" 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" /> <br>
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 |
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" 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/>
parseNumber标签用来解析数字,百分数,货币。(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 |
<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>
parseDate标签用于解析日期。(将指定格式的字符串转换成Date类型。)
<fmt:parseDate value="<string>" type="<string>" dateStyle="<string>" timeStyle="<string>" pattern="<string>" var="<string>" scope="<string>"/>
属性 | 描述 | 是否必要 | 默认值 |
---|---|---|---|
value | 要显示的日期 | 是 | 无 |
type | DATE, TIME, 或 BOTH | 否 | date |
dateStyle | FULL, LONG, MEDIUM, SHORT, 或 DEFAULT | 否 | default |
timeStyle | FULL, LONG, MEDIUM, SHORT, 或 DEFAULT | 否 | default |
pattern | 自定义格式模式 | 否 | 无 |
var | 存储格式化日期的变量名 | 否 | 显示在页面 |
scope | 存储格式化日志变量的范围 | 否 | 页面 |
<fmt:parseDate value="2020-01-06" type="date" /> <br> <fmt:parseDate value="2020/01/06" pattern="yyyy/MM/dd" /> <br>