天天看點

jsp簡單入門之jstl标簽庫學習三

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>

繼續閱讀