當前位置:
首頁 >
前端技术
> javascript
>内容正文
javascript
JSP 标准标签库(JSTL)
生活随笔
收集整理的這篇文章主要介紹了
JSP 标准标签库(JSTL)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
依賴包:
jstl.jar
standard.jar
分為五類:?
JSTL核心庫 [基本的I/O, 流程控制, 循環 等功能]?
數據庫標簽庫 [基本的數據庫操作功能]?
XML操作標簽庫 [用來處理XML文檔]?
國際化和格式標簽庫?
函數標簽庫?
在這里的例子中?
C開頭的是核心庫的應用[core]一>? c:out?
----------?
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%> [注:jstl-1.1及以后的寫法]
<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/>
總結
以上是生活随笔為你收集整理的JSP 标准标签库(JSTL)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Jeecg-boot 2.4.6+ 多租
- 下一篇: 缓存,确实很香,却也很受伤!