一、JSTL简介
JSTL就是标签库 JSP Standard Tag Library,JSP标准标签库(JSTL)是一个JSP标签集合,它封装了JSP应用的通用核心功能。
JSTL支持通用的、结构化的任务,比如迭代,条件判断,XML文档操作,国际化标签,SQL标签。 除了这些,它还提供了一个框架来使用集成JSTL的自定义标签。
JSTL分为五类:core核心标签、fmt国际化标签、sql数据库标签、xml操作xml标签、fn是EL函数库
二、使用jstl步骤:
1.去官网上下载jstl的jar 1.0 1.1 1.2
2.jar包导入
jstl1.1中有两个jar包:jstl.jar、standard.jar ----- jstl.jar接口API、standard.jar代码实现,将两个jar包复制工程/WebRoot/WEB-INF/lib 目录中。
Maven引入:
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
3.在jsp页面内 通过taglib指令,引入jstl 标签库对应uri
每个标签库在jar/META-INF/ 对应一个tld文件,也即标签库的定义文件,例如:c.tld 是jstl1.1版本的、c-1_0.tld 是 jstl1.0 版本标签库
注意区分taglib导包版本:
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> 导入1.1
<%@taglib uri="http://java.sun.com/jstl/core" prefix="c" %> 导入1.0 不支持EL
<%@taglib uri="http://java.sun.com/jstl/core_rt" prefix="c" %> 导入1.0 支持EL
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> 1.2版本
<%
pageContext.setAttribute("a", 10);
%>
<c:if test="${a>8 }">
a>8
</c:if>
四、 JSTL 12个核心标签库标签
JSTL核心标签库包含了一组用于实现WEB应用中的通用操作的标签,JSP规范为核心标签库建议的前缀名为c。
1、c:out 用于将内容输出到页面上 ------- 打印常量、输出EL值、提供default默认值、HTML转义输出功能
2、c:set 用于设置一个变量或者属性 ---- 向四个数据范围保存一个数据、对四个数据范围内一个已经存在的Map或者JavaBean对象修改其属性值
3、c:remove 用于移除四个数据范围的数据
4、c:catch 相当于try-catch代码块 ----- 捕获异常,将异常对象保存到page范围的指定属性中
5、c:if 取代页面if 条件判断
6、c:choose、c:when、c:otherwise 实现if -- else if -- else效果 --- 实现 switch 效果
7、重点掌握:c:forEach 实现 foreach循环效果 ----- 遍历数组、List、Map、控制指定循环次数求和、在特殊次数进行操作
8、c:forTokens 完成字符串切割 ---> ### StringCutter.java
9、c:param 不能单独使用,通常与url相关标签一起使用 ,与c:url一起使用完成中文编码
10、c:import 导入目标页面,将目标页面内容保存起来,再进行使用
11、c:url 完成URL重写 (客户端禁用cookie ,URL重写拼接jSessionId),结合param对中文进行url编码
12 c:redirect 标签用于实现请求重定向
常用:c:set、c:if、c:forEach、c:url进行中文url编码、c:redirect
- out
<!-- 使用c:out 输出内容到浏览器 -->
<c:out value="hello jstl"></c:out>
<!-- 输出EL内容 -->
<%
pageContext.setAttribute("name", "lichunchun");
%>
<c:out value="${name }"></c:out>${name }
<hr/>
<!-- c:out有默认值 -->
<c:out value="${age }" default="age不存在"></c:out>
${(empty age)?"age不存在":age }
<hr/>
<!-- c:out支持HTML转义,escapeXml默认为true -->
<c:out value="<a href='xxx'>link</a>" escapeXml="true"></c:out>
- set
<!-- c:set 可以将数据 保存到 JSP四个数据范围 -->
<%
pageContext.setAttribute("m", 10);
request.setAttribute("n", 20);
// 都可用c:set取代
%>
<c:set value="100" var="m" scope="page" ></c:set>
<c:set value="200" var="n" scope="request" ></c:set>
${m } ${n }
<!-- c:set 可以向一个对象属性赋值,只能改变一个已经存在对象属性,不能将一个对象存入四个范围 -->
<%
Person p = new Person();
p.setName("lichunchun");
pageContext.setAttribute("p", p);
%>
<c:set target="${pageScope.p }" property="name" value="lixiaochun"></c:set>
${p.name }
- remove
<%
request.setAttribute("name", "lichunchun");
%>
${name }
<hr/>
<%--等价于 request.removeAttribute("name")--%>
<c:remove var="name" scope="request"/>
name被移除后 : ${name }
- catch
<%
try{
int d=1/0;
}catch(Exception e) {
out.print("异常被捕获了!");
}
%>
<hr/>
<!-- 异常被捕获,将异常对象保存 page范围 e2属性里 -->
<c:catch var="e2">
<%
int d2 = 1/0;
%>
</c:catch>
<!-- 通过e2 异常对象 获得异常信息 -->
异常信息:${e2.message }
- if
<%
int m = 10;
if(m >8){
out.print("m的值大于8");
}else{
out.print("m的值不大于8");
}
%>
<hr/>
<c:set var="n" value="10" scope="page"></c:set>
<!-- 将test条件结果 保存指定scope中var变量里 -->
<c:if test="${n>8 }" var="result" scope="page">
n的值大于8
</c:if>
<c:if test="${not (n>8) }">
n的值不大于8
</c:if>
${result }
- choose
<!-- 根据 数字打印星期几 -->
<c:set var="week" value="10" scope="page"></c:set>
<c:choose>
<c:when test="${week == 1}">
星期一
</c:when>
<c:when test="${week == 2}">
星期二
</c:when>
<c:when test="${week == 3}">
星期三
</c:when>
<c:otherwise>
只能输入 1 2 3 ,输入数字无效的!
</c:otherwise>
</c:choose>
- foreach
<!-- 在循环中,控制特殊循环次数处理, 将1-100数输出,每逢3倍数红色标记 ,在执行10次循环时,蓝色标记 -->
<!-- 通过status的index属性得知当前第几次循环 -->
<c:forEach begin="1" end="100" step="1" var="i" varStatus="status">
第${status.index }次循环 :
<c:if test="${status.index == 10 }">
<font color="blue">${i }</font>
</c:if>
<c:if test="${status.index != 10 }">
<!-- 判断3倍数 -->
<c:if test="${i%3 == 0 }">
<font color="red">${i }</font>
</c:if>
<c:if test="${i%3 != 0 }">
${i }
</c:if>
</c:if>
<br/>
</c:forEach>
<hr/>
<!-- 制作一定次数循环 求1-100 奇数和 -->
<c:set var="result" value="0" scope="page"></c:set>
<c:forEach begin="1" end="100" step="2" var="i">
<c:set var="result" value="${result+i }" scope="page"></c:set>
</c:forEach>
${result }
<hr/>
<%
//3、遍历map
Map map = new HashMap();
map.put("abcd","1234");
map.put("defg","5678");
pageContext.setAttribute("map", map);
%>
<c:forEach items="${map }" var="entry">
${entry.key } : ${entry.value }<br/>
</c:forEach>
<hr/>
<%
//2、遍历List
List list = new ArrayList();
list.add("aaa");
list.add("bbb");
pageContext.setAttribute("list", list);
%>
<c:forEach items="${list }" var="element">
${element }
</c:forEach>
<hr/>
<%
//1、通过c:forEach遍历一个数组
pageContext.setAttribute("arr", new int[]{1,2,3,4,5});
%>
<!-- item 遍历目标对象,var 循环每一个元素,保存page范围 -->
<c:forEach items="${arr }" var="i">
${i }
</c:forEach>
- StringTokenizer
public class S
ringCutter {
public static void main(String[] args) {
// 切割字符串 三种
String url = "mail.ustc.edu.cn?username=computer&password=20161019";
// 第一种 indexOf 结合 substring --- 目标username 是?
int index1 = url.indexOf("username=");
int index2 = url.indexOf("&");
System.out.println(url.substring(index1+"username=".length(), index2));
// 第二种 split
String[] arr = url.split("=|&");
System.out.println(arr[1]);
// 第三种 StringTokenizer
StringTokenizer stringTokenizer = new StringTokenizer(url, "=&");
int i = 0;
while(stringTokenizer.hasMoreElements()){
i++;
String str = stringTokenizer.nextToken();
if(i == 2){
System.out.println(str);
}
}
}
<c:set var="s" value="aaa,bbb,ccc" scope="page"></c:set>
<%--对 s内容 按照 , 进行分割 ,将分割后内容保存 e中--%>
<c:forTokens items="${s }" delims="," var="e">
${e }<br/>
</c:forTokens>
- import
<!-- c:import 将目标资源导入 -->
<!-- /test08/index.jsp -->
AAAA
<c:import url="/index.jsp" context="/test08"></c:import>
BBBB
<!-- 导入目标文件 ,不让显示。将目标文件内容保存 变量 -->
<c:import url="/index.jsp" context="/test08" var="content" scope="page"></c:import>
CCCC
DDDD
${content }
EEEE
- url
<!-- 对 /test08/index.jsp url重写 -->
<c:url var="encodeURL" value="/index.jsp" context="/test08" scope="page">
<!-- 结合param对中文进行url编码 -->
<c:param name="name">李春春</c:param>
</c:url>
<a href="${encodeURL }">主页</a>
<!-- <a href="/day08/index.jsp?name=%e6%9d%8e%e6%98%a5%e6%98%a5">主页</a> -->
- redirect
<c:redirect url="/index.jsp" context="/test08"></c:redirect>