本博客为原创:综合 尚硅谷(http://www.atguigu.com)的系统教程(深表感谢)和 网络上的现有资源(博客,文档,图书等),资源的出处我会标明
本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用
内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系。
本人互联网技术爱好者,互联网技术发烧友
微博:伊直都在0221
QQ:951226918
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
1.JSTL 全名为 JavaServer Pages Standard Tag Library,目前最新的版本为 1.1
2. JSTL 1.1 简介
JavaServer Pages Standard Tag Library (1.1),它的中文名称为 JSP 标准标签函数库。JSTL
是一个标准的已制定好的标签库,可以应用于各种领域,如:基本输入输出、流程控制、循环、XML
文件剖析、数据库查询及国际化和文字格式标准化的应用等。从表 7-1 可以知道,JSTL 所提供的标
签函数库主要分为五大类:
(1)核心标签库(Core tag library)
(2)I18N 格式标签库(I18N-capable formatting tag library)
(3)SQL 标签库(SQL tag library)
(4)XML 标签库(XML tag library)
(5)函数标签库(Functions tag library)
JSTL 前置名称 URI 范例
核心标签库 c http://java.sun.com/jsp/jstl/core <c:out>
I18N 格式标签库 fmt http://java.sun.com/jsp/jstl/xml <fmt:formatDate>
SQL 标签库 sql http://java.sun.com/jsp/jstl/sql <sql:query>
XML 标签库 xml http://java.sun.com/jsp/jstl/fmt <x:forBach>
函数标签库 fn http://java.sun.com/jsp/jstl/functions <fn:split>
3.使用:
1)导入相应的 jar 包 ,复制到web下的lib目录下
2) 在jsp页面中使用
在 JSP 中要使用 JSTL 中的核心标签库时,必须使用<%@ taglib %>指令,并且设定 prefix 和 uri 的值,通常设定如下:
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
4.core库的详细讲解
1)表达式操作:
①out:<c:out>主要用来显示数据的内容,就像是<%= scripting-language %> 为域对象赋属性值
<%@ 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("book", "《java》");
%> <h4>c:out</h4>
<c:out value="${requestScope.book} " default="booktitle" ></c:out>
</body>
</html>
②set:<c:set>主要用来将变量储存至 JSP 范围中或是 JavaBean 的属性中。可以为域赋属性值,其中value属性支持EL, 表达式;还可以为域对象中的JavaBean 的属性赋值,target,value 都支持El表达式
I. 语法 1:将value 的值储存至范围为 scope 的varName 变量之中<c:set value="value" var="varName" [scope="{ page|request|session|application }"]/>
II. 语法 2:将本体内容的数据储存至范围为 scope 的varName 变量之中
<c:set var="varName" [scope="{ page|request|session|application }"]>
… 本体内容
</c:set>
III.语法 3:将value 的值储存至target 对象的属性中< c:set value="value" target="target" property="propertyName" />
VI.语法 4:将本体内容的数据储存至target 对象的属性中
<c:set target="target" property="propertyName">
… 本体内容
</c:set>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%@ page import="com.jason.shoopingcart.bean.Customer" %>
<!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>
<h4>c:set</h4>
<c:set var="name" value="jason" scope="page"></c:set>
name:${pageScope.name } <!-- 测试 封装javabean -->
<%
Customer customer = new Customer();
customer.setName("Tom");
request.setAttribute("bean",customer); %>
name:${requestScope.customer.name }
<c:set target="${requestScope.customer }" property="name" value="${param.name }"></c:set>
name:${requestScope.customer.name } </body>
</html>
③remove:<c:remove>主要用来移除变量 <c:remove var="varName" [scope="{ page|request|session|application }"] />
移除指定域对象的指定属性
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%@ page import="com.jason.shoopingcart.bean.Customer" %>
<!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>
<h3>c:remove</h3>
<c:set value="1993.10" var="date" scope="session"></c:set>
date:${sessionScope.date }
<br><br>
<br><br>
<c:remove var="date" scope="session"/>
date:${sessionScope.date }**** </body>
</html>
2)流程控制
①<c:if> :<c:if>的用途就和我们一般在程序中用的 if 一样。没有else,但可以把判断的结果储存起来,以配之后使用
语法 1:没有本体内容(body) <c:if test="testCondition" var="varName" [scope="{page|request|session|application}"]/>
语法 2:有本体内容 <c:if test="testCondition" [var="varName"] [scope="{page|request|session|application}"]>
具体内容
</c:if>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%@ page import="com.jason.shoopingcart.bean.Customer" %>
<!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>
<h4>c:if</h4>
<c:set value="20" var="age" scope="request"></c:set>
<c:if test="${requestScope.age > 18 }"> 成年了</c:if> </body>
</html>
②c:choose,c:when,c:otherwise : 可以实现if ... else if... else 的效果,比较麻烦 。
其中:c:choose 以c:when, c:otherwise 的父标签出现,c:when c:otherwise 不能脱离 c:choose单独使用,c:otherwise 必须在c:when 之后使用
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%@ page import="com.jason.shoopingcart.bean.Customer" %>
<!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:choose>
<c:when test="${param.age > 60 }"> 老年 </c:when>
<c:when test="${param.age > 40 }"> 中年 </c:when>
<c:when test="${param.age > 18 }"> 青年 </c:when>
<c:otherwise> 未成年 </c:otherwise> </c:choose>
</body>
</html>
③迭代操作
I. <c:forEach> <c:forEach> 为循环控制,它可以将集合(Collection)中的成员循序浏览一遍。运作方式为当条件符合时,就会持续重复执行<c:forEach>的本体内容。
II.语法 1:迭代一集合对象之所有成员 <c:forEach [var="varName"] items="collection" [varStatus="varStatusName"] [begin="begin"] [end="end"] [step="step"]>
本体内容
< /c:forEach>
III.语法 2:迭代指定的次数 <c:forEach [var="varName"] [varStatus="varStatusName"] begin="begin" end="end" [step="step"]>
本体内容
</c:forEach>
<c:forEach> 除了支持数组之外,还有标准 J2SE 的集合类型,例如:ArrayList 、List 、LinkedList、Vector、Stack 和 Set 等等;另外还包括 java.util.Map 类的对象,例如:HashMap、
Hashtable、Properties、Provider 和 Attributes
<%@page import="java.util.HashMap"%>
<%@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"%>
<%@ page import="com.jason.shoopingcart.bean.Customer" %>
<%@ page import="java.util.List" %>
<%@ page import="java.util.Map" %>
<!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> <h4>c:forEach 可以对数组,Collection ,Map 进行遍历.begin(对于集合begin 从0开始计算),end,step</h4> <%
List<Customer> list = new ArrayList<Customer>();
list.add(new Customer("jason","西安","1","卡号15464646"));
list.add(new Customer("tom","安康","5","卡号154646"));
list.add(new Customer("jerry","西安","9","卡号1656446"));
list.add(new Customer("kobe","西安","8","卡号15456486"));
request.setAttribute("list", list);
%> <!-- 遍历collection,遍历数组同colletino -->
<c:forEach items="${requestScope.list }" var="cust" >
${cust.name }---${cust.address }---${cust.card }---${cust.cardType }<br>
</c:forEach> <c:forEach items="${requestScope.list }" var="cust" begin="1" step="2" end="5">
${cust.name }---${cust.address }---${cust.card }---${cust.cardType }<br>
</c:forEach> <br><br>
<br><br>
<br><br>
<%
Map<String , Customer> custMap = new HashMap<String , Customer>();
custMap.put("a",new Customer("jason","西安","1","卡号15464646"));
custMap.put("b",new Customer("tom","安康","5","卡号154646"));
custMap.put("b",new Customer("jerry","西安","9","卡号1656446"));
custMap.put("d",new Customer("kobe","西安","8","卡号15456486"));
request.setAttribute("custMap", custMap);
%>
<c:forEach items="${requestScope.custMap }" var="cust">
${cust.key } - ${cust.value.name } - ${cust.value.address } - ${cust.value.cardType } - ${cust.value.card }<br><br> </c:forEach> </body>
</html>
<c:forTokens> 用来浏览一字符串中所有的成员, 其成员是由定义符号(delimiters)所分隔的:
<!-- 处理字符串,用来浏览一字符串中所有的成员, 其成员是由定义符号(delimiters)所分隔的。类似于String 的 split()方法 -->
<c:set value="a,b,c,d;e,f,g;h" var="test" scope="request"></c:set>
<c:forTokens items="${requestScope.test }" delims="," var="s">
${s }<br>
</c:forTokens>
4.URL 操作:JSTL 包含三个与 URL 操作有关的标签,它们分别为:<c:import>、<c:redirect>和<c:url>。它们主要的功能是:用来将其他文件的内容包含起来、网页的导向,还有 url 的产生
①<c:import> 可 以 把 其他 静 态 或 动 态 文 件 包含 至 本 身 JSP 网 页 。包含任何页面
②<c:redirect> 使当前页面重定向到指定的页面。 / 代表的是当前的web 应用的根目
③<c:url>主要用来产生一个 URL
<!-- about url handle-->
<c:import url="http://www.baidu.com"></c:import> <!-- 转发 -->
<jsp:forward page=""></jsp:forward>
<!-- 使当前页面重定向到指定的页面。 / 代表的是当前的web 应用的根目录-->
<c:redirect url="/test.jsp"> </c:redirect> <!-- c:url 产生一个 url 地址,可以Cookie 是否可以用来智能进行 URL 重写,对 GET 请求的参数进行编码
可以把产生的url 存储在域对象的属性中,还可以使用 c:url 会对参数进行自动转码
-->
<c:url value="/test.jsp" var="testurl">
<c:param name="name" value="jason"></c:param>
</c:url>
url:${testurl }