什么是JSTL
JSTL是apache对EL表达式的扩展(也就是说JSTL依赖EL),JSTL是标签语言!
JSTL标签使用以来非常方便,它与JSP动作标签一定,只不过它不是JSP内置的标签,需要我们自己导包,以及指定标签库而已!
JSTL标签库
JSTL一共包含四大标签库:
- core:核心标签库,我们学习的重点;
- fmt:格式化标签库,只需要学习两个标签即可;
- sql:数据库标签库,不需要学习了,它过时了;
- xml:xml标签库,不需要学习了,它过时了。
使用taglib指令导入标签库
除了JSP动作标签外,使用其他第三方的标签库都需要:
1、导包;(jstl.jar、standard.jar)
2、在使用标签的JSP页面中使用taglib指令导入标签库;<%@ taglib prefix="c" uri="http://java.sun.com/jstl/core" %>
prefix="c":指定标签库的前缀,这个前缀可以随便给值,但大家都会在使用core标签库时指定前缀为c;
uri="http://java.sun.com/jstl/core":指定标签库的uri,它不一定是真实存在的网址,但它可以让JSP找到标签库的描述文件;
core标签库常用标签
1)out
语法: <c:out value=”值/EL表达式” >
可选属性: Default: 默认值, escapeXml: 当escapeXml为false,不会转换“<”、“>”。
这可能会受到JavaScript攻击,与EL表达式的结果一样, 为true, 转换“<”、“>”, 浏览器不会解析为js代码. 默认值true
<c:out value="${str }" default="没有数据" escapeXml="false"></c:out>
2) Set标签: 往域中存放数据, 等同于 setAttribute()
语法:<c:set var=”属性名” value=”属性值”>
可选属性: scope : 往哪一个域中存放数据, 默认page域
<c:set var="str" value="requestStr" scope="request" ></c:set>
3) remove 删除域中数据, 等同于 removeAttribute()
语法: <c:remove var=”删除的属性名”> 表示全域删除
可选属性: scope: 删除指定域
<c:remove var="str" scope="page"/>
4) Url 构建url
语法: <c:url value=”/路径”> 只要以”/”开头, 自动加/项目名
<c:url value="/xxx?name=xx&age=21"></c:url> <!-- 待参数(传值可加一个a标签) --> <c:url value="/xxx"> <c:param name="name" value="lisi"></c:param> <c:param name="age" value="23"></c:param> </c:url>
5)if标签 条件标签, 没有else ***
语法: <c:if test=”条件”>
//.... 其他标签
</c:if>
<c:if test="${3>2}"> <h1>3大于2</h1> </c:if>
6)Choose 等同于 if else if else if ..... else ***
choose标签对应Java中的if/else if/else结构。when标签的test为true时,会执行这个when的内容。
当所有when标签的test都为false时,才会执行otherwise标签的内容。
<c:set var="score" value="${param.score }"/> <c:choose> <c:when test="${score > 100 || score < 0}">错误的分数:${score }</c:when> <c:when test="${score >= 80 }">A级</c:when> <c:when test="${score >= 60 }">B级</c:when> <c:otherwise>C级</c:otherwise> </c:choose>
7)forEach 标签 ***
A. 普通for循环 ,类似for(int i = 0; i<10;i++)
语法: <c:foreach var=”循环变量名” begin=”开始值” end=”结束值”> step: 步长, 默认值1 , 每次加1
<c:forEach var="i" begin="0" end="10" step="2"> ${i } <br/>
</c:forEach>
B.增强for循环,类似for(Object o : 集合);
遍历集合或数组方式: <% String[] names = {"zhangSan", "liSi", "wangWu", "zhaoLiu"}; pageContext.setAttribute("ns", names); %> <c:forEach var="item" items="${ns }"> <c:out value="name: ${item }"/><br/> </c:forEach>
遍历List <% List<String> names = new ArrayList<String>(); names.add("zhangSan"); names.add("liSi"); names.add("wangWu"); names.add("zhaoLiu"); pageContext.setAttribute("ns", names); %> <c:forEach var="item" items="${ns }"> <c:out value="name: ${item }"/><br/> </c:forEach>
遍历Map <% Map<String,String> stu = new LinkedHashMap<String,String>(); stu.put("number", "N_1001"); stu.put("name", "zhangSan"); stu.put("age", "23"); stu.put("sex", "male"); pageContext.setAttribute("stu", stu); %> <c:forEach var="item" items="${stu }"> <c:out value="${item.key }: ${item.value }"/><br/> </c:forEach>
forEach标签还有一个属性:varStatus,这个属性用来指定接收“循环状态”的变量名,
例如:<forEach varStatus=”vs” …/>,这时就可以使用vs这个变量来获取循环的状态了。
- count:int类型,当前以遍历元素的个数;
- index:int类型,当前元素的下标;
- first:boolean类型,是否为第一个元素;
- last:boolean类型,是否为最后一个元素;
- current:Object类型,表示当前项目。
<c:forEach var="item" items="${ns }" varStatus="vs"> <c:if test="${vs.first }">第一行:</c:if> <c:if test="${vs.last }">最后一行:</c:if> <c:out value="第${vs.count }行: "/> <c:out value="[${vs.index }]: "/> <c:out value="name: ${vs.current }"/><br/> </c:forEach>
8)重定向标签
语法: <c:redirect url="">
<!-- 重定向标签 JSTL标签, url 写的以/开头, 自动添加/项目名 url:底层使用的c:url, 自动把jsessionId 通过url 带回到服务器, URL重写 Session: 把SessionId存在客户端: 1) Cookie 2) URL重写, sessionId通过url传递 --> <%-- <c:redirect url="/demo2.jsp?name=zs&age=21"></c:redirect> --%> <%-- <c:redirect url="/demo2.jsp"> <c:param name="name" value="lisi"></c:param> <c:param name="age" value="21"></c:param> </c:redirect> --%>
9)转发
转发: <jsp:forward page=”转发的资源路径”> 请求转发,
fmt标签库
必须先导入:<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt"%>
1)日期格式化
语法: <fmt:formatDate value="${now }" pattern="yyyy-MM-dd "/>
value: 值
pattern: 格式化字符串
<% Date now = new Date(); request.setAttribute("now", now); %> <fmt:formatDate value="${now }" pattern="yyyy-MM-dd "/>
2)数字格式化
保留多少位小数位, 四舍五入
格式字符串 : 0表示任意字符串, 小数位位数不够, 使用0补位
#表示任意字符串 小数位位数不够, 不会使用0补位
<% double d = 12.3; request.setAttribute("d", d); %> <fmt:formatNumber value="${d }" pattern="0.00"></fmt:formatNumber> <fmt:formatNumber value="${d }" pattern="#.##"></fmt:formatNumber>
0.00 --> 12.30
#.## --> 12.3