版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、使用傳統(tǒng)和簡(jiǎn)單模式開(kāi)發(fā)標(biāo)簽,簡(jiǎn)單標(biāo)簽開(kāi)發(fā)案例,使用 JSTL 核心標(biāo)簽庫(kù)作者:呂鵬時(shí)間: 2011-08-09一、傳統(tǒng)標(biāo)簽開(kāi)發(fā)模式1、使用實(shí)現(xiàn)了 tag 接口的類(lèi)-六個(gè)方法(執(zhí)行流程)setPageContext 傳遞頁(yè)面 pageContext 對(duì)象(這個(gè)對(duì)象可以獲取其它八大隱含對(duì)象) setParent 設(shè)置父標(biāo)簽,沒(méi)有父標(biāo)簽傳 nullgetParentdoStartTag 遇到開(kāi)始標(biāo)簽執(zhí)行這個(gè)方法doEndTag遇到結(jié)束標(biāo)簽執(zhí)行這個(gè)方法release釋放資源-繼承子類(lèi) TagSupport 只重寫(xiě)自己感興趣的方法2、執(zhí)行流程IE 請(qǐng)求 jsp 頁(yè)面到服務(wù)器,轉(zhuǎn)換為 Servlet 后,
2、由 Servlet 執(zhí)行,遇到標(biāo)簽以后,創(chuàng)建標(biāo)簽對(duì) 應(yīng)的標(biāo)簽處理器實(shí)例對(duì)象,調(diào)用標(biāo)簽的setPageContext 方法,把頁(yè)面的 pageContext 對(duì)象傳遞給標(biāo)簽處理器,然后再調(diào)用setParent方法,把父標(biāo)簽傳遞給標(biāo)簽處理器,如果沒(méi)有父標(biāo)簽,傳null,遇到開(kāi)始標(biāo)簽,調(diào)用doStartTag方法,一般情況下還會(huì)執(zhí)行標(biāo)簽體,遇到結(jié)束標(biāo)簽調(diào)用doEndTag,最后一般情況下調(diào)用realease方法釋放資源。3、使用步驟自定義一個(gè)類(lèi),使其繼承TagSupport方法,重寫(xiě)doStartTag方法,方法體中獲取 request對(duì)象和out對(duì)象, 寫(xiě)相關(guān)方法; 在WEB-INF目錄下建立一個(gè)
3、.tld的文件,寫(xiě)以下內(nèi)容:<?xml version="1.0" encoding="UTF-8" ?>vtaglib xmlns ="xml ns:xsi ="/2001/XMLSchema-i nsta nee" xsi:schemaLocati on ="http:/java.s un. com/xml/ns/j2eehttp:/java.s un .com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd"versio n=&
4、quot;2.0"><descripti on >A tag library exercising SimpleTag handlers.</descriptio n ><tlib-version >1.0</tlib-version ><short-name>SimpleTagLibrary </short-name> <!-資源名稱(chēng)-><uri> /itcast-tags </uri><tag><name>viewIP </name>
5、;<tag-class>cn.itcast.web.tag.ViewIpTag </tag-class><body-c ontent >empty </body-c ontent ></tag><tag><!-標(biāo)簽的名字 -><n ame>for </n ame><!-標(biāo)簽的處理器 -><tag-class>c n.itcast.web.tag.SimpleTagTest </tag-class><!-是否有標(biāo)簽體內(nèi)容-> <body
6、-c ontent >scriptless</body-c ontent > <attribute ><!-用于指定屬性的名稱(chēng) ->< n ame> count</n ame><!-是否默認(rèn)設(shè)置這個(gè)屬性->< required >true </required ><!-是否可以使用運(yùn)行時(shí)表達(dá)式-><rtexprvalue>true</rtexprvalue ></attribute></tag></taglib >在 js
7、p 頁(yè)面中導(dǎo)入資源包:<% taglib prefix="s" uri="/itcast-tags"%> 4、自定義標(biāo)簽的作用:1、將 jsp 頁(yè)面中的 java 代碼移除2、控制頁(yè)面某一內(nèi)容是否輸出3、整個(gè) jsp 是否執(zhí)行4、控制頁(yè)面內(nèi)容重復(fù)輸出5、修改 jsp 內(nèi)容輸出5、 JspTag 接口 空實(shí)現(xiàn)的標(biāo)識(shí)類(lèi)型模式serializable 和 cloneable 都是這樣的標(biāo)識(shí)類(lèi)型規(guī)范。目的就是給特殊的類(lèi)以特殊的權(quán)限,就比如clo neable,實(shí)現(xiàn)它就表示可以被克隆了。二、使用簡(jiǎn)單標(biāo)簽?zāi)J介_(kāi)發(fā)1. 執(zhí)行過(guò)程首先實(shí)例化實(shí)現(xiàn)了 simpl
8、eTag 的類(lèi)實(shí)例 ,首先調(diào)用標(biāo)簽處理類(lèi)對(duì)象的 setJspContext 方法,將代 表 jsp 頁(yè)面的 pageContext 對(duì)象傳遞給標(biāo)簽處理器對(duì)象,然后調(diào)用 setParent 方法,將父標(biāo)簽處理器對(duì)象傳遞給這個(gè)標(biāo)簽處理器對(duì)象(只有父標(biāo)簽存在的情況下才會(huì)調(diào)用這個(gè)方法),如果調(diào)用標(biāo)簽時(shí)間設(shè)置了屬性,容器將調(diào)用每個(gè)輸贏對(duì)應(yīng)的setter方法把屬性值傳遞給標(biāo)簽處理器對(duì)象,如果標(biāo)簽的屬性值是 EL表達(dá)式或者腳本表達(dá)式則web容器首先計(jì)算表達(dá)式的值然后把值傳遞給標(biāo)簽處理器對(duì)象。如果簡(jiǎn)單標(biāo)簽有標(biāo)簽體容器將調(diào)用setJspBody方法把代表標(biāo)簽體的JspFragment對(duì)象傳遞進(jìn)來(lái)。這樣就完成了標(biāo)
9、簽的初始化工作。執(zhí)行標(biāo)簽體調(diào)用doTag方法,開(kāi)發(fā)人員在方法體內(nèi)通過(guò)操作jspFragment對(duì)象,就可以完成是否執(zhí)行迭代,修改標(biāo)簽提的目的。2、invoke方法詳解Invoke方法是jspFragment最重要的方法,利用這個(gè)方法可以控制是否執(zhí)行和輸出標(biāo)簽提的 年日哦那個(gè)是否迭代執(zhí)行標(biāo)簽提的內(nèi)容或者對(duì)執(zhí)行結(jié)果進(jìn)行修改再輸出。3、開(kāi)發(fā)帶屬性的標(biāo)簽1首先在標(biāo)簽處理器中編寫(xiě)每個(gè)屬性對(duì)應(yīng)的setter方法<lv:forcount ="5" >aaa <br ></ lv:for>/聲明屬性變量private intcount ;/提供set方法
10、供服務(wù)器調(diào)用publicvoidsetCo unt(int count) this . count = count;2、在TLD文件中描述標(biāo)簽的屬性<tag ><!- 標(biāo)簽的名字 -><name>for </name ><!- 標(biāo)簽的處理器 -><tag-class >cn.itcast.web.tag.SimpleTagTest</ tag-class ><!- 是否有標(biāo)簽體內(nèi)容 -><body-content> scriptless </ body-content><
11、;attribute ><!-用于指定屬性的名稱(chēng)-><name>count </name ><!-是否默認(rèn)設(shè)置這個(gè)屬性->< required >true </ required ><!-是否可以使用運(yùn)行時(shí)表達(dá)式->< rtexprvalue >true </ rtexprvalue ></ attribute ></ tag >4、使用簡(jiǎn)單標(biāo)簽做一個(gè)簡(jiǎn)單的例子控制頁(yè)面內(nèi)容轉(zhuǎn)換成大寫(xiě)然后輸出五次(1 )在jsp中引入資源,寫(xiě)標(biāo)簽體內(nèi)容<% page l
12、anguage="java" import ="java.util.*" pageEncoding="utf-8"%><% taglib prefix = "lv" uri="/itcast-tags"%><html ><head><title > 簡(jiǎn)單標(biāo)簽 </title ></head><body><lv:for count="5" >aae<br></
13、lv:for ></body></html >(2 )定義標(biāo)簽處理器package cn.itcast.web.tag;import java.io.StringWriter;import javax.servlet.jsp.tagext.JspFragment;import javax.servlet.jsp.tagext.SimpleTagSupport;public class SimpleTagTest extends SimpleTagSupport/聲明屬性變量private int count;提供set方法供服務(wù)器調(diào)用public void set
14、Count(int count) this .count = count;/*覆蓋doTag方法,邏輯內(nèi)容在方法體內(nèi)完成*/Overridepublic void doTag()首先獲取jsp的標(biāo)簽體內(nèi)容JspFragmentjf = this .getJspBody();初始化一個(gè)String的帶緩沖的寫(xiě)入流StringWriter sw = new StringWriter();執(zhí)行count次的循環(huán)for (int i = 0; i < count; i+) try /將標(biāo)簽體中的內(nèi)容讀入到這個(gè)緩沖流當(dāng)中jf.i nvoke(sw);取出這個(gè)緩沖流的內(nèi)容賦值給Stri ngBuff
15、erStringBuffer sb = sw.getBuffer();將值賦值給ContentString content = sb.toString();獲取out流,打印被轉(zhuǎn)換為大寫(xiě)的內(nèi)容count次this.getJspC on text().getOut().write(c onten t.toUpperCase(); catch (Exception e) throw new RuntimeException(e);(3)在tld文件中注冊(cè)<tag><!-標(biāo)簽的名字-><n ame>for </n ame><!-標(biāo)簽的處理器-&g
16、t;<tag-class>c n.itcast.web.tag.SimpleTagTest </tag-class><!-是否有標(biāo)簽體內(nèi)容-><body-c ontent >scriptless</body-c ontent ><attribute ><!-用于指定屬性的名稱(chēng)->< n ame> count</n ame><!-是否默認(rèn)設(shè)置這個(gè)屬性->< required >true </required ><!-是否可以使用運(yùn)行時(shí)表達(dá)式 -&g
17、t;<rtexprvalue>true</rtexprvalue ></attribute></tag>三、簡(jiǎn)單標(biāo)簽開(kāi)發(fā)案例1、開(kāi)發(fā)防盜鏈標(biāo)簽所謂防盜鏈就是指如何防止自己的網(wǎng)站非別的網(wǎng)站非法鏈接,比如說(shuō)想自己的網(wǎng)站不能別的超鏈接連接,當(dāng)有外部連接連接到我的網(wǎng)站的時(shí)候,首先判斷其來(lái)源是不是自己的內(nèi)部站點(diǎn),如果是就可以繼續(xù)瀏覽網(wǎng)頁(yè),如果不是就轉(zhuǎn)到我的主頁(yè),這個(gè)判斷一句可以使用http頭信 息的 referer 來(lái)判斷,具體方法使用 request.getHeader("referer") ,具體怎么實(shí)現(xiàn)呢,我們使用 我們的防盜鎖標(biāo)
18、簽。( 1)我們想我們的這個(gè)標(biāo)簽一定要有兩個(gè)參數(shù),一個(gè)是site 指我們的 web 應(yīng)用,用以判斷客戶(hù)的地址來(lái)源是否來(lái)源于我們的應(yīng)用地址,第二個(gè)就是重定向的地址page。所以我們的標(biāo)簽可以這么寫(xiě):<% page language="java" import ="java.util.*" pageEncoding ="utf-8" %><% taglib prefix= "s" uri= "/lv-tags" %><s:referer site= "http
19、:/localhost" page="/index.jsp" ></s:referer><html ><head><title >使用簡(jiǎn)單標(biāo)簽實(shí)現(xiàn)防盜鏈 </title ></head>< body >鳳姐日記</body ></html >(2)然后,我們自定義一個(gè)標(biāo)簽處理類(lèi)RefererTag.java,這個(gè)類(lèi)的目的就是獲取客戶(hù)的連接地址是否與我們的 web 應(yīng)用地址一致如果不一致或者為 null, 為 null 表示這個(gè)連接地址可能 是從 QQ
20、上或者論壇上看到這個(gè)連接直接點(diǎn)進(jìn)來(lái)的。 這兩種情況都要考慮到, 這樣的話就轉(zhuǎn) 到我們的主頁(yè),但是不同的開(kāi)發(fā)人員在寫(xiě)這個(gè)標(biāo)簽的習(xí)慣不一樣,page里的值有的人喜歡直接寫(xiě)主頁(yè), 有的人喜歡寫(xiě)具體, 有的人寫(xiě)的不具體, 這樣不同的情況我們也要判斷然后再 重定向。具體代碼如下:package cn.itcast.web.tag.example;import java.io.IOException;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import javax.
21、servlet.jsp.JspException;import javax.servlet.jsp.PageContext;import javax.servlet.jsp.SkipPageException;import javax.servlet.jsp.tagext.SimpleTagSupport;public class RefererTag extends SimpleTagSupportprivate String page;private String site;public void setPage(String page) this.page= page;public vo
22、id setSite(String site) this .site = site;public void doTag() throws JspException, IOException 首先獲取頁(yè)面屬性對(duì)象PageC on text pageC on text = (PageC on text) this .getJspC on text(); 獲取 requestHttpServletRequest request = (HttpServletRequest) pageContext.getRequest();獲取 responseHttpServletResponse response
23、= (HttpServletResponse) pageContext.getResponse();通過(guò)頭文件信息referer判斷此次請(qǐng)求來(lái)源于哪里String referer = request.getHeaderfreferer");/如果referer等于空 或者 不是以site為開(kāi)始 說(shuō)明是盜鏈者根據(jù)page設(shè)置重定向到網(wǎng)站主頁(yè)if (referer = null | !referer.startsWith( site)/如果定義的page是以工程為根目錄則執(zhí)行重定向到此網(wǎng)頁(yè)day15/index.jspif (page.startsWith(request.getCo n
24、textPath()resp on se.se ndRedirectpage); 如果定義的page是以"/"為開(kāi)始目錄/index.jsp else if (page.startsWith("/")respon se.se ndRedirect(request.getC on textPath()+page); else/定義的page為一個(gè)頁(yè)面index.jsprespon se.se ndRedirect(request.getC on textPath()+"/" + page);throw new SkipPageExcep
25、tion();(3)最后,我們要在我們的tld文件中關(guān)聯(lián)我們的標(biāo)簽,所謂關(guān)聯(lián)就是指我們要讓我們的服務(wù)器知道當(dāng)其加載到這個(gè)頁(yè)面標(biāo)簽的時(shí)候知道其標(biāo)簽處理器是什么,這樣它才能幫助我們執(zhí)行這個(gè)標(biāo)簽,具體代碼如下:<tag><!-標(biāo)簽的名字 -><n ame>referer</ name><!-標(biāo)簽的處理器 -><tag-class>c n.itcast.web.tag.example.RefererTag </tag-class><!-是否有標(biāo)簽體內(nèi)容-><body-c ontent >scri
26、ptless</body-c ontent > <attribute ><!-用于指定屬性的名稱(chēng)-><n ame>site</name><!-是否默認(rèn)設(shè)置這個(gè)屬性->< required >true </required ><!-是否可以使用運(yùn)行時(shí)表達(dá)式<rtexprvalue >true</rtexprvalue ></ attribute ><attribute ><!- 用于指定屬性的名稱(chēng) -> <name>page
27、</name><!- 是否默認(rèn)設(shè)置這個(gè)屬性 -> <required>true</required><!- 是否可以使用運(yùn)行時(shí)表達(dá)式-><rtexprvalue >true</rtexprvalue ></ attribute ></tag>這樣我們的這個(gè)防盜鏈就做好了,當(dāng)客戶(hù)來(lái)源為 null 或者不是本應(yīng)用的話就會(huì)直接重定向 到我們的 web 工程的主頁(yè)。2、開(kāi)發(fā) <c:if> 標(biāo)簽If 標(biāo)簽是很常用的標(biāo)簽, 在分頁(yè)中, 或者我們要根據(jù)一些判斷條件顯示一些特殊信息的時(shí)候,i
28、f 標(biāo)簽就非常有用途了,那我們?nèi)绾伍_(kāi)發(fā)一個(gè)我們自己的 if 標(biāo)簽?zāi)???)首先我們想我們的這個(gè)標(biāo)簽的聲明,有沒(méi)有屬性,我們說(shuō)一定有,因?yàn)樗鼤?huì)根據(jù)這個(gè) 屬性的值進(jìn)行判斷, 如果為真就執(zhí)行, 如果為假就不執(zhí)行。 并且我們的這個(gè)屬性還要設(shè)定其 支持我們的 EL 表達(dá)式,這樣才能動(dòng)態(tài)的判斷其值,另外一點(diǎn)我們說(shuō)我們的標(biāo)簽處理器在定 義屬性的時(shí)候也要定義為 boolean 型,我們講我們繼承的簡(jiǎn)單標(biāo)簽為我們自定轉(zhuǎn)型八大基本 數(shù)據(jù)類(lèi)型,所以不必考慮轉(zhuǎn)型的過(guò)程。那我們來(lái)看一下我們的 if 標(biāo)簽的處理器: package cn.itcast.web.tag.example;import java.io.IOEx
29、ception;import javax.servlet.jsp.JspException;import javax.servlet.jsp.tagext.SimpleTagSupport;public class IfTag extends SimpleTagSupportprivate boolean test;public void setTest(boolean test) this .test = test;Overridepublic void doTag() throws JspException, IOException if (test)this .getJspBody().
30、invoke( null );我們發(fā)現(xiàn)我們的處理類(lèi)很簡(jiǎn)單,就是判斷了一下test是真是假,如果為真就調(diào)用in voke執(zhí)行我們的標(biāo)簽體,如果為假就不做操作。(2)然后,我們?cè)谖覀兊膖ld文件中注冊(cè),關(guān)聯(lián)這個(gè)標(biāo)簽。<!- IF標(biāo)簽-><tag><n ame>if</name<tag-class>cn.itcast.web.tag.example.1 fTag </tag-class><body-c ontent >scriptless</body-c ontent > <attribute >&
31、lt;n ame>test</name>< required >true </required ><rtexprvalue>true</rtexprvalue ></attribute></tag>(3)頁(yè)面是這么寫(xiě)的:<% page language="java" import ="java.util.*" pageEncoding="utf-8"%><% taglib prefix = "s" uri=&
32、quot;/lv-tags"%><html ><head><title >使用自定義標(biāo)簽實(shí)現(xiàn)if標(biāo)簽</title ></head><body><s:if test="$user!=null" > 登錄成功!</s:if><s:if test="$user=null" > 登錄失?。?lt;/s:if></body></html >3、開(kāi)發(fā)if - else標(biāo)簽在jstl標(biāo)簽當(dāng)中,沒(méi)有 else標(biāo)簽,顯
33、然是不健全的,jstl中的else標(biāo)簽使用另外一種形式, 就是when和otherwise,而他們是否實(shí)行還要看其父類(lèi)是否為真,假設(shè)父類(lèi)非真說(shuō)明父類(lèi)已經(jīng)執(zhí)行,則第告訴if或者else不再執(zhí)行其標(biāo)簽體??淳唧w實(shí)現(xiàn)代碼:if中的test是否為真(1 )設(shè)計(jì)理念,就是說(shuō)當(dāng)我們第一次執(zhí)行這個(gè)標(biāo)簽的時(shí)候,首先判斷且也要保證父標(biāo)簽也為真的時(shí)候我們的 if 才會(huì)執(zhí)行,在執(zhí)行了 if 以后為了確保我們的 else 不執(zhí)行,那么我們必須讓我們的父choose為真,這樣else查詢(xún)父親的時(shí)候if(!choose.isOk()就一定為假了所以else就不會(huì)執(zhí)行了。看我們的父標(biāo)簽的處理器:package cn.itc
34、ast.web.tag.example;/* 父標(biāo)簽*/import java.io.IOException;import javax.servlet.jsp.JspException;import javax.servlet.jsp.tagext.SimpleTagSupport;public class ChooseTag extends SimpleTagSupportprivate boolean isOk;public boolean isOk() return isOk ;public void setOk(boolean isOk) this .isOk = isOk;publi
35、c void doTag() throws JspException, IOException this .getJspBody().invoke( null );package cn.itcast.web.tag.example;import java.io.IOException;import javax.servlet.jsp.JspException;import javax.servlet.jsp.tagext.SimpleTagSupport;/* if-when標(biāo)簽處理器* author 呂鵬*/public class WhenTag extends SimpleTagSupp
36、ort private boolean test;public void setTest(boolean test) this .test = test;Overridepublic void doTag() throws JspException, IOException 首先獲得父類(lèi)的標(biāo)簽ChooseTagchoose = (ChooseTag) this .getPare nt();/如果if為真且父親的不為真的情況下執(zhí)行if只有執(zhí)行過(guò)if以后父親就為真了那else就不能執(zhí)行了if (test && !choose.isOk()this .getJspBody().inv
37、oke( null);choose.setOk(true); package cn.itcast.web.tag.example;import java.io.IOException;import javax.servlet.jsp.JspException;import javax.servlet.jsp.tagext.SimpleTagSupport;public class OtherwiseTag extends SimpleTagSupport Overridepublic void doTag() throws JspException, IOException ChooseTag
38、choose = (ChooseTag) this .getPare nt(); 獲取父標(biāo)簽只在在付標(biāo)簽不為真的情況下才執(zhí)行但if執(zhí)行的話父標(biāo)簽就為假了if(!choose.isOk()this .getJspBody().invoke( null);(2 )關(guān)聯(lián)標(biāo)簽<!-if-else 的父標(biāo)簽 Choose -><tag><n ame>choose</name<tag-class>c n.itcast.web.tag.example.ChooseTag</tag-class><body-c ontent >scr
39、iptless</body-c ontent ></tag><!- when標(biāo)簽-><tag><n ame>whe n</n ame><tag-class>cn.itcast.web.tag.example.WhenTag </tag-class><body-c ontent >scriptless</body-c ontent ><attribute ><n ame>test</name>< required >true &l
40、t;/required ><rtexprvalue>true</rtexprvalue ></attribute></tag><!-否則 otherWise標(biāo)簽-><tag><n ame>otherwise </n ame><tag-class>cn.itcast.web.tag.example.OtherwiseTag </tag-class> <body-c ontent >scriptless</body-c ontent ></ta
41、g>(3)頁(yè)面<% page language="java" import ="java.util.*" pageEncoding="utf-8"%><% taglib prefix = "s" uri="/lv-tags"%><html ><head><title >使用自定義標(biāo)簽實(shí)現(xiàn)if-else標(biāo)簽</title ></head><body><s:choose><s:wh
42、en test="$user!=null" >登錄成功!</s:whe n><s:otherwise >登錄失敗!</s:otherwise></s:choose></body></html >4、開(kāi)發(fā)迭代標(biāo)簽得帶標(biāo)簽就是說(shuō)我們?cè)陧?yè)面上往往要遍歷Servlet傳遞過(guò)來(lái)的數(shù)據(jù),集合或者是 Map,在開(kāi)發(fā)這個(gè)迭代標(biāo)簽的時(shí)候,我們特別要注意一個(gè)問(wèn)題就是我們所接受的類(lèi)型有很多種,有集合類(lèi)型的List或者Set,有Map類(lèi)型的HashMap等,有對(duì)象數(shù)據(jù),還有基本數(shù)據(jù)類(lèi)型的數(shù)組,針對(duì)他們要有不同的處理方式,
43、那我們?cè)趺磳?xiě)我們的標(biāo)簽處理器呢,我們可以定義一個(gè)Colleaction集合對(duì)象,不論接受到的是一個(gè)集合也好還是map也好,我們都把它轉(zhuǎn)換成一個(gè)集合對(duì)象,那么我們?cè)赿oTag方法中通過(guò)迭代器遍歷就可以了。那問(wèn)題就在這,我們?nèi)绾螌⑽覀兘邮艿臄?shù)據(jù)轉(zhuǎn)換成為一個(gè)Collection對(duì)象呢?針對(duì) map和list等這些還比較好轉(zhuǎn)換,可以對(duì)于Object和int等,我們通過(guò)看sun公司的jstl標(biāo)簽源碼我們發(fā)現(xiàn)他們是以傳統(tǒng)標(biāo)簽的開(kāi)發(fā)模式設(shè)計(jì)的,對(duì)于int基本類(lèi)型的數(shù)組采用一一判斷的方式,代碼有些冗長(zhǎng),我們傳智播客的老師就是聰明,他們使用一種更為巧妙的方式處理了它。首先,我們來(lái)看一下對(duì)于最原始的集合類(lèi)型如何遍
44、歷,代碼如下:package cn.itcast.web.tag.example;import java.io.IOException;import java.util.Iterator;import java.util.List;import javax.servlet.jsp.JspException;import javax.servlet.jsp.tagext.SimpleTagSupport;public class ForeachTag extends SimpleTagSupport private List items;private String var;public voi
45、d setltems(List items) this .items = items;public void setVar(String var) this .var = var;Overridepublic void doTag() throws JspException, IOException Iterator it = items.iterator();while (it.hasNext()Object value = it.next();this .getJspContext().setAttribute( var, value);this .getJspBody().invoke(
46、 null);我們發(fā)現(xiàn)缺點(diǎn)很多,對(duì)于其它類(lèi)型不能轉(zhuǎn)換,所以我們改進(jìn)了它: package cn.itcast.web.tag.example;import java.io.IOException;import java.lang.reflect.Array; import java.util.ArrayList;import java.util.Collection;import java.util.Iterator;import java.util.List;import java.util.Map;import javax.servlet.jsp.JspException;import j
47、avax.servlet.jsp.tagext.SimpleTagSupport;public class ForeachTag extends SimpleTagSupportprivate List items;private String var;map者E轉(zhuǎn)private Collection collection ; /定義一個(gè)集合類(lèi)型對(duì)象將所有接受的集合或者換成一個(gè) collectionpublic void setltems(List items) this .items = items;if (items instanceof Collection) /list setthis
48、 .collection = (Collection) items;else if(items instanceof Map)Map map= (Map) items;this .collectio n = map.e ntrySet();else if(items.getClass().isArray()this.collection = new ArrayList();();int len = Array. getLength(items);for(int i=0;i<len;i+)Object obj = Array. get(items, i);this.collection.a
49、dd(obj);elsethrow new RuntimeException(”只支持?jǐn)?shù)組、集合和 map");public void setVar(String var) this .var = var;Overridepublic void doTag() throws JspException, IOException Iterator it = items.iterator();while (it.hasNext()Object value = it.next();this .getJspContext().setAttribute( var, value);this .ge
50、tJspBody().invoke( null);最經(jīng)典的代碼已經(jīng)被紅色標(biāo)記了,使用了 Array這個(gè)類(lèi)節(jié)省了很多的代碼:jwa. reflect首先轉(zhuǎn)義前我們還是使用我們之前的方法使用StringBuffer獲取我們要轉(zhuǎn)義的內(nèi)容,然后根類(lèi) Array據(jù)不同的標(biāo)簽轉(zhuǎn)義成為不同的內(nèi)容:package cn.itcast.web.tag.example;import java.io.IOException;import java.io.StringWriter;import javax.servlet.jsp.JspException;import javax.servlet.jsp.tagext
51、.JspFragment;import javax.servlet.jsp.tagext.SimpleTagSupport;public class HtmlFilterTag extends SimpleTagSupport Overridepublic void doTag() throws JspException, IOException JspFragmentjf = this .getJspBody();StringWriter sw = new StringWriter();jf.i nvoke(sw);String content = sw.getBuffer().toStri
52、ng();&t;a href="">點(diǎn)點(diǎn) </a>content = filter(c onten t);this .getJspC on text().getOut().write(c on te nt);public String filter(String message)if (message= null )return (null);char content = new char message.length();message.getChars(O,message.length(), content, 0);StringBuff
53、er result = new StringBuffer(content. length + 50);for (int i = 0; i < content.length; i+) switch (contenti) case '<':result.append("<");break;case '>':result.append(">");break;case '&':result.append("&");break;
54、result.append(""");break;default :result.appe nd(c onten ti);return (result.toString();6、打包標(biāo)簽庫(kù)我們講我們好不容易寫(xiě)了這么多的標(biāo)簽庫(kù),我們要想辦法重復(fù)利用啊,我們可以使用導(dǎo)包的方法將我們寫(xiě)好的標(biāo)簽庫(kù)打包導(dǎo)出,當(dāng)我們?cè)僭趧e的工程中使用到標(biāo)簽的時(shí)候,我們就將我們的包導(dǎo)入就0K 了。四、JSTL核心標(biāo)簽庫(kù)使用我們可以使用Apache的jstl標(biāo)簽庫(kù)來(lái)完成一些操作,使用標(biāo)簽庫(kù)必須導(dǎo)入其架包名稱(chēng)4N Jstljar-standardjar1、<c:out> 標(biāo)簽&
55、lt;c:out>標(biāo)簽可以控制值的簡(jiǎn)單輸出,但其更有用的功能在于它可以幫助我們完成特別字符 的轉(zhuǎn)義,就不用我們?cè)偈褂梦覀冏远x的htmlFilter來(lái)轉(zhuǎn)義特殊字符了,另外,當(dāng)我們指定其輸出顯示的值為空的時(shí)候,使用其default=xxx可以默認(rèn)的顯示值。<c:out value ="$str"escapeXml ="true"default =:"xxxx" ></ c:out >這句話的意思就是說(shuō)頁(yè)面顯示str ,如果str 為空,貝y顯示xxxx如果str中有特殊字符,進(jìn)行轉(zhuǎn)義。標(biāo)簽對(duì)象中。屬性名是否
56、支謂性廻屬性描述ValuetrueObject指走要愉出的內(nèi)容escapelfiiiltrueBoolean楷定是否林人 *尊特殊字符 進(jìn)血編碼轉(zhuǎn)換后再進(jìn)f曲出.默認(rèn) 值為truedefault1truer1Object扌旨定如果対屬性的值為!mil時(shí)所輸出 的默認(rèn)值F2、<c:set> 標(biāo)簽<c:set>標(biāo)簽用于把某一個(gè)對(duì)象存在指定的域范圍內(nèi),或者設(shè)置Web域中的java.util.Map類(lèi)型的屬性對(duì)象或 JavaBean類(lèi)型的屬性對(duì)象的屬性。<br/>c:setpage request sessionapplictionmap iavabean <
57、br/><c:set var="str" value ="abc" scope="application" ></c:set>$str <%Map map = new HashMap(); request.setAttribute( "map" ,map);%><c:set property ="name" value="xxx" target="$map" ></c:set>$map.na
58、me <%Personp = new Person(); request.setAttribute( "pers on" ,p);%><c:set property ="name" value="flx" target="$person" ></c:set> $ TipivusetA標(biāo)簽*箭鳥(niǎo)靑篇蠶翳高段鶴鬻爲(wèi)豊纏1鵜潭壽薯麴置或中屬性名是否支持EL屬性類(lèi)型屬性描述valuetrueObject用于指是屬性值KvarfalseString用于指定要設(shè)置的坯屬
59、性的名稱(chēng)scopefalseString用于指定屬性所在的粧b域targettrueObject用于指定要設(shè)置色性的對(duì)象,這個(gè)對(duì)象必須 是J avaBean 對(duì)象或 j ava, ut il.Map 對(duì)象property1trueristringr1用于抬定當(dāng)前要為對(duì)象設(shè)置的屬性名稱(chēng)3、<c:remove><c:remove>標(biāo)簽用于刪除各種 Web域中的屬性。 其語(yǔ)法格式如下:<c:remove var="varName"scope="page|request|session|application" />4、<
60、;c:catch><c:catch>標(biāo)簽用于捕獲嵌套在標(biāo)簽體中的內(nèi)容拋出的異常,其語(yǔ)法格式如下:<c:catchvar="varName">nested actions</c:catch>var屬性用于標(biāo)識(shí)<c:catch>標(biāo)簽捕獲的異常對(duì)象,它將保存在page這個(gè) Web域中。<c:catch var="aa"><%int i = 1/0;%></c:catch>Tip : VuHfA標(biāo)簽 <c:catch>標(biāo)簽用于捕獲嵌套在標(biāo)簽體中的內(nèi)容拋出的異常,
61、其語(yǔ) 法格式如下:<c:catch var=arNamer,>nestetf actions<>c.cch> varSli用于標(biāo)識(shí)<c:catch>標(biāo)簽捕獲的異常對(duì)彖,它寤杠存在pe*ge 這個(gè)Web域中°<% taqlib prefix=V iri='http7/java.suaconrVjsp/jstVcore' %> page contentType= textfhtml;charset=gti2312 %><c:catch var= esc1 scope= page>10/0;<ac
62、atch>異常:<c:out value=nexr /> Smye3(<br >異當(dāng) ni)ex.getMessag&t <c:out value="5iwex.message'/><tx/> 異 my ex.getCause: c:out value- 5 my ex. cause- ><t)r f> 異myex.getStackTrace: <c:out valuer Sm>ex.stackTrace;: 處理JSP異常的解決方案: Exception對(duì)象執(zhí)行錯(cuò)誤頁(yè)面 Web.xml文件中配置各種 Exception目標(biāo)頁(yè)面 <c:catch>標(biāo)簽捕獲異常被錯(cuò)誤日志記錄異常:遇到異常一定要拋-建議轉(zhuǎn)成運(yùn)行時(shí)異常往上拋要上一層知道-在最上層web層不要再拋了,因?yàn)?web層客戶(hù) 通過(guò)友好信息反饋給用戶(hù)-使用日志文件記錄異常保存后臺(tái)5、<c:if><c:if test="” >標(biāo)簽可以構(gòu)造簡(jiǎn)單的"if-then ”結(jié)構(gòu)的條件表達(dá)式<c:if var ="test"tes
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 馬戲團(tuán)合作協(xié)議書(shū)
- 2025年個(gè)人別墅測(cè)繪項(xiàng)目合同范本
- 2025版房地產(chǎn)開(kāi)發(fā)項(xiàng)目施工合同交底書(shū)范本2篇
- 2025-2030全球三氟化銪行業(yè)調(diào)研及趨勢(shì)分析報(bào)告
- 2025-2030全球高折射率光纖行業(yè)調(diào)研及趨勢(shì)分析報(bào)告
- 2025-2030全球滑動(dòng)軸承襯套行業(yè)調(diào)研及趨勢(shì)分析報(bào)告
- 2025-2030全球落地護(hù)眼燈行業(yè)調(diào)研及趨勢(shì)分析報(bào)告
- 2025年全球及中國(guó)微膠囊熱致變色顏料行業(yè)頭部企業(yè)市場(chǎng)占有率及排名調(diào)研報(bào)告
- 石料破碎加工合同范本
- 2025版?zhèn)€人股權(quán)交易保密協(xié)議書(shū)4篇
- 中國(guó)末端執(zhí)行器(靈巧手)行業(yè)市場(chǎng)發(fā)展態(tài)勢(shì)及前景戰(zhàn)略研判報(bào)告
- 北京離婚協(xié)議書(shū)(2篇)(2篇)
- 2025中國(guó)聯(lián)通北京市分公司春季校園招聘高頻重點(diǎn)提升(共500題)附帶答案詳解
- 康復(fù)醫(yī)學(xué)科患者隱私保護(hù)制度
- Samsung三星SMARTCAMERANX2000(20-50mm)中文說(shuō)明書(shū)200
- 2024年藥品質(zhì)量信息管理制度(2篇)
- 2024年安徽省高考地理試卷真題(含答案逐題解析)
- 廣東省廣州市2024年中考數(shù)學(xué)真題試卷(含答案)
- 高中學(xué)校開(kāi)學(xué)典禮方案
- 內(nèi)審檢查表完整版本
- 3級(jí)人工智能訓(xùn)練師(高級(jí))國(guó)家職業(yè)技能鑒定考試題及答案
評(píng)論
0/150
提交評(píng)論