一.JSTL标签库
1.什么是JSTL
- JSTL是apache对EL表达式的扩展(也就是说JSTL依赖EL)
- JSTL是标签语言
- 与JSP动作标签一样,只不过它不是JSP内置的标签,需要我们自己导包,以及指定标签库
- 如果你使用MyEclipse开发JavaWeb,那么在把项目发布到Tomcat时,MyEclipse会在lib目录下存放jstl的jar包,所以如果没有使用MyEclipse开发就需要自己来导入这个JSTL的jar包
2.JSTL标签库
- JSTL一共包含四打标签库
- core:核心标签库
- fmt:格式化标签库
- sql:数据库标签库,过时了
- xml:xml标签库,过时了
3.使用taglib指令导入标签库
- 除了JSP动作标签外,使用其他第三方的标签库都需要
- 导包
- 在使用百千的JSP页面中使用taglib指令导入标签库
导入JSTL的core标签库
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
- prefix=”c”:指定标签库的前缀,这个前缀可以随便给值,但大家都会在使用core标签库时指定前缀为c
- uri=”http://java.sun.com/jstl/core”:指定标签库的uri,他不一定是真实存在的网址,但它可以让JSP找到标签库的描述文件
4.core标签库常用标签
- core –> c标签
A.<c:out>
:输出
<c:out value="aaa"></c:out> //输出aaa字符串常量
<c:out value="${aaa}"></c:out>//与${aaa}相同
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<%
request.setAttribute("code","<script>alert('hello wolrd');</script>");
%>
<c:out value="${code }"></c:out>
</body>
</html>
页面显示
<script>alert('hello wolrd');</script>
<c:out value="${aaa}" default="xxx"></c:out>//如果${aaa}不存在,就输出xxx字符串
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<%
request.setAttribute("code","<script>alert('hello wolrd');</script>");
%>
<c:out value="${code }" default="xxx"></c:out><br/>
<c:out value="${aaa }" default="xxx"></c:out>
</body>
</html>
页面显示
<script>alert('hello wolrd');</script>
xxx
<c:out value="${code }" default="xxx" escapeXml="false"></c:out>//当escapeXml为false是不会转换'<'和'>',这意味着很可能会受到JavaScript攻击
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<%
request.setAttribute("code","<script>alert('hello wolrd');</script>");
%>
<c:out value="${code }" default="xxx" escapeXml="false"></c:out>
</body>
</html>
效果
B.<c:set>
:设置(创建域的属性)
<c:set var="a" value="A">//向pageContext添加一个name为a,值为A的数据
<c:set var="a" value="A" scope="session">//向session添加一个name为a,值为A的数据
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<c:set var="aaa" value="AAA"></c:set>
<c:set var="bbb" value="BBB" scope="session"></c:set>
<c:set var="code" value="<script>alert('hello world')</script>" scope="request"></c:set>
<%
out.print(pageContext.getAttribute("aaa"));
out.print(session.getAttribute("bbb"));
out.print(request.getAttribute("code"));
%>
</body>
</html>
页面显示效果
C.<c:remove>
:删除域变量
- var:变量名
- scope:如果不给出scope,表示删除所有域中的该名称的变量,如果指定了域,那么只删除该域的变量
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<%
pageContext.setAttribute("a", "aa");
request.setAttribute("a","aaa");
session.setAttribute("a","aaaa");
application.setAttribute("a","aaaaa");
%>
<c:remove var="a"/>
<c:out value="${a}" default="none"></c:out>
</body>
</html>
页面显示效果
none//可见删除了所有域中的名为a的值
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<%
pageContext.setAttribute("a", "aa");
request.setAttribute("a","aaa");
session.setAttribute("a","aaaa");
application.setAttribute("a","aaaaa");
%>
<c:remove var="a" scope="page"/><!--删除了page域中的名为a的值-->
<c:out value="${a}" default="none"></c:out>
</body>
</html>
页面显示效果
aaa//request域中的值
D.<c:url>
:删除域变量
- url标签会在需要URL重写时添加sessionid
- value:指定一个路径! 它会在路径前面自动添加项目名
<c:url value="/index.jsp"/>
它会输出/项目名/index.jsp- 子标签:
<c:param>
用来给url后面添加参数,例如:
<c:url value="/index.jsp">
<c:param name="username" value="张三"/> //可以对参数进行url编码
</c:url>
- 结果为: /项目名/index.jsp?username=xxxxx…..
- var:指定变量名,一旦添加了这个属性 那么url标签就不会再输出到页面 而是把生成url保存到域中
- scope:它与var一起使用 用来保存url
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<c:url value="/AServlet"></c:url><br/>
${pageContext.request.contextPath }/AServlet<br/>
<a href="<c:url value='/index.jsp'/>">点击,返回主页</a><br/>
<c:url value="/AServlet" var="a" scope="request"></c:url>
<c:out value="${a }"></c:out><br/>
<c:url value="/index.jsp">
<c:param name="name" value="张三"></c:param>
</c:url>
</body>
</html>
页面显示效果
/javaweb10/AServlet
/javaweb10/AServlet
点击,返回主页
/javaweb10/AServlet
/javaweb10/index.jsp?name=%e5%bc%a0%e4%b8%89
E.<c:if>
- if标签的test属性必须是一个boolean类型的值,如果test的值为true,那么执行if标签的内容,否则不执行
- param表示单值参数
- paramValues表示多值参数
<c:if test="布尔类型">...</c:if> 当test为值时 执行标签体内容
F.<c:choose>
- choose标签对应Java中的if/else if/else 结构
- when标签的test为true时,会执行这个when的内容
- 当所有when标签的test都为false时,才会执行otherwise标签的内容
- param表示单值参数
- paramValues表示多值参数
<c:choose>
<c:when test="">...</c:when>
<c:when test="">...</c:when>
<c:when test="">...</c:when>
...
<c:otherwise>...</c:otherwise>
</c:choose>
等同于
if(...){
}else if(...){
}else if(...){
}else if(...){
}...
else{...}
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<c:if test="${empty param.name}">
你没有给出名为name的参数
</c:if>
<c:choose>
<c:when test="${empty param.name }">
你没有给出名为name的参数
</c:when>
<c:otherwise>
谁让你给出name的参数
</c:otherwise>
</c:choose>
</body>
</html>
G.<c:forEach>
- 它用来循环遍历数组,集合!
- 还可以用来计数方式来循环!
比如计数方式:
for(int i=1;i<=10;i++){
...
}
<c:forEach var="i" begin="1" end="10">
${i}
</c:forEach>
- var:循环变量
- begin:设置循环变量从几开始
- end:设置循环变量到几结束
- step:设置步长!等同与 java中的i++ 或i+=2 step默认为1
用来输出数组 集合
<c:forEach items="${strs}" var="str">
${str}
</c:forEach>
等同于
for(String str:strs){
}
- items:指定要循环谁,它可以是一个数组或一个集合
- var:把数组或集合中的每个元素赋值给var指定的变量
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<%
String [] strs={"one","two"};
request.setAttribute("strs",strs);
%>
<c:forEach items="${strs }" var="str">
${str}<br/>
</c:forEach>
<c:forEach items="${strs } " var="str"><!-- 此处不能有空格,对比上面和下面吧 -->
${str}<br/>
</c:forEach>
</body>
</html>
页面显示效果
one
two
[Ljava.lang.String;@905722e //上面空格造成的
- 循环状态
- 可以使用varStatus来创建循环状态变量!
- 循环状态变量有如下属性:
- count:循环元素的个数
- index:循环元素的下标
- first:是否为第一个元素
- last:是否为最后一个元素
- current:当前元素
<%@page import="java.util.ArrayList"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<%
ArrayList<String> list=new ArrayList<String>();
list.add("一");
list.add("二");
list.add("三");
pageContext.setAttribute("list",list);
%>
<c:forEach items="${list }" var="lis" varStatus="vs">
${vs.count } ${vs.index} ${vs.first} ${vs.last} ${vs.current }<br/>
</c:forEach>
</body>
</html>
页面显示效果
1 0 true false 一
2 1 false false 二
3 2 false true 三
5.fmt标签库常用标签
先导入fmt标签库
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
- 它是格式化库
- 格式日期
<fmt:formatDate value="" pattern="">
- value:指定一个Date类型的变量
- pattern:用来指定输出的模板! 例如: yyyy-MM-dd HH:mm:ss
<%@page import="java.util.Date"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<%
Date date=new Date();
request.setAttribute("date",date);
%>
<fmt:formatDate value="${requestScope.date }" pattern="yyyy:MM:dd HH:mm:ss"/>
</body>
</html>
页面显示效果
2017:05:18 14:59:46
- 格式化数字1
<fmt:formatNumber value="${num1}" pattern="0.00">//保留小数点后2位,它会四舍五入,如果不足2位,以0补齐
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<%
request.setAttribute("num1",3.14159265);
request.setAttribute("num2",3.1);
%>
<fmt:formatNumber value="${requestScope.num1}" pattern="0.00"/><br/>
<fmt:formatNumber value="${requestScope.num2}" pattern="0.00"/>
</body>
</html>
页面显示效果
3.14
3.10
- 格式化数字2
<fmt:formatNumber value="${num1}" pattern="#.##">//保留小数点后2位 它会四舍五入 如果不足2位 不会补齐
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<%
request.setAttribute("num1",3.14159265);
request.setAttribute("num2",3.1);
%>
<fmt:formatNumber value="${requestScope.num1}" pattern="#.##"/><br/>
<fmt:formatNumber value="${requestScope.num2}" pattern="#.##"/>
</body>
</html>
页面显示
3.14
3.1