JSTL : javaserverpages standard tag library JSP標準標籤庫
jstl set <c:set var="i" value="${i+1}"></c:set>
目的:用這些標籤取代JSP頁面上的JAVA代碼
分爲五類:
JSTL核心庫 [基本的I/O, 流程控制, 循環 等功能]
數據庫標籤庫 [基本的數據庫操作功能]
XML操作標籤庫 [用來處理XML文檔]
國際化和格式標籤庫
函數標籤庫
在這裏的例子中
C開頭的是核心庫的應用[core]一> c:out
----------
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<c:out value="JSTL標籤測試!" /><br> //純粹進行字符串的輸出
<c:out value="${10/5}"/><br> //把計算結果輸出
[即] 對於c:out,只要指定value值即可
<c:out value="JSTL標籤測試!<br>" escapeXml="true" />
<c:out value="JSTL標籤測試!<br>" escapeXml="false" />
[進階]c:out 裏面還有個 escapeXml屬性,如果它設置成TRUE,則忽略""裏面的 HTML標籤,如果設置成
FALUSE,則上面第二行中的<BR>會輸出一個回車
c:out還可以輸出EL表達式的值
例如:<c:out value="${header['User-Agent']}"/> 輸出的結果是:
Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; .NET CLR 2.0.50727)
也可以這樣用:<title><c:out value="<c:redirect>、<c:param>標籤測試"/></title>
二> c:set
----------
[作用] 把變量值設置到JSP內置對象中,或者設置到JAVABEAN屬性中
與JSP的動作指令<jsp:setProperty>類似
[四種用法]
1> <c:set var="number" value="2" [scope="{page|request|session|application}"]/>
///var是變量名,value是值,scope是使用範圍
2> <c:set var="number" [scope="{page|request|session|application}"]>2</c:set>
3> <c:set value="wzk" target="Userbean" propertyName="name"/>
///針對JAVABEAN進行操作,target是對應的JAVABEAN名
4> <c:set target="Userbean" propertyName="name">"wzk"</c:set>
[注:] 默認範圍都是page
三> c:remove
-------------
[作用:] 和c:set正好相反 [注:]必須指定var屬性,scope可以不指定
四> c:if
---------
[作用:] 與IF一樣,用於條件判斷
<c:set var="number" value="2" scope="request"/> //先設置一個屬性及其相應值
<c:if test="${number==1}"><c:out value="給定數字的值爲1"></c:out></c:if>
五> c:choose, c:when, c:otherwise
----------------------------------
c:choose 沒有具體的作用,它只是後面兩個的父標籤,這裏把三者一起介紹
<c:set var="IDE" value="Eclipse"/>
<c:choose>
<c:when test="${IDE=='JBuilder'}">
<c:out value="你使用的開發工具爲JBuilder"/>
</c:when>
<c:when test="${IDE=='Eclipse'}">
<c:out value="你使用的開發工具爲Eclipse"/>
</c:when>
<c:when test="${IDE=='JCreator'}">
<c:out value="你使用的開發工具爲JCreator"/>
</c:when>
<c:otherwise>
<c:out value="你是高手!用記事本寫代碼?"/>
</c:otherwise>
</c:choose>
[即:] 這裏就和JAVA中的switch case,case,case,default類似
[注:] <c:otherwise>的個數是<=1個
六> c:forEach
--------------
[作用:] 遍歷一個集合中的內容,可以數組,list,array,listlinkedlist,set vector,map等
[兩種用法]
1> <c:forEach [var="varname" items="collection" [varStatus="varStatusName"] [begin="beginname"]
[end="endname"] [step="step"]> 循環體中要執行的內容</c:forEach>
[解釋:] items指定要遍歷的對象, var是集合中當前的對象,varstatus是遍歷的當前狀態信息[包
括:index,count,first,last等屬性]
2> <c:forEach [var="varname" items="collection" [varStatus="varStatusName"] begin="beginname"
end="endname" [step="step"]> 循環體中要執行的內容</c:forEach>
[注:]和上面的區別就是fitst和end屬性是必須要指定的,即:按指定次數循環集合
<%
ArrayList list = new ArrayList();
for(int i=0;i<5;i++)
{
Integer newi=new Integer((i+1)*5);
list.add(i,newi); ///因爲ADD的參數爲(int,object)
}
request.setAttribute("list",list); ///注意用法
%>
<c:out value="<c:forEach>標籤示例:"/><br>
<c:forEach items="${list}" var="current" varStatus="status">
<c:out value="序號:"/>
<c:out value="${status.count}"/> ///得到當前對象的序號
///[注:]${status.index}的值是從0開始,而status.count的值從1開始
<c:out value="值:"/>
<c:out value="${current}"/><br> ///得到當前對象的值
</c:forEach>
七> c:forTokens
----------------
[作用:] 對一個字符串進行迭代循環,該字符串是用符號分開的
<c:forTokens items="string" delims="selimiters" [var="varname"] [varStatus="varStatusName"]
[begin="begin"] [end="end"] "step="step">
循環中要執行的內容
</c:forTokens>
[解釋:] items指定要處理的字符串, delims指定串中的分割符,var指定當前字符串,其它與上面 類似,不
再解釋
<%
String question = "What*is*your*name*?";
request.setAttribute("question",question);
%>
<c:out value="<c:forTokens>標籤示例"/><br>
<c:forTokens items="${question}" var="current" delims="*" varStatus="status">
第<c:out value="${status.count}"/>次取出的單詞爲:<c:out value="${current}"/><br>
</c:forTokens>
八> c:import
-------------
[作用:] 把其它表態或動態頁面包含到當前頁面,與JSP中<jsp:include>類似,不同之處是:<jsp:include>只是可
以包含當前WEB應用中的頁面,而c:import可以包含其它WEB中的應用
[兩種用法]
1> <c:import url="url" [context="context"] [var="varName"]
[scope="{page|request|session|application}"] [charEncoding="charEncoding"].
可以包含<c:param>標籤
</c:import>
[解釋:] url可以是當前WEB下的頁面,也可以是通過URL鏈接到其它網站的文件
2> <c:import url="url" [context="context"] varReader="varReader" [charEncoding="charEncoding"].
可以包含<c:param>標籤
</c:import>
<c:out value="下面是引入文件的操作:"></c:out><br>
<c:import var="include" url="inc/content.txt" charEncoding="gb2312"/>
<c:out value="下面顯示引入的內容:"/><br>
<c:out value="${include}"/>
[注:] 這時是把頁面裏面的內容都顯示出來,即使裏面有HTML代碼也不會執行的
九> c:redirect
--------------
[作用:] 把用戶的請求從一個頁面轉向另外一個頁面 與JSP中的response內置對象類似
[兩種用法]
1> <c:redirect url="url" [context="context"]/>
[解釋:] 這裏僅僅是實現頁面跳轉,沒有傳遞任何參數
2> <c:redirect url="url" [context="context"]>
<c:param>
</c:rediect>
<c:out value="<c:redirect>、<c:param>標籤測試"/>
<c:redirect url="getParam.jsp">
<c:param name="paramName" value="Hello!"/>
</c:redirect>
//則:在getParam.jsp中應用下面兩行代碼
<%
out.println("傳遞過來的參數的值爲:<br>");
out.println(request.getParameter("paramName"));
%>
[執行結果爲:] 傳遞過來的參數的值爲:
Hello!
[不理解:] 書上說這個標籤應該不會把參數名和值顯示在URL上,可是我的卻會顯示
顯示爲:http://localhost:8080/JstlDemo/getParam.jsp?paramName=Hello!
[難道又不是IE7搞鬼?]
十> c:url
---------
[作用:] 用來產生一個URL
[兩種用法]
1> <c:url value="value" [context="context"] [var="varName"]
[scope="{page|request|session|application}"]/>
[解釋:] 這種用法僅僅是產生一個URL
[例如:] <c:url value="www.sina.com"/>
1> <c:url value="value" [context="context"] [var="varName"]
[scope="{page|request|session|application}"]>
<c:param>
</c:url>
[解釋:] 產生一個帶參數的URL
[例如:] <c:url value="www.sina.com"/>
<c:param name="message" value="hello"/>
</c:url>
十一> c:catch
--------------
[作用:] 用來捕捉頁面產生的錯誤,和JAVA中的catch功能類似
<c:catch var="exception">
<!--下面這裏是要捕獲異常的代碼部分-->
<%
out.println("10/0的商爲:<br>");
out.println(10/0);
%>
</c:catch>
下面是對異常進行的處理:<br>
<c:out value="${exception.message}"/>
[執行結果爲:]
10/0的商爲:
下面是對異常進行的處理:
/ by zero
////第二大類,數據庫方面的標籤<%@ taglib uri="http://java.sun.com/jsp/jstl/sql" prefix="sql"%>
一> sql:setDateSource
---------------------
[作用:] 當然是設置數據源啦
[兩種用法]
1>
<sql:setDataSource driver="driverName" url="URL" [user="userName"] [password="password"] [var="varName"]
[scope="{page|request|session|application}"] />
// 下面以連接 SQL SERVER 2000O 爲例,使用JDBC驅動器,數據庫用戶名爲:sa, 密碼爲:123456 則可以用下面的語句
<sql:setDataSource var="conn" driver="com.microsoft.jdbc.sqlserver.SQLServerDriver"
url="jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=pubs"
user="sa" password="1985315"/>
[注:]這裏是連接SQL SERVER 自帶的數據庫pubs,取得連接後就可以進行各種數據庫操作,在後面會介紹
2>
<sql:setDataSource dataSource="dataSource" [var="varName"] [scope="{page|request|session|application}"] />
//這種方法其實就是已經知道一個存在的數據源
二> sql:query
--------------
[兩種用法]
1>
<sql:query var="varName" dataSource="dataSource" [maxRows="max"] [startRow="start"]
[scope="{page|request|session|application}"]>
SQL語句
</sql:query>
2>
///就是簡單地把SQL寫到裏面,只是一句話展現出來,方便
<sql:query sql="SQL語句" var="varName" dataSource="dataSource" [maxRows="max"] [startRow="start"]
[scope="{page|request|session|application}"] />
<sql:query var="rs" dataSource="${conn }">
select * from stores
</sql:query>
<c:out value="一共查出${rs.rowCount}記錄:"/><br>
<c:forEach items="${rs.rows}" var="job" varStatus="status">
<c:out value="第${status.count}條記錄:"/>
<c:out value="stor_id爲${job.stor_id}"/>
<c:out value="city爲${job.city}"/>
<c:out value="state爲${job.state}"/>
<c:out value="zip爲${job.zip}"/>
<br>
</c:forEach>
三> sql:update
---------------
[兩種用法]
1>
<sql:update dataSource="datasource" [var="varName"] [scope="{page|request|session|application}"] >
SQL語句
</sql:update>
2>
<sql:update sql="SQL語句" dataSource="datasource" [var="varName"] [scope="{page|request|session|application}"] />
四> sql:param
--------------
[作用:] 主要是配合 PrepareStatement使用, 主要功能就是向<sql:query>裏面的SQL語句動態地傳遞參數值
<sql:query var="rs" dataSource="datasource" >
select * from storee where stor_id=? and stor_name=?
<sql:param value="10">
<sql:param value="wzk">
</sql:query>
五> sql:dateParam
------------------
[作用:] 設置日期格式 使用方法和<sql:param>完全相同
<sql:dateParam value="value" [type="{timestamp|time|date}" />
///其中timestamp是日期加時間的完整格式
六> sql:transaction
--------------------
[作用:]看到名稱就是處理事務的
<sql:transaction [isolation="{read_uncommitted|read_committed|repeatable_read|serializable}"] [dataSource="datasource"]>
數據庫操作
</sql:transaction>
<sql:transaction dataSource="${database}">
<sql:update>
更新數據庫語句
</sql:update>
<sql:query>
查詢數據庫語句
</sql:query>
</sql:transaction>
OK了,,今天晚上先寫到這裏了,好睏,明天還要上班..
第三大類: XML標籤庫
[注:] 對XML的操作有限,可是在簡單應用XML時,它的功能足夠了,在較複雜應用XML時,就用SAX或者DOM等API接口來操作XML文檔
<%@ taglib uri="http://java.sun.com/jsp/jstl/xml" prefix="x"%>
一> x:parse
-----------
[作用:]用於解析一個XML文檔
[兩種用法:]
1>
<x:parse {doc="xmldoc" | xml="xmldoc"} {var="varName"} [scope="{page|request|session|application}"] | {varDom="varName" |
[scope="{page|request|session|application}"] } [systemId="systemId"] [filter="filter"] />
[解釋:]doc或xml指明瞭要處理的XML文檔,解析以後的文檔放在變量VAR中, 如果是以DOM的方式解析XML文檔,則解析後的文檔放在變量varDom中
2>
<x:parse { var="varName" [scope="{page|request|session|application}"]|
varDom="varName"[scope="{page|request|session|application}"] }
[systemId="systemId"] [filter="filter"]XML文檔內容
</x:parse>
[區別:]不用指定相應的XML文檔,而是直接把XML文檔的內容寫在中間
它的例子與下面的 x:out 一起介紹
二> x:out
--------------
[作用:] XML文檔經 x:parse解析後就由 x:out來進行輸出各個結點
<x:out select="node" [escapeXML="{true|false}"] />
[解釋:] 其中node是xml文檔定位的表達式,這裏使用 XPath的語法[一種定位XML節點的語言]
舉例: 假設XML文檔的內容如下:
<?xml version="1.0" encoding="gb2312"?>
<students>
<student>
<name>Bill</name>
<age>23</age>
<sex>boy</sex>
</student>
</students>
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
<font size="2">
<c:out value="<x:Parse>、<x:out>標籤示例"/><br>
<c:import var="doc" url="Students.xml" charEncoding="gb2312"/> ///以後就用doc這個變量名代表這個XML文檔
<x:parse var="studentDoc" doc="${doc}"/> ///通過${doc}來解析該文檔,並把解析後的文檔放到變量studentDoc中
<c:out value="學生姓名:"/>
<x:out select="$studentDoc/students/student/name"/><br> ///取某個結點值 [該方法就是所謂的 XPath語法]
<c:out value="學生年齡:"/>
<x:out select="$studentDoc/students/student/age"/><br>
<c:out value="學生性別:"/>
<x:out select="$studentDoc/students/student/sex"/><br>
</font>
三> x:set
----------
把XML中某個結點的內容賦值到一個變量中
<x:set select ="node" var="varName" [scope="{page|request|session|application}"] />
[解釋:] node是其一個結點[這是一個XPath表達式], varName就是用來接受該節點內容的變量
[切記:] 若想用x:set這個標籤,必須先對XML文檔進行解析,不然這裏的XPath表達式不能生效
四> x:if
---------
和c:if有相似之處,只是這裏的判斷條件變成了XPath表達式[即:判斷在XML文檔中是否有滿足該表達式的節點]
[兩種用法]
1>
<x:if select ="node" var="varName" [scope="{page|request|session|application}"] />
[注:] 其中node 就是XPath表達式, 如果文檔中存在該結點,則varName的值爲true,否則爲false
2>
<x:if select ="node" var="varName" [scope="{page|request|session|application}"] >
判斷條件成立時執行的操作
</x:if>
[兩者區別僅僅是第二個方法可以進行進一步的操作]
五> x:choose, x:when, x:otherwise [三者同時用,與上面的核心庫用法完全一樣,可是判斷條件變成了XPath表達式而以]
-----------------------------------
六> x:forEach
--------------
[作用:] 對XML文檔進行遍歷
例子:
<?xml version="1.0" encoding="gb2312"?>
<teachers>
<teacher>
<name>Bill</name>
<age>26</age>
<sex>boy</sex>
</teacher>
<teacher>
<name>Jack</name>
<age>33</age>
<sex>girl</sex>
</teacher>
</teachers>
遍歷的方法是:
<c:import var="doc" url="Teachers.xml" charEncoding="gb2312"/> ////注意這一行代碼,和C接合用
<x:parse var="teacherDoc" doc="${doc}"/> ///進行解析
<x:forEach select="$teacherDoc//teacher" varStatus="status">//開始進行循環 [注意status的巨大作用!!!]
//[$teacherDoc//teacher含義:取出所以名爲teacher的節點]
<c:out value="第${status.count}個老師:"/>
<c:out value="姓名 "/>
<x:out select="name"/> ///注意: 取出父結點後,可以直接通過名稱取出其子結點的內容
<c:out value="年齡 "/>
<x:out select="age"/>
<c:out value="性別 "/>
<x:out select="sex"/><br>
</x:forEach>
第四大類:
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
一> 國際化標籤
---------------------
對於數字和貨幣等的表示,各個國家是有所不同的,在JSTL中提供情報了這樣的標籤,可以用來處理這些國際化帶來的問題
例子:
<font size="2">
<fmt:setLocale value="en-US" /> ///在美國
美國:<br>
數字格式:<fmt:formatNumber value="123456789" /><br>
百分數格式:<fmt:formatNumber type="percent">123456789</fmt:formatNumber><br>
貨幣格式<fmt:formatNumber value="12345.67" type="currency" /><br> //[用中國當地的符號,即在數字前加一個:$]
<fmt:setLocale value="zh_CN" /> ///在中國
中國:<br>
數字格式:<fmt:formatNumber value="123456789" /><br> ///默認是number格式,即一般的數字格式
百分數格式:<fmt:formatNumber type="percent">123456789</fmt:formatNumber><br> //表示用百分數
貨幣格式<fmt:formatNumber value="12345.67" type="currency" /><br> //[用中國當地的符號,即在數字前加一個:¥]
</font>
[注:] type的值可以爲: currency,number,percent
二> 日期格式標籤
-----------------
例子:
<font size="2">
<c:set var="date" value="<%=new java.util.Date()%>"/> ///得到當前時間
<fmt:formatDate value="${date}" pattern="yyyy年MM月dd日" type="date" dateStyle="full"/><br>
////取出日期,按相應格式輸出
<fmt:formatDate value="${date}" pattern="HH:mm:ss" type="time" timeStyle="full"/><br>
<fmt:formatDate value="${date}" pattern="yyyy年MM月dd日 HH:mm:ss" type="both" dateStyle="full" timeStyle="full"/><br>
<fmt:formatDate value="${date}" type="both" timeStyle="full" var="formatted"/>
<fmt:parseDate value="${formatted}" type="both" timeStyle="full" timeZone="GMT" var="parsed"/>
///上面這行代碼,把formatted變量的值轉化成一個日期型號的變量 ,把解析的結果放在parsed變量中
<c:out value="${parsed}"/><br>
</font>
[執行結果:]
2008年04月28日
23:14:18
2008年04月28日 23:14:18
Mon Apr 28 23:14:18 CST 2008
三> 至於函數標籤庫裏面的那些函數個人覺得沒有必要看了,用JAVA代碼可以容易寫出,懶的記啦,呵呵
最後再說一下自定義標籤時的步驟[簡單的那種,嘿嘿,沒辦法人比較懶]
1>寫功能類
2>寫出描述文件TLD,並把它放在 WEB-INFO/目錄下
這樣以後就可以在頁面上調自己的標籤啦
下面以一簡單例子爲例 [功能極其簡單[輸出當前的系統時間],只是學習一下自快建標籤的過程]
1>功能類///-----------DateTag.java
package taglibs;
import javax.servlet.jsp.tagext.BodyTagSupport;
import javax.servlet.jsp.JspWriter;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.PageContext;
import javax.servlet.jsp.tagext.Tag;
public class DateTag implements Tag {
private PageContext pageContext;
private Tag tag;
public int doEndTag() throws JspException {
try {
Date date = new Date();
SimpleDateFormat dateFormater = new SimpleDateFormat("yyyy年MM月dd日");
pageContext.getOut().print(dateFormater.format(date));
} catch (IOException e) {
e.printStackTrace();
}
return Tag.EVAL_PAGE;
}
public int doStartTag() throws JspException {
return Tag.SKIP_BODY;
}
public Tag getParent() {
return null;
}
public void release() {
}
public void setPageContext(PageContext pageContext) {
this.pageContext = pageContext;
}
public void setParent(Tag parent) {
this.tag = parent;
}
}
2> //-----------datetag.tld
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE taglib PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.2//EN"
"http://java.sun.com/dtd/web-jsptaglibrary_1_2.dtd">
////正文開始
<taglib>
<tlib-version>1.0</tlib-version>
<jsp-version>1.2</jsp-version>
////上面兩行說明版本問題,第二句說明該標籤庫要求的JSP版本爲 1.2
<short-name>dateTagExample</short-name>
<uri>/mytags</uri>
////真正開始
<tag>
<name>date</name> //標籤名 [也即在JSP頁面上訪問的名稱爲:date]
<tag-class>taglibs.DateTag</tag-class> ///這裏指明瞭該標籤的處理功能類
<body-content>empty</body-content>
</tag>
</taglib>
[注意:] 每個標籤庫可以包含一組標籤,也可以只描述一個標籤,一般情況下,把一組功能類似的標籤旋轉在一個標籤庫中...
[若有多個標籤時,只要多加幾<tag>節點即可]
JSP頁面上應用剛纔那個標籤
<%@ taglib uri="/WEB-INF/datetag.tld" prefix="mytags" %>
應用: 下面是使用自定義標籤輸出的內容:<br> <mytags:date/>