JSTL的全稱:
JSP Standard Tag Library,JSP标準标簽庫
JSTL的作用:
提供給 Java Web 開發人員一個标準通用的标簽函數庫
和 EL 來取代傳統直接在頁面上嵌入 Java 程式(Scripting)的做法,以提高程式可讀性、維護性和友善性
JSTL的版本:
JSTL的主要版本是1.0、1.1和1.2(差別不大)
1.0版本EL表達式還沒有納入官方規範
1.1和1.2版本EL表達式已經納入了官方規範
JSTL的下載下傳
JSTL 主要由Apache組織的Jakarta Project 實作
http://tomcat.apache.org/taglibs/standard/
容器必須支援Servlet 2.4 且JSP 2.0 以上版本
JavaEE1.4
JSTL導入jar包
解壓縮後将lib 中的jstl.jar、standard.jar 複制到WEB應用程式的WEB-INF\lib 下
JSTL标簽庫概述
* JSP标準标簽庫。
* 作用:和EL表達式一起 取代<% %>
* 版本:1.0 1.1和1.2(差別不大)
* 1.0EL表達式沒有納入規範
* 1.1和1.2EL表達式納入規範
* 下載下傳jar包,導入到工程中
jstl.jar
standard.jar
* 标簽庫
c.tld 核心的标簽庫
fn.tld EL表達式标簽庫
* JSTL的快速入門
* 導入相應jar包。
* 建立JSP的檔案,引入标簽庫
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
* 直接使用标簽庫
* JSTL的标簽
<c:out> 輸出内容
value :輸出的内容(常量或者變量)
default :預設值
escapeXml:預設是true,進行轉義,設定成false,不轉義。
代碼:
<c:out value="Hello"></c:out>
<c:out value="${name }"></c:out>
<!-- "" -->
<c:out value="${ city }" default="北京"></c:out>
<c:out value="<a href='#'>超連結</a>" escapeXml="false"/>
<c:set>
* 屬性
var :定義屬性
value :存入的值
scope :域範圍
target :修改JavaBean對象
property:修改的屬性
* 向4個web域對象存入值
<c:set var="i" value="10" scope="request" ></c:set>
* 修改JavaBean對象屬性的值
<c:set target="${ user }" property="username" value="小鳳"></c:set>
<c:remove>
* 屬性
var :删除的屬性
scope :在域的範圍
* 代碼
<c:set var="name" value="小鳳" scope="page"></c:set>
${ name }
<c:remove var="name" scope="page"/>
${name }
* <c:catch>
* 屬性:var 把異常的資訊儲存變量中
* 代碼
<c:catch var="e">
<%
int a = 10/0;
%>
</c:catch>
${ e.message }
* <c:if> 沒有<c:else>标簽
* 屬性
* test 判斷的條件
* var 計算的結果儲存到變量中
* scope 域的範圍
* 代碼
<c:set var="i" value="10" scope="page"></c:set>
<c:if test="${ i ge 10 }" var="x" scope="page">
i >= 10
</c:if>
<c:if test="${ i lt 10 }">
i < 10
</c:if>
${ x }
* <c:choose>标簽
<c:when>
<c:otherwise>
代碼:
<c:set var="i" value="10" scope="page"></c:set>
<c:choose>
<c:when test="${ i ge 10 }">
i >= 10
</c:when>
<c:when test="${ i lt 10 }">
i < 10
</c:when>
<c:otherwise>
其他
</c:otherwise>
</c:choose>
* <c:forEach>(*****)
* 循環周遊資料(數組,集合,Map集合)
* 屬性
var :周遊資料的類型
items :要周遊的内容
begin :從哪開始
end :到哪結束
step :步長
varStatus:記錄循環周遊的資訊
* index
* count(常用)
* first
* last
* 代碼
<%
String [] arrs = {"美美","小鳳","芙蓉","小蒼"};
request.setAttribute("arrs", arrs);
%>
<!-- for(String s : arrs){ } -->
<c:forEach var="s" items="${ arrs }">
${ s }
</c:forEach>
<h4>周遊集合</h4>
<%
List<String> list = new ArrayList<String>();
list.add("美美");
list.add("小鳳");
list.add("芙蓉");
list.add("小澤");
request.setAttribute("list", list);
%>
<c:forEach var="s" items="${ list }">
${ s }
</c:forEach>
<h4>周遊Map集合</h4>
<%
Map<String,String> map = new HashMap<String,String>();
map.put("aa", "美美");
map.put("bb", "小鳳");
map.put("cc", "芙蓉");
request.setAttribute("map", map);
%>
<c:forEach var="entry" items="${ map }">
${ entry.key } -- ${ entry.value }
</c:forEach>
<h4>周遊對象的集合</h4>
<%
List<User> uList = new ArrayList<User>();
uList.add(new User("美美","123"));
uList.add(new User("小風","234"));
uList.add(new User("芙蓉","345"));
request.setAttribute("uList", uList);
%>
<c:forEach var="user" items="${ uList }">
${ user.username } -- ${ user.password }
</c:forEach>
<h4>疊代資料</h4>
<h4>疊代從1到10</h4>
<c:forEach var="i" begin="1" end="10" step="2">
${ i }
</c:forEach>
<h4>計算從1加到100的和</h4>
<c:set var="sum" value="0" scope="page"></c:set>
<c:forEach var="i" begin="1" end="100" step="1">
<c:set var="sum" value="${ sum + i }"></c:set>
</c:forEach>
${ sum }
<h4>周遊10到100的偶數,每到第3個數,顯示紅色</h4>
<c:forEach var="i" begin="10" end="100" step="2" varStatus="status">
<c:choose>
<c:when test="${ status.first }">
<font color="blue">${ i }</font>
</c:when>
<c:when test="${ status.count % 3 eq 0 }">
<font color="red">${ i }</font>
</c:when>
<c:otherwise>
${ i }
</c:otherwise>
</c:choose>
</c:forEach>
* <c:param> 傳遞參數
* 屬性
name :參數名稱
value :參數的值
* <c:import> 包含頁面
* url :引入頁面的位址
* context :虛拟路徑
* var :引入頁面儲存到屬性中
* scope :域的範圍
* 代碼
<c:import url="/jstl/choose.jsp" context="/day13" var="i" scope="page">
<c:param name="username" value="meimei"></c:param>
</c:import>
${ i }
* <c:url>
<c:url>标簽用于在JSP頁面中構造一個URL位址,其主要目的是實作URL重寫。
URL重寫就是将會話辨別号以參數形式附加在URL位址後面
http://localhost/day12/demo?jsessionid=xxxxxxxxxxxxxxxxxx;
* 屬性
* var :聲明屬性
* value :位址
* scope :域範圍
* context :虛拟路徑
* 代碼
<c:url var="i" value="/jstl/choose.jsp" scope="request" context="/day13">
<c:param name="username" value="xiaofeng"></c:param>
</c:url>
<a href="${ i }" target="_blank" rel="external nofollow" >choose</a>
* <c:redirect>重定向
* 屬性
* url :重定向的位址
* context :虛拟路徑
* 代碼
<c:redirect url="/jstl/choose.jsp" context="/day13">
<c:param name="username" value="furong"></c:param>
</c:redirect>
* <c:forTokens>分隔字元串(了解)
<h4>分隔字元串</h4>
<c:set var="i" value="aa,bb,cc" scope="page"></c:set>
<c:forTokens items="${i }" delims="," var="x">
${ x }
</c:forTokens>
* EL函數(操作字元串的)
* 自定義EL函數(入門)
* 編寫一個類,方法必須是靜态方法。
* 在WEB-INF目錄下建立tld的檔案,配置。
* 選擇2.0
* 完成配置
<!-- 配置自定義的EL函數 -->
<function>
<!-- 配置方法名稱 -->
<name>sayHi</name>
<!-- 方法所在的類 -->
<function-class>cn.itcast.el.ElDemo1</function-class>
<!-- 配置方法的簽名 -->
<function-signature>java.lang.String sayHello(java.lang.String)</function-signature>
</function>
* 自定義标簽
* 實作SimpleTag接口
* 編寫一個類,繼承SimpleTagSupport類。
* 重寫5個方法
* void setJspContext(JspContext pc)
* void setParent(JspTag parent)
* void setJspBody(JspFragment jspBody)
* void doTag()
* JspTag getParent()
* 快速入門的步驟(自定義沒有标簽體的标簽)
* 編寫一個類,繼承SimpleTagSupport。
* 選擇重寫的方法,doTag()必須有的。
* 需要配置
<!-- 配置自定義标簽 -->
<tag>
<!-- 配置标簽名稱 -->
<name>print</name>
<!-- 配置标簽的類 -->
<tag-class>cn.learn.tag.TagDemo1</tag-class>
<!-- 配置标簽主體 -->
<body-content>empty</body-content>
</tag>
* 在JSP頁面上,引入标簽庫
<%@ taglib uri="http://www.learn.cn/1110/myc" prefix="myc" %>
* 使用标簽了。
* 帶有标簽主體的标簽
* 編寫類,繼承SimpleTagSupport。
* 重寫doTag()
* 擷取标簽主體對象
JspFragment jf = getJspBody();
jf.invoke(null);
* 配置
<!-- 配置自定義标簽 -->
<tag>
<!-- 配置标簽名稱 -->
<name>out</name>
<!-- 配置标簽的類 -->
<tag-class>cn.itcast.tag.TagDemo2</tag-class>
<!-- 配置标簽主體 -->
<body-content>scriptless</body-content>
</tag>
<body-content>元素的可選值有:
empty:不能有标簽體内容。
JSP:标簽體内容可以是任何東西:EL、JSTL、<%=%>、<%%>,以及html;但不建議使用Java代碼段,SimpleTag已經不再支援使用<body-content>JSP</body-content>;
scriptless:标簽體内容不能是Java代碼段,但可以是EL、JSTL等;
tagdependent:标簽體内容不做運算,由标簽處理類自行處理,無論标簽體内容是EL、JSP、JSTL,都不會做運算。
* 帶有屬性的标簽
* * 編寫類,繼承SimpleTagSupport。
* 重寫doTag()
* 編寫一個屬性,屬性必須和标簽中的屬性是相同
* 提供set方法
* 擷取标簽主體對象
JspFragment jf = getJspBody();
jf.invoke(null);
* 配置
<!-- 配置自定義标簽 -->
<tag>
<!-- 配置标簽名稱 -->
<name>if</name>
<!-- 配置标簽的類 -->
<tag-class>cn.learn.tag.TagDemo3</tag-class>
<!-- 配置标簽主體 -->
<body-content>scriptless</body-content>
<!-- 配置屬性 -->
<attribute>
<!-- 配置屬性名稱 -->
<name>test</name>
<!-- 屬性是否是必須的 -->
<required>true</required>
<!-- 是否支援EL表達式 -->
<rtexprvalue>true</rtexprvalue>
<!-- 屬性的類型 -->
<type>boolean</type>
</attribute>
</tag>