1、JSTL 簡介
(1)JavaServer Pages Standard Tag Library
(2)由JCP(Java Community Process)指定標準
(3)提供給 Java Web 開發人員一個標準通用的標籤函數庫
(4)和 EL 配合來取代傳統直接在頁面上嵌入 Java 程序(Scripting)的做法,以提高程序可讀性、維護性和方便性
2、JSTL1.1安裝
(1)下載
JSTL 主要由Apache組織的Jakarta Project 實現
http://tomcat.apache.org/taglibs/standard/
容器必須支持Servlet 2.4 且JSP 2.0 以上版本
JavaEE1.4
(2)安裝
解壓縮後將lib 中的jstl.jar、standard.jar 複製到WEB應用程序的WEB-INF\lib 下
3、JSTL標籤庫
(1)核心標籤庫 (core) --- c
(2)國際化標籤 fmt
(3)數據庫標籤 sql --Servlet
(4)XML標籤 xml
(5)JSTL函數(EL函數) el
4、<c:out>標籤
<c:out> 標籤用於輸出一段文本內容到pageContext對象當前保存的“out”對象中。
1.c:out 輸出內容到瀏覽器端
輸出固定值
<c:out value="Hello c out~"/>
輸出變量
<c:out value="${m}"/>
轉義html,默認爲轉義,可以設置escapeXml屬性爲false,禁止轉義
<c:out value="<a href='#'>link</a>" escapeXml="false"/>
允許輸出默認值,如果給定值不存在,輸出默認值
<c:out value="${city}" default="北京"/>
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
</head>
<body>
<hr><h1>進行html轉義輸出</h1>
<a href="#">xxx</a>
<c:out value="<a href='#'>xxx</a>" escapeXml="true"></c:out>
${fn:escapeXml("<a href='#'>xxx</a>") }
<hr><h1>輸出默認值</h1>
<%
String age = "100";
pageContext.setAttribute("age",age);
%>
<c:out value="${age}" default="99"></c:out>
${empty age ? 99 : age }
<hr><h1>輸出變量</h1>
<%
String name = "itheima";
pageContext.setAttribute("name",name);
%>
<c:out value="${name}"></c:out>
${name }
<hr><h1>輸出常量</h1>
<c:out value="123456"></c:out>
${123456 }
</body>
</html>
5、<c:set>標籤
<c:set>標籤用於把某一個對象存在指定的域範圍內,或者設置Web域中的java.util.Map類型的屬性對象或JavaBean類型的屬性對象的屬性。
2.c:set 設置值到四個域,設置四個範圍中的java對象的屬性性
在指定域中增加、修改屬性
<c:set var="name" value="value" scope="page"/>
設置一個保存在四個範圍的java對象的屬性值,cset不能設置對象進域,但是可以更改域中對象的屬性
<c:set targe="${person}" property="name" value="lisi"/>
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%@page import="com.itheima.domain.Person"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
</head>
<body>
<hr><h1>設置JavaBean的屬性</h1>
<%
Person p = new Person();
pageContext.setAttribute("p",p);
%>
<c:set target="${p}" property="name" value="小昭"></c:set>
${p.name }
<c:set target="${p}" property="name" value="趙敏"></c:set>
${p.name }
<hr><h1>向指定的Map中增加/修改屬性</h1>
<%
Map map = new HashMap();
map.put("name","張無忌");
map.put("age",19);
pageContext.setAttribute("map",map);
%>
<c:set target="${map}" property="sex" value="男"></c:set>
${map.sex }
<c:set target="${map}" property="sex" value="女"></c:set>
${map.sex }
<hr><h1>向指定的域中增加/修改屬性</h1>
<c:set var="name" scope="page" value="張三丰"></c:set>
${name }
<c:set var="name" scope="page" value="張翠山"></c:set>
${name }
</body>
</html>
6、<c:remove>標籤
<c:remove>標籤用於刪除各種Web域中的屬性。
其語法格式如下:
<c:remove var="varName"
[scope="{page|request|session|application}"] />
3.c:remove用來刪除四個域中的值
<c:remove var="age" scope="page"/>
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
</head>
<body>
<hr><h1>cremove可以刪除各個域中的屬性,如果不寫scope屬性,cremove的時候會將四個域中指定名稱的屬性都刪掉</h1>
<%
pageContext.setAttribute("room","310");
request.setAttribute("room","311");
%>
${room }${requestScope.room }
<c:remove var="room"/>
${room }
</body>
</html>
7、<c:catch>標籤
(1)<c:catch>標籤用於捕獲嵌套在標籤體中的內容拋出的異常,其語法格式如下:<c:catch [var="varName"]>nested actions</c:catch>
(2)var屬性用於標識<c:catch>標籤捕獲的異常對象,它將保存在page這個Web域中。
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ page contentType="text/html;charset=gb2312" %>
<c:catch var="myex“ >
<%
10/0;
%>
</c:catch>
異常:<c:out value="${myex}" /> ${myex}<br />
異常 myex.getMessage:<c:out value="${myex.message}" /><br />
異常 myex.getCause:<c:out value="${myex.cause}" /><br />
異常 myex.getStackTrace:<c:out value="${myex.stackTrace}" />
4.c:catch 用來捕獲程序的異常,將捕獲到的異常對象保存在page域中
<c:catch var="e">
<%
String s = null;
s.charAt(1);
%>
</c:catch>
${e.message}
8、<c:if>標籤
<c:if test=“”>標籤可以構造簡單的“if-then”結構的條件表達式
5.c:if 用來取代頁面中if語句,請記住,沒有c:else,想要寫else,只能再寫個c:if,然後條件是反的
<c:if test="${n>5}"></c:if>
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
</head>
<body>
<c:if test="${1 == 1}" var="flag" scope="page">
1確實等於1
</c:if>
${pageScope.flag }
<c:if test="${1 != 1}">
你確定嗎?
</c:if>
</body>
</html>
9、<c:choose>標籤
<c:choose>標籤用於指定多個條件選擇的組合邊界,它必須與<c:when>和<c:otherwise>標籤一起使用。使用<c:choose>,<c:when>和<c:otherwise>三個標籤,可以構造類似 “if-else if-else” 的複雜條件判斷結構。
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ page contentType="text/html;charset=gb2312" %>
<c:set value="${param.count}" var="count“ /> pageContext(count,2)
<c:choose>
<c:when test="${count == 0}">
對不起,沒有符合您要求的記錄。
</c:when>
<c:otherwise>
符合您要求的記錄共有${count}條.
</c:otherwise>
</c:choose>
6.c:choose c:when c:otherwise 一起使用,取代if elseif else 或 swich case
<c:choose>
<c:when test="${weekday==1}">
星期一
</c:when>
<c:when test="${weekday==1}">
星期二
</c:when>
<c:when test="${weekday==1}">
星期三
</c:when>
<c:otherwise>
輸入無效
</c:otherwise>
</c:choose>
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
</head>
<body>
<%
pageContext.setAttribute("num",99);
%>
<c:choose>
<c:when test="${num>100}">
num 大於100
</c:when>
<c:when test="${num<100}">
num 小於 100
</c:when>
<c:when test="${num == 100}">
num 等於 100
</c:when>
<c:otherwise>
num 是一個數字嗎?
</c:otherwise>
</c:choose>
</body>
</html>
10、<c:forEach>標籤
語法1:
<c:forEach [var="varName"]
items="collection" [varStatus="varStatusName"]
[begin="begin"]
[end="end"]
[step="step"]>
//Body內容
</c:forEach>
public int getIndex()返回當前迭代的索引號
public java.lang.Integer getStep()返回爲標籤設置的step屬性的值,如果沒有設置step屬性則返回null
public boolean isFirst()返回當前是否是第一次迭代操作
public boolean isLast()返回當前是否是最後一次迭代操作
數組的遍歷:將arr數組中的每個元素取出,保存到page域的i中
<c:forEach var="i" items="${arr}">
${i}
</c:forEach>
List遍歷
<c:forEach var="e" items="${list}">
${e}
</forEach>
Map遍歷
<c:forEach var="entry" items="map">
${entry.key} ${entry.value}
</c:forEach>
控制指定次數的循環:從1開始到10結束,步長爲1,保存到i中,並求和
<c:forEach begin="1" end="10" step="1" var="i">
<c:set var="sum" value="${sum + i}">
</c:forEach>
<%
int atts[] = {1,2,3,4,5,6,7,8,9,10};
request.setAttribute("atts", atts);
%>
<c:forEach items="${atts}" var="item"
begin="0" end="9" step="1" >
${item}</br>
</c:forEach>
語法2:
<c:forEach [var="varName"]
[varStatus="varStatusName"]
begin="begin"
end="end"
[step="step"]>
//Body內容
</c:forEach>
<c:forEach begin="1" end="10" var="item" >
${item}</br>
</c:forEach>
11、varStatus屬性
用來存放現在指到之成員的相關信息
------------------------------------------------------------------------------------------------
<c:forEach begin="10" end="100" step="2" var="i" varStatus="status">
<c:if test="${status.count}%3 == 0">
<font color="red">${i}</font>
</c:if>
<c:if test="${status.count}%3 != 0">
<font color="blue">${i}</font>
</c:if>
</c:forEach>
<c:forEach var="i" begin="100" end="200" step="5" varStatus="status">
<c:if test="${status.first}">
begin:<c:out value="${status.begin}">begin</c:out>
end:<c:out value="${status.end}">end</c:out>
step:<c:out value="${status.step}">step</c:out>
<br/>
sequence:
</c:if>
<c:out value="${i}"/>
<c:if test="${status.last}">
<br/>There are
<c:out value="${status.count}"/> numbers in the list.
</c:if>
</c:forEach>
----------------------------------------------------------------------------------------------
<%
Map<String,String> map = new HashMap<String,String>();
map.put("001","aaa");
map.put("002","bbb");
map.put("003","ccc");
request.setAttribute("map",map);
%>
<c:forEach var="m" items="${requestScope.map}">
${m.key } , ${m.value } <br/>
</c:forEach>
----------------------------------------------------------------------------------------------
<%
Map<String,String> map = new HashMap<String,String>();
map.put("001","aaa");
map.put("002","bbb");
map.put("003","ccc");
request.setAttribute("map",map);
%>
<c:forEach var="m" items="${requestScope.map}">
${m.key } , ${m.value } <br/>
</c:forEach>
實驗:遍歷10到100的偶數,如果數字所在的位置是3的倍數,顯示成紅色
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
</head>
<body>
<br><hr><h1>實驗:遍歷10到100的偶數,如果數字所在的位置是3的倍數,顯示成紅色</h1>
<c:forEach begin="10" end="100" step="2" var="i" varStatus="status">
<c:if test="${status.count%3 == 0}">
<font color="red" >${i }</font>
</c:if>
<c:if test="${status.count%3 != 0}">
<font color="blue" >${i }</font>
</c:if>
</c:forEach>
<br><hr><h1>控制重複執行標籤體</h1>
<c:forEach begin="0" end="10" step="2" var="i" varStatus="status">
${i }
</c:forEach>
<br><hr><h1>迭代Map中的元素</h1>
<%
Map map = new HashMap();
map.put("name","楊過");
map.put("age",17);
pageContext.setAttribute("map",map);
%>
<c:forEach items="${map}" var="entry">
${entry.key }:${entry.value }
</c:forEach>
<hr><h1>迭代List中的元素</h1>
<%
List list = new ArrayList();
list.add("天山童老");
list.add("李秋水");
list.add("無崖子");
pageContext.setAttribute("list",list);
%>
<c:forEach items="${list }" var="name">
${name }
</c:forEach>
<hr><h1>迭代數組中的元素</h1>
<%
String [] strs = {"王語嫣","段譽","虛竹","喬峯"};
pageContext.setAttribute("strs",strs);
%>
<c:forEach items="${strs}" var="str">
${str }
</c:forEach>
</body>
</html>
12、<c:forTokens>
用來瀏覽一字符串中所有的成員,其成員是由定義符號所分隔的
8.c:forTokens 切割字符串(複習 StiringTokenize類)
<c:forTokens items="${s}" delims="," var="e">
${e}
</c:forTokens>
<c:forTokens
items="stringOfTokens"
delims="delimiters"
[var="varName"]
[varStatus="varStatusName"]
[begin="begin"]
[end="end"]
[step="step"]>
//body內容
</c:forTokens>
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
</head>
<body>
切割字符串
<c:forTokens items="www.itheima.com" delims="." var="str">
${str } <br>
</c:forTokens>
</body>
</html>
13、<c:param>標籤
(1)在JSP頁面進行URL的相關操作時,經常要在URL地址後面附加一些參數。<c:param>標籤可以嵌套在<c:import>、<c:url>或<c:redirect>標籤內,爲這些標籤所使用的URL地址附加參數。
(2)<c:param>標籤在爲一個URL地址附加參數時,將自動對參數值進行URL編碼,例如,如果傳遞的參數值爲“中國”,則將其轉換爲“%d6%d0%b9%fa”後再附加到URL地址後面,這也就是使用<c:param>標籤的最大好處。
(3)示例:<c:param name="name" value="value" />
14、<c:import> 標籤
引入1.jsp的輸出,拼接到當前jsp的輸出中
<c:import url="/1.jsp" context="/day08"/>
引入1.jsp的輸出,保存到scope域中以var指定名爲名稱的屬性中
<c:improt url="/1.jsp" context="/day08" var="content" scope="page"/>
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
</head>
<body>
cimport用來進行頁面包含操作<br>
<c:import url="/index.jsp" var="index" scope="page"></c:import>
${index }
</body>
</html>
15、<c:url>標籤
<c:url>標籤用於在JSP頁面中構造一個URL地址,其主要目的是實現URL重寫。URL重寫就是將會話標識號以參數形式附加在URL地址後面
<c:url value="/index.jsp"context="/day04" var="myurl2" scope="page">
<c:param name="username" value="張三"></c:param>
</c:url>
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
</head>
<body>
<hr><h1>java方式實現URL重寫</h1>
<%
String url = "/Day07/index.jsp";
url = response.encodeURL(url);
%>
<%= url %>
<hr><h1>curl標籤實現URL重寫</h1>
<c:url context="/Day07" value="/index.jsp" var="url" scope="page">
<c:param name="name" value="張+"></c:param>
</c:url>
${url }
<a href="${url }">xxx</a>
</body>
</html>
16、<c:redirect>標籤
<c:redirect>標籤用於實現請求重定向
<c:redirect url="/index.jsp" context="/day08"/>
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
</head>
<body>
<c:redirect url="/index.jsp" context="${pageContext.request.contextPath}"></c:redirect>
</body>
</html>