您好,登錄后才能下訂單哦!
這篇文章將為大家詳細講解有關JSP標記是什么意思,小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。
1.概述
1)什么是JSP標記
顧名思義,JSP標記就是在JSP文件中使用的標記。它類似于html語法中的標記,像head、table。通過在JSP文件中引用它(就像使用html標記那樣),可以更方便的實現對Java代碼模塊的重用。
2)為什么要使用JSP標記技術(與javabean相比)
好處:
JSP標記可以處理JSP正文的內容,比如改變文本顯示樣式;而javabean不可以。
JSP標記接口簡單,易于使用,也易于開發和維護。
壞處:
JSP標記在進行設置時要比javabean復雜很多,體現在JSP標記庫描述文件(*.tld)的配置上。
JSP標記實現的功能遠不如javabean強大。
當前只要JSP1.1支持JSP標記,而JSP1.0和1.1都支持對Bean的使用。
2.JSP標記的開發簡介。
JSP標記的開發需要編寫2種獨立的文件。一種是定義標記功能的java類文件,一種是將xml元素名稱(標記)映射到標記實現的標記庫描述符文件。
⑴編寫JSP標記處理程序類文件
需要繼承javax.servlet.jsp.tagext.TagSupport類;
簡單示例:
//文件名ExampleTag.java importjavax.servlet.jsp.*; importjavax.servlet.jsp.tagext.*; importjava.io.*; publicclassExampleTagextendsTagSupport{ //程序的執行起始點 publicintdoStartTag(){ try{ JspWriterout=pageContext.getOut(); out.print(“Customtagexample”); }catch(IOExceptionioe){ System.out.println(“ErrorinExampleTag:“+ioe); } return(SKIP_BODY);//當標記包括的內容為空時返回SKIP_BODY,表示標記功能 //已執行完成 } }
編譯好的class文件將位于服務器的的特定位置。
⑵編寫JSP標記庫描述符文件
將標記名和其代表的功能實現聯系在一起。
簡單示例:
﹤!--文件名:csajsp-taglib.tld--﹥; ﹤?xmlversion=”1.0”encoding=”ISO-8859-1”?﹥; ﹤!DOCTYPEtaglib PUBLIC“-//SunMicrosystem,Inc.//DTDJSPTagLibrary1.1//EN” http://java.sun.com/j2ee/dtds/web-jsptaglibrary_1_1.dtd﹥; //以上是標準的文件頭 //以下是標簽庫描述 ﹤tlibversion﹥;1.0﹤/tlibversion﹥;//Tag庫的版本 ﹤jspversion﹥;1.1﹤/jspversion﹥;//JSP庫的版本 ﹤shortname﹥;csajsp﹤/shortname﹥;//自定義標記前綴名 ﹤uri﹥;﹤/uri﹥;//標記描述符文件的uri,可以是空 ﹤info﹥;Mycustomtag!﹤/info﹥;//標記庫的描述信息 //以下定義新標記 ﹤tag﹥; ﹤name﹥;example﹤/name﹥;//自定義的標記名 ﹤tagclass﹥;tags.ExampleTag﹤/tagclass﹥;//定位標簽處理類文件 ﹤info﹥;Simplestexample﹤/info﹥;//描述信息 ﹤bodycontent﹥;EMPTY﹤/bodycontent﹥;//不處理JSP文件正文內容 ﹤/tag﹥; ﹤/taglib﹥;
此文件將配置在服務器的特定位置
⑶使用以上自定義的JSP標記
﹤!--文件名:simpleExample.jsp--﹥; ﹤!DOCTYPEHTMLPUBLIC“-//W3C//DTDHTML4.0Transitional//EN”﹥; ﹤HTML﹥; ﹤HEAD﹥; ﹤%@tagliburi=“csajsp-taglib.tld”prefix=“csajsp”%﹥;//進行標記使用聲明 ﹤TITLE﹥;﹤csajsp:example/﹥;﹤TITLE﹥; ﹤LINKREL=STYLESHEETHREF=”JSP-styles.css” TYPE=”text/css”﹥; ﹤HEAD﹥; ﹤BODY﹥; ﹤H1﹥;﹤csajsp:example/﹥;﹤H1﹥;/使用標記 ﹤csajsp:example/﹥; ﹤/BODY﹥; ﹤/HTML﹥;
這樣最終在在瀏覽器上輸出為
Customtagexample
3.深入的JSP標記開發
⑴添加標記屬性
在標記處理類中可以通過函數setAttribute(Stringvalue)為JSP標記分配屬性,這樣標記處理程序根據獲取的屬性值來實現相關功能。
比如:
privateStringmessage=“DefaultMessage”; publicvoidsetMessage(Stringmessage){ this.message=message; }
注意:屬性名message是小寫的,設置函數中的Message是大寫的。
◆與之相關的在tld文件中需要在tag元素中添加如下元素
﹤tag﹥; … ﹤attribute﹥; ﹤name﹥;message﹤/name﹥;//屬性名 ﹤required﹥;false﹤/requied﹥;//屬性值是否必須提供。False表示不必,存在缺省值。 ﹤rtexprvalue﹥;true﹤/rtexprvalue﹥;//ture表示屬性值可以使用JSP表達式,false表示禁 //止使用 ﹤/attribute﹥; … ﹤/tag﹥;
◆對應JSP文件中引用為:﹤prefix:namemessage=“Hello!”/﹥;
⑵使用標記正文
即是在標記中使用一些包含JSP腳本元素、文本等的內容,這些內容由JSP引擎處理。
形式如下:
﹤prefix:tagname﹥;body(正文內容)﹤prefix:tagname﹥;
在處理JSP標記的正文前,將會調用處理程序的doStartTag()方法,此時要在此方法中返回EVAL_BODY_INCLUDE以表明包含有標記正文;處理完后,將會調用doEndTag()方法,此后要讓jsp引擎繼續處理后面的頁面,得返回EVAL_PAGE,否則返回SKIP_PAGE。
◆對應在tld文件中需要在tag元素中添加如下元素
﹤tag﹥; … ﹤bodycontent﹥;JSP﹤/bodycontent﹥;//表明包含正文 … ﹤/tag﹥;
另外:可以設置一些條件來判斷是否包含正文的,如下:
publicintdoStartTag(){ ServletRequestrequest=pageContext.getRequest(); StringdebugFlag=request.getParameter(“debug”); If((debugFlag!=null)&&(!debugFlag.equalsIgnoreCase(“false”))){ Return(EVAL_BODY_INCLUDE); } else{ return(SKIP_BODY); } }
這樣只有在url尾部給出請求參數值debug=true,才會顯示標記正文的內容。這樣可以隱藏一些調試信息。
⑶對標記正文進行處理
JSP的標記可以對包含的正文進行處理(修改),然后再輸出。這需要標記處理類繼承BodyTagSupport類(TagSupport類的繼承)。這個類提供了2個重要的方法用于正文處理。
→doAfterBody:默認執行的方法,在此方法中包含正文的處理過程。
→getBodyContent:返回BodyContent類型的的對象,此對象包含了有關標記正文的信息。
BodyContent類型包含的重要方法:
→getEnclosingWriter:返回JspWriter方法,輸出內容。
→getString:返回包含全部JSP標記正文的字符串。
注意:這里和⑵中介紹的輸出JSP標記正文的方式不一樣。前者的輸出是先由JSP引擎解釋,這里是在JSP標記處理程序中直接輸出到給瀏覽器。
另外,在doAferBody中返回SKIP_BODY,表示終止標記正文處理;若返回的是EVAL_BODY_TAG,將會再一次調用doAferBody方法,重新處理標記正文,直到返回SKIP_BODY為止。
示例:
→標記處理程序片:
下面的程序片將調用一個filter方法,此方法用于把JSP正文中的字符﹤﹥;“&分別用⁢>&guot;&來代替。以使瀏覽器按字符原樣輸出,不進行解釋。
publicclassFillterTagextendsBodyTagSupport{ publicintdoAfterBody(){ BodyContentbody=getBodyContent(); StringfilteredBody=ServletUtilities.filter(body.getString());//將正文得到的字符串過濾 Try{ JspWriterout=body.getEnclosingWriter(); out.print(filteredBody);//輸出過濾后的文本 }catch(IOExceptionioe){ System.out.println(“ErrorinFilterTag:“+ioe); } return(SKIP_BODY);//終止JSP正文處理 }
→標記符描述文件片
… ﹤tag﹥; ﹤name﹥;filter﹤/name﹥; ﹤tagclass﹥;tags.FilterTag﹤/tagclass﹥; ﹤bodycontent﹥;JSP﹤/bodycontent﹥; ﹤/tag﹥; …
→JSP文件片
﹤csajsp:filter﹥; ﹤STRONG﹥;Iloveyou!﹤/STRONG﹥; ; ﹤EM﹥;Iloveyou!﹤EM﹥; ﹤/csajsp:filter﹥;
這樣,在瀏覽器中輸出的標記正文應當是
﹤STRONG﹥;Iloveyou!﹤/STRONG﹥; ; ﹤EM﹥;Iloveyou!﹤EM﹥;
而不是
Iloveyou!
Iloveyou!
⑶使用JSP嵌套標記。
可以對多個JSP標記進行嵌套引用,這樣子標記就可以訪問和存儲父標記的數據和方法。
子標記訪問父標記需要使用BodyTagSupport類中的findAccetorWithClass方法。注意它只能查找臨近的父標記。
假如在JSP文件中如下的嵌套引用:
﹤!--此嵌套標記模擬條件判斷--﹥; ﹤csajsp:if﹥; ﹤csajsp:condition﹥;true﹤/csajsp:condition﹥; ﹤csajsp:then﹥;Conditionwastrue﹤/csajsp:then﹥; ﹤csajsp:else﹥;Conditionwasfalse﹤/csajsp:else﹥; ﹤/csajsp:if﹥; 相應的標記處理程序片: →對于if標記,執行類如下: publicclassIfTagextendsTagSupport{ privatebooleancondition; privateBooleanhasCondition=flase; publicvoidsetCondition(Booleancondition){//設置判斷條件的真假;condition子標 //記調用 this.condition=condition; hasCondition=true; } publicBooleangetCondition(){//獲取判斷條件的真假then、else子標 //記調用 return(condition); } publicvoidsetHasCondition(Booleanflag){//判斷if標記后是否存在條件,由 //condition子標記調用 this.hasCondition=flag; } publicBooleangetHasCondition(){//獲取是否存在判斷條件的信息,由 //then、else標記調用 return(hasCondition); } publicintdoStartTag(){ return(EVAL_BODY_INCLUDE)//包含子標記 } }
→那么對于condition等其它子標記的處理程序,需要獲取父標記處理程序對象:
IfTagparent=(IfTag)findAncestorWithClass(this,IfTag.class)
之后就可以操作父標記處理程序的相應方法。
示例:(對于condition標記)
publicclassIfConditionTagextendsBodyTagSupport{ ifTagparent=(IfTag)findAncestorWithClass(this,IfTag.class);//獲取父標記對應的對象 If(parent==null){ ThrownewJspTagException(“conditionnotinsideit”); } return(EVAL_BODY_TAG); } publicintdoAfterBody(){ ifTagparent=(IfTag)findAncestorWithClass(this,IfTag.class); StringbodyString=getBodyContent().getString(); If(bodyString.trim().equals(“true”)){ Parent.setCondition(true)//訪問父標記處理類中的方法 }else{ parent.setCondition(false); } return(SKIP_BODY); } }
其余標記類和此相似。
關于“JSP標記是什么意思”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,使各位可以學到更多知識,如果覺得文章不錯,請把它分享出去讓更多的人看到。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。