版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、使用傳統(tǒng)和簡單模式開發(fā)標(biāo)簽,簡單標(biāo)簽開發(fā)案例,使用 JSTL 核心標(biāo)簽庫作者:呂鵬時間: 2011-08-09一、傳統(tǒng)標(biāo)簽開發(fā)模式1、使用實現(xiàn)了 tag 接口的類-六個方法(執(zhí)行流程)setPageContext 傳遞頁面 pageContext 對象(這個對象可以獲取其它八大隱含對象) setParent 設(shè)置父標(biāo)簽,沒有父標(biāo)簽傳 nullgetParentdoStartTag 遇到開始標(biāo)簽執(zhí)行這個方法doEndTag遇到結(jié)束標(biāo)簽執(zhí)行這個方法release釋放資源-繼承子類 TagSupport 只重寫自己感興趣的方法2、執(zhí)行流程IE 請求 jsp 頁面到服務(wù)器,轉(zhuǎn)換為 Servlet 后,
2、由 Servlet 執(zhí)行,遇到標(biāo)簽以后,創(chuàng)建標(biāo)簽對 應(yīng)的標(biāo)簽處理器實例對象,調(diào)用標(biāo)簽的setPageContext 方法,把頁面的 pageContext 對象傳遞給標(biāo)簽處理器,然后再調(diào)用setParent方法,把父標(biāo)簽傳遞給標(biāo)簽處理器,如果沒有父標(biāo)簽,傳null,遇到開始標(biāo)簽,調(diào)用doStartTag方法,一般情況下還會執(zhí)行標(biāo)簽體,遇到結(jié)束標(biāo)簽調(diào)用doEndTag,最后一般情況下調(diào)用realease方法釋放資源。3、使用步驟自定義一個類,使其繼承TagSupport方法,重寫doStartTag方法,方法體中獲取 request對象和out對象, 寫相關(guān)方法; 在WEB-INF目錄下建立一個
3、.tld的文件,寫以下內(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> <!-資源名稱-><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 ><!-用于指定屬性的名稱 ->< n ame> count</n ame><!-是否默認(rèn)設(shè)置這個屬性->< required >true </required ><!-是否可以使用運行時表達(dá)式-><rtexprvalue>true</rtexprvalue ></attribute></tag></taglib >在 js
7、p 頁面中導(dǎo)入資源包:<% taglib prefix="s" uri="/itcast-tags"%> 4、自定義標(biāo)簽的作用:1、將 jsp 頁面中的 java 代碼移除2、控制頁面某一內(nèi)容是否輸出3、整個 jsp 是否執(zhí)行4、控制頁面內(nèi)容重復(fù)輸出5、修改 jsp 內(nèi)容輸出5、 JspTag 接口 空實現(xiàn)的標(biāo)識類型模式serializable 和 cloneable 都是這樣的標(biāo)識類型規(guī)范。目的就是給特殊的類以特殊的權(quán)限,就比如clo neable,實現(xiàn)它就表示可以被克隆了。二、使用簡單標(biāo)簽?zāi)J介_發(fā)1. 執(zhí)行過程首先實例化實現(xiàn)了 simpl
8、eTag 的類實例 ,首先調(diào)用標(biāo)簽處理類對象的 setJspContext 方法,將代 表 jsp 頁面的 pageContext 對象傳遞給標(biāo)簽處理器對象,然后調(diào)用 setParent 方法,將父標(biāo)簽處理器對象傳遞給這個標(biāo)簽處理器對象(只有父標(biāo)簽存在的情況下才會調(diào)用這個方法),如果調(diào)用標(biāo)簽時間設(shè)置了屬性,容器將調(diào)用每個輸贏對應(yīng)的setter方法把屬性值傳遞給標(biāo)簽處理器對象,如果標(biāo)簽的屬性值是 EL表達(dá)式或者腳本表達(dá)式則web容器首先計算表達(dá)式的值然后把值傳遞給標(biāo)簽處理器對象。如果簡單標(biāo)簽有標(biāo)簽體容器將調(diào)用setJspBody方法把代表標(biāo)簽體的JspFragment對象傳遞進(jìn)來。這樣就完成了標(biāo)
9、簽的初始化工作。執(zhí)行標(biāo)簽體調(diào)用doTag方法,開發(fā)人員在方法體內(nèi)通過操作jspFragment對象,就可以完成是否執(zhí)行迭代,修改標(biāo)簽提的目的。2、invoke方法詳解Invoke方法是jspFragment最重要的方法,利用這個方法可以控制是否執(zhí)行和輸出標(biāo)簽提的 年日哦那個是否迭代執(zhí)行標(biāo)簽提的內(nèi)容或者對執(zhí)行結(jié)果進(jìn)行修改再輸出。3、開發(fā)帶屬性的標(biāo)簽1首先在標(biāo)簽處理器中編寫每個屬性對應(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 ><!-用于指定屬性的名稱-><name>count </name ><!-是否默認(rèn)設(shè)置這個屬性->< required >true </ required ><!-是否可以使用運行時表達(dá)式->< rtexprvalue >true </ rtexprvalue ></ attribute ></ tag >4、使用簡單標(biāo)簽做一個簡單的例子控制頁面內(nèi)容轉(zhuǎn)換成大寫然后輸出五次(1 )在jsp中引入資源,寫標(biāo)簽體內(nèi)容<% page l
12、anguage="java" import ="java.util.*" pageEncoding="utf-8"%><% taglib prefix = "lv" uri="/itcast-tags"%><html ><head><title > 簡單標(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();初始化一個String的帶緩沖的寫入流StringWriter sw = new StringWriter();執(zhí)行count次的循環(huán)for (int i = 0; i < count; i+) try /將標(biāo)簽體中的內(nèi)容讀入到這個緩沖流當(dāng)中jf.i nvoke(sw);取出這個緩沖流的內(nèi)容賦值給Stri ngBuff
15、erStringBuffer sb = sw.getBuffer();將值賦值給ContentString content = sb.toString();獲取out流,打印被轉(zhuǎn)換為大寫的內(nèi)容count次this.getJspC on text().getOut().write(c onten t.toUpperCase(); catch (Exception e) throw new RuntimeException(e);(3)在tld文件中注冊<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 ><!-用于指定屬性的名稱->< n ame> count</n ame><!-是否默認(rèn)設(shè)置這個屬性->< required >true </required ><!-是否可以使用運行時表達(dá)式 -&g
17、t;<rtexprvalue>true</rtexprvalue ></attribute></tag>三、簡單標(biāo)簽開發(fā)案例1、開發(fā)防盜鏈標(biāo)簽所謂防盜鏈就是指如何防止自己的網(wǎng)站非別的網(wǎng)站非法鏈接,比如說想自己的網(wǎng)站不能別的超鏈接連接,當(dāng)有外部連接連接到我的網(wǎng)站的時候,首先判斷其來源是不是自己的內(nèi)部站點,如果是就可以繼續(xù)瀏覽網(wǎng)頁,如果不是就轉(zhuǎn)到我的主頁,這個判斷一句可以使用http頭信 息的 referer 來判斷,具體方法使用 request.getHeader("referer") ,具體怎么實現(xiàn)呢,我們使用 我們的防盜鎖標(biāo)
18、簽。( 1)我們想我們的這個標(biāo)簽一定要有兩個參數(shù),一個是site 指我們的 web 應(yīng)用,用以判斷客戶的地址來源是否來源于我們的應(yīng)用地址,第二個就是重定向的地址page。所以我們的標(biāo)簽可以這么寫:<% 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 >使用簡單標(biāo)簽實現(xiàn)防盜鏈 </title ></head>< body >鳳姐日記</body ></html >(2)然后,我們自定義一個標(biāo)簽處理類RefererTag.java,這個類的目的就是獲取客戶的連接地址是否與我們的 web 應(yīng)用地址一致如果不一致或者為 null, 為 null 表示這個連接地址可能 是從 QQ
20、上或者論壇上看到這個連接直接點進(jìn)來的。 這兩種情況都要考慮到, 這樣的話就轉(zhuǎn) 到我們的主頁,但是不同的開發(fā)人員在寫這個標(biāo)簽的習(xí)慣不一樣,page里的值有的人喜歡直接寫主頁, 有的人喜歡寫具體, 有的人寫的不具體, 這樣不同的情況我們也要判斷然后再 重定向。具體代碼如下: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 首先獲取頁面屬性對象PageC on text pageC on text = (PageC on text) this .getJspC on text(); 獲取 requestHttpServletRequest request = (HttpServletRequest) pageContext.getRequest();獲取 responseHttpServletResponse response
23、= (HttpServletResponse) pageContext.getResponse();通過頭文件信息referer判斷此次請求來源于哪里String referer = request.getHeaderfreferer");/如果referer等于空 或者 不是以site為開始 說明是盜鏈者根據(jù)page設(shè)置重定向到網(wǎng)站主頁if (referer = null | !referer.startsWith( site)/如果定義的page是以工程為根目錄則執(zhí)行重定向到此網(wǎng)頁day15/index.jspif (page.startsWith(request.getCo n
24、textPath()resp on se.se ndRedirectpage); 如果定義的page是以"/"為開始目錄/index.jsp else if (page.startsWith("/")respon se.se ndRedirect(request.getC on textPath()+page); else/定義的page為一個頁面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)其加載到這個頁面標(biāo)簽的時候知道其標(biāo)簽處理器是什么,這樣它才能幫助我們執(zhí)行這個標(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 ><!-用于指定屬性的名稱-><n ame>site</name><!-是否默認(rèn)設(shè)置這個屬性->< required >true </required ><!-是否可以使用運行時表達(dá)式<rtexprvalue >true</rtexprvalue ></ attribute ><attribute ><!- 用于指定屬性的名稱 -> <name>page
27、</name><!- 是否默認(rèn)設(shè)置這個屬性 -> <required>true</required><!- 是否可以使用運行時表達(dá)式-><rtexprvalue >true</rtexprvalue ></ attribute ></tag>這樣我們的這個防盜鏈就做好了,當(dāng)客戶來源為 null 或者不是本應(yīng)用的話就會直接重定向 到我們的 web 工程的主頁。2、開發(fā) <c:if> 標(biāo)簽If 標(biāo)簽是很常用的標(biāo)簽, 在分頁中, 或者我們要根據(jù)一些判斷條件顯示一些特殊信息的時候,i
28、f 標(biāo)簽就非常有用途了,那我們?nèi)绾伍_發(fā)一個我們自己的 if 標(biāo)簽?zāi)???)首先我們想我們的這個標(biāo)簽的聲明,有沒有屬性,我們說一定有,因為它會根據(jù)這個 屬性的值進(jìn)行判斷, 如果為真就執(zhí)行, 如果為假就不執(zhí)行。 并且我們的這個屬性還要設(shè)定其 支持我們的 EL 表達(dá)式,這樣才能動態(tài)的判斷其值,另外一點我們說我們的標(biāo)簽處理器在定 義屬性的時候也要定義為 boolean 型,我們講我們繼承的簡單標(biāo)簽為我們自定轉(zhuǎn)型八大基本 數(shù)據(jù)類型,所以不必考慮轉(zhuǎn)型的過程。那我們來看一下我們的 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)我們的處理類很簡單,就是判斷了一下test是真是假,如果為真就調(diào)用in voke執(zhí)行我們的標(biāo)簽體,如果為假就不做操作。(2)然后,我們在我們的tld文件中注冊,關(guān)聯(lián)這個標(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)頁面是這么寫的:<% page language="java" import ="java.util.*" pageEncoding="utf-8"%><% taglib prefix = "s" uri=&
32、quot;/lv-tags"%><html ><head><title >使用自定義標(biāo)簽實現(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、開發(fā)if - else標(biāo)簽在jstl標(biāo)簽當(dāng)中,沒有 else標(biāo)簽,顯
33、然是不健全的,jstl中的else標(biāo)簽使用另外一種形式, 就是when和otherwise,而他們是否實行還要看其父類是否為真,假設(shè)父類非真說明父類已經(jīng)執(zhí)行,則第告訴if或者else不再執(zhí)行其標(biāo)簽體。看具體實現(xiàn)代碼:if中的test是否為真(1 )設(shè)計理念,就是說當(dāng)我們第一次執(zhí)行這個標(biāo)簽的時候,首先判斷且也要保證父標(biāo)簽也為真的時候我們的 if 才會執(zhí)行,在執(zhí)行了 if 以后為了確保我們的 else 不執(zhí)行,那么我們必須讓我們的父choose為真,這樣else查詢父親的時候if(!choose.isOk()就一定為假了所以else就不會執(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 首先獲得父類的標(biāo)簽ChooseTagchoose = (ChooseTag) this .getPare nt();/如果if為真且父親的不為真的情況下執(zhí)行if只有執(zhí)行過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)頁面<% page language="java" import ="java.util.*" pageEncoding="utf-8"%><% taglib prefix = "s" uri="/lv-tags"%><html ><head><title >使用自定義標(biāo)簽實現(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、開發(fā)迭代標(biāo)簽得帶標(biāo)簽就是說我們在頁面上往往要遍歷Servlet傳遞過來的數(shù)據(jù),集合或者是 Map,在開發(fā)這個迭代標(biāo)簽的時候,我們特別要注意一個問題就是我們所接受的類型有很多種,有集合類型的List或者Set,有Map類型的HashMap等,有對象數(shù)據(jù),還有基本數(shù)據(jù)類型的數(shù)組,針對他們要有不同的處理方式,
43、那我們怎么寫我們的標(biāo)簽處理器呢,我們可以定義一個Colleaction集合對象,不論接受到的是一個集合也好還是map也好,我們都把它轉(zhuǎn)換成一個集合對象,那么我們在doTag方法中通過迭代器遍歷就可以了。那問題就在這,我們?nèi)绾螌⑽覀兘邮艿臄?shù)據(jù)轉(zhuǎn)換成為一個Collection對象呢?針對 map和list等這些還比較好轉(zhuǎn)換,可以對于Object和int等,我們通過看sun公司的jstl標(biāo)簽源碼我們發(fā)現(xiàn)他們是以傳統(tǒng)標(biāo)簽的開發(fā)模式設(shè)計的,對于int基本類型的數(shù)組采用一一判斷的方式,代碼有些冗長,我們傳智播客的老師就是聰明,他們使用一種更為巧妙的方式處理了它。首先,我們來看一下對于最原始的集合類型如何遍
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)缺點很多,對于其它類型不能轉(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 ; /定義一個集合類型對象將所有接受的集合或者換成一個 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這個類節(jié)省了很多的代碼:jwa. reflect首先轉(zhuǎn)義前我們還是使用我們之前的方法使用StringBuffer獲取我們要轉(zhuǎn)義的內(nè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="">點點 </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)簽庫我們講我們好不容易寫了這么多的標(biāo)簽庫,我們要想辦法重復(fù)利用啊,我們可以使用導(dǎo)包的方法將我們寫好的標(biāo)簽庫打包導(dǎo)出,當(dāng)我們再在別的工程中使用到標(biāo)簽的時候,我們就將我們的包導(dǎo)入就0K 了。四、JSTL核心標(biāo)簽庫使用我們可以使用Apache的jstl標(biāo)簽庫來完成一些操作,使用標(biāo)簽庫必須導(dǎo)入其架包名稱4N Jstljar-standardjar1、<c:out> 標(biāo)簽&
55、lt;c:out>標(biāo)簽可以控制值的簡單輸出,但其更有用的功能在于它可以幫助我們完成特別字符 的轉(zhuǎn)義,就不用我們再使用我們自定義的htmlFilter來轉(zhuǎn)義特殊字符了,另外,當(dāng)我們指定其輸出顯示的值為空的時候,使用其default=xxx可以默認(rèn)的顯示值。<c:out value ="$str"escapeXml ="true"default =:"xxxx" ></ c:out >這句話的意思就是說頁面顯示str ,如果str 為空,貝y顯示xxxx如果str中有特殊字符,進(jìn)行轉(zhuǎn)義。標(biāo)簽對象中。屬性名是否
56、支謂性廻屬性描述ValuetrueObject指走要愉出的內(nèi)容escapelfiiiltrueBoolean楷定是否林人 *尊特殊字符 進(jìn)血編碼轉(zhuǎn)換后再進(jìn)f曲出.默認(rèn) 值為truedefault1truer1Object扌旨定如果対屬性的值為!mil時所輸出 的默認(rèn)值F2、<c:set> 標(biāo)簽<c:set>標(biāo)簽用于把某一個對象存在指定的域范圍內(nèi),或者設(shè)置Web域中的java.util.Map類型的屬性對象或 JavaBean類型的屬性對象的屬性。<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)簽*箭鳥靑篇蠶翳高段鶴鬻爲(wèi)豊纏1鵜潭壽薯麴置或中屬性名是否支持EL屬性類型屬性描述valuetrueObject用于指是屬性值KvarfalseString用于指定要設(shè)置的坯屬
59、性的名稱scopefalseString用于指定屬性所在的粧b域targettrueObject用于指定要設(shè)置色性的對象,這個對象必須 是J avaBean 對象或 j ava, ut il.Map 對象property1trueristringr1用于抬定當(dāng)前要為對象設(shè)置的屬性名稱3、<c:remove><c:remove>標(biāo)簽用于刪除各種 Web域中的屬性。 其語法格式如下:<c:remove var="varName"scope="page|request|session|application" />4、<
60、;c:catch><c:catch>標(biāo)簽用于捕獲嵌套在標(biāo)簽體中的內(nèi)容拋出的異常,其語法格式如下:<c:catchvar="varName">nested actions</c:catch>var屬性用于標(biāo)識<c:catch>標(biāo)簽捕獲的異常對象,它將保存在page這個 Web域中。<c:catch var="aa"><%int i = 1/0;%></c:catch>Tip : VuHfA標(biāo)簽 <c:catch>標(biāo)簽用于捕獲嵌套在標(biāo)簽體中的內(nèi)容拋出的異常,
61、其語 法格式如下:<c:catch var=arNamer,>nestetf actions<>c.cch> varSli用于標(biāo)識<c:catch>標(biāo)簽捕獲的異常對彖,它寤杠存在pe*ge 這個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對象執(zhí)行錯誤頁面 Web.xml文件中配置各種 Exception目標(biāo)頁面 <c:catch>標(biāo)簽捕獲異常被錯誤日志記錄異常:遇到異常一定要拋-建議轉(zhuǎn)成運行時異常往上拋要上一層知道-在最上層web層不要再拋了,因為 web層客戶 通過友好信息反饋給用戶-使用日志文件記錄異常保存后臺5、<c:if><c:if test="” >標(biāo)簽可以構(gòu)造簡單的"if-then ”結(jié)構(gòu)的條件表達(dá)式<c:if var ="test"tes
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 現(xiàn)代商務(wù)場合下的著裝與舉止規(guī)范
- 居然之家國慶節(jié)活動方案
- 現(xiàn)代農(nóng)業(yè)旅游產(chǎn)業(yè)鏈構(gòu)建與農(nóng)業(yè)可持續(xù)發(fā)展
- 未來生態(tài)社區(qū)的規(guī)劃與水環(huán)境關(guān)系探討
- 災(zāi)害預(yù)防教育在學(xué)校的推廣與應(yīng)用
- 匯報邏輯清晰度職場的制勝法寶
- 6 飛向藍(lán)天的恐龍說課稿-2023-2024學(xué)年四年級下冊語文統(tǒng)編版
- 2023九年級物理上冊 第四章 探究電流4.3 導(dǎo)體對電流阻礙作用說課稿 (新版)教科版
- 2 送元二使安西(說課稿)- 2024-2025學(xué)年部編版語文六年級上冊
- 2024-2025學(xué)年高中數(shù)學(xué) 第一章 集合與常用邏輯用語 1.4.2 充要條件說課稿 新人教A版必修第一冊001
- 植物的類群及演化
- 老年社會工作課件
- 最新記24小時出入量、護(hù)理文書書寫規(guī)范課件
- 普通生物學(xué)考試大綱
- DB23T 2714-2020 農(nóng)村生活垃圾非焚燒低溫處理設(shè)施大氣污染物排放標(biāo)準(zhǔn)
- 【人教版】免疫系統(tǒng)的組成和功能課件1
- 農(nóng)信社運營主管述職報告【三篇】
- 48個國際音標(biāo)表(打印版)已整理
- 建標(biāo) 198-2022 城市污水處理工程項目建設(shè)標(biāo)準(zhǔn)
- 高等數(shù)學(xué)中符號的讀法及功能(挺全的)
- 基層法律服務(wù)所設(shè)立登記表
評論
0/150
提交評論