溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶(hù)服務(wù)條款》

JSP標(biāo)記是什么意思

發(fā)布時(shí)間:2021-11-22 13:54:02 來(lái)源:億速云 閱讀:239 作者:小新 欄目:編程語(yǔ)言

這篇文章將為大家詳細(xì)講解有關(guān)JSP標(biāo)記是什么意思,小編覺(jué)得挺實(shí)用的,因此分享給大家做個(gè)參考,希望大家閱讀完這篇文章后可以有所收獲。

1.概述

1)什么是JSP標(biāo)記

顧名思義,JSP標(biāo)記就是在JSP文件中使用的標(biāo)記。它類(lèi)似于html語(yǔ)法中的標(biāo)記,像head、table。通過(guò)在JSP文件中引用它(就像使用html標(biāo)記那樣),可以更方便的實(shí)現(xiàn)對(duì)Java代碼模塊的重用。

2)為什么要使用JSP標(biāo)記技術(shù)(與javabean相比)

好處

JSP標(biāo)記可以處理JSP正文的內(nèi)容,比如改變文本顯示樣式;而javabean不可以。

JSP標(biāo)記接口簡(jiǎn)單,易于使用,也易于開(kāi)發(fā)和維護(hù)。

壞處

JSP標(biāo)記在進(jìn)行設(shè)置時(shí)要比javabean復(fù)雜很多,體現(xiàn)在JSP標(biāo)記庫(kù)描述文件(*.tld)的配置上。

JSP標(biāo)記實(shí)現(xiàn)的功能遠(yuǎn)不如javabean強(qiáng)大。

當(dāng)前只要JSP1.1支持JSP標(biāo)記,而JSP1.0和1.1都支持對(duì)Bean的使用。

2.JSP標(biāo)記的開(kāi)發(fā)簡(jiǎn)介。

JSP標(biāo)記的開(kāi)發(fā)需要編寫(xiě)2種獨(dú)立的文件。一種是定義標(biāo)記功能的java類(lèi)文件,一種是將xml元素名稱(chēng)(標(biāo)記)映射到標(biāo)記實(shí)現(xiàn)的標(biāo)記庫(kù)描述符文件。

⑴編寫(xiě)JSP標(biāo)記處理程序類(lèi)文件

需要繼承javax.servlet.jsp.tagext.TagSupport類(lèi);

簡(jiǎn)單示例:

//文件名ExampleTag.java   importjavax.servlet.jsp.*&#59;   importjavax.servlet.jsp.tagext.*&#59;   importjava.io.*&#59;     publicclassExampleTagextendsTagSupport{   //程序的執(zhí)行起始點(diǎn)   publicintdoStartTag(){   try{   JspWriterout=pageContext.getOut()&#59;   out.print(“Customtagexample”)&#59;   }catch(IOExceptionioe){   System.out.println(“ErrorinExampleTag:“+ioe)&#59;   }   return(SKIP_BODY)&#59;//當(dāng)標(biāo)記包括的內(nèi)容為空時(shí)返回SKIP_BODY,表示標(biāo)記功能   //已執(zhí)行完成   }   }

編譯好的class文件將位于服務(wù)器的的特定位置。

⑵編寫(xiě)JSP標(biāo)記庫(kù)描述符文件

將標(biāo)記名和其代表的功能實(shí)現(xiàn)聯(lián)系在一起。

簡(jiǎn)單示例:

﹤!--文件名: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﹥;   //以上是標(biāo)準(zhǔn)的文件頭   //以下是標(biāo)簽庫(kù)描述   ﹤tlibversion﹥;1.0﹤/tlibversion﹥;//Tag庫(kù)的版本   ﹤jspversion﹥;1.1﹤/jspversion﹥;//JSP庫(kù)的版本   ﹤shortname﹥;csajsp﹤/shortname﹥;//自定義標(biāo)記前綴名   ﹤uri﹥;﹤/uri﹥;//標(biāo)記描述符文件的uri,可以是空   ﹤info﹥;Mycustomtag!﹤/info﹥;//標(biāo)記庫(kù)的描述信息   //以下定義新標(biāo)記   ﹤tag﹥;   ﹤name﹥;example﹤/name﹥;//自定義的標(biāo)記名   ﹤tagclass﹥;tags.ExampleTag﹤/tagclass﹥;//定位標(biāo)簽處理類(lèi)文件   ﹤info﹥;Simplestexample﹤/info﹥;//描述信息   ﹤bodycontent﹥;EMPTY﹤/bodycontent﹥;//不處理JSP文件正文內(nèi)容   ﹤/tag﹥;   ﹤/taglib﹥;

此文件將配置在服務(wù)器的特定位置

⑶使用以上自定義的JSP標(biāo)記

﹤!--文件名:simpleExample.jsp--﹥;   ﹤!DOCTYPEHTMLPUBLIC“-//W3C//DTDHTML4.0Transitional//EN”﹥;   ﹤HTML﹥;   ﹤HEAD﹥;   ﹤%@tagliburi=“csajsp-taglib.tld”prefix=“csajsp”%﹥;//進(jìn)行標(biāo)記使用聲明   ﹤TITLE﹥;﹤csajsp:example/﹥;﹤TITLE﹥;   ﹤LINKREL=STYLESHEETHREF=”JSP-styles.css”   TYPE=”text/css”﹥;   ﹤HEAD﹥;   ﹤BODY﹥;   ﹤H1﹥;﹤csajsp:example/﹥;﹤H1﹥;/使用標(biāo)記   ﹤csajsp:example/﹥;   ﹤/BODY﹥;   ﹤/HTML﹥;

這樣最終在在瀏覽器上輸出為

Customtagexample

3.深入的JSP標(biāo)記開(kāi)發(fā)

⑴添加標(biāo)記屬性

在標(biāo)記處理類(lèi)中可以通過(guò)函數(shù)setAttribute(Stringvalue)為JSP標(biāo)記分配屬性,這樣標(biāo)記處理程序根據(jù)獲取的屬性值來(lái)實(shí)現(xiàn)相關(guān)功能。

比如:

privateStringmessage=“DefaultMessage”&#59;   publicvoidsetMessage(Stringmessage){   this.message=message&#59;   }

注意:屬性名message是小寫(xiě)的,設(shè)置函數(shù)中的Message是大寫(xiě)的。

◆與之相關(guān)的在tld文件中需要在tag元素中添加如下元素

﹤tag﹥;   …   ﹤attribute﹥;   ﹤name﹥;message﹤/name﹥;//屬性名   ﹤required﹥;false﹤/requied﹥;//屬性值是否必須提供。False表示不必,存在缺省值。   ﹤rtexprvalue﹥;true﹤/rtexprvalue﹥;//ture表示屬性值可以使用JSP表達(dá)式,false表示禁   //止使用   ﹤/attribute﹥;   …   ﹤/tag﹥;

◆對(duì)應(yīng)JSP文件中引用為:﹤prefix:namemessage=“Hello!”/﹥;

⑵使用標(biāo)記正文

即是在標(biāo)記中使用一些包含JSP腳本元素、文本等的內(nèi)容,這些內(nèi)容由JSP引擎處理。

形式如下:

﹤prefix:tagname﹥;body(正文內(nèi)容)﹤prefix:tagname﹥;

在處理JSP標(biāo)記的正文前,將會(huì)調(diào)用處理程序的doStartTag()方法,此時(shí)要在此方法中返回EVAL_BODY_INCLUDE以表明包含有標(biāo)記正文;處理完后,將會(huì)調(diào)用doEndTag()方法,此后要讓jsp引擎繼續(xù)處理后面的頁(yè)面,得返回EVAL_PAGE,否則返回SKIP_PAGE。

◆對(duì)應(yīng)在tld文件中需要在tag元素中添加如下元素

﹤tag﹥;   …   ﹤bodycontent﹥;JSP﹤/bodycontent﹥;//表明包含正文   …   ﹤/tag﹥;

另外:可以設(shè)置一些條件來(lái)判斷是否包含正文的,如下:

publicintdoStartTag(){   ServletRequestrequest=pageContext.getRequest()&#59;   StringdebugFlag=request.getParameter(“debug”)&#59;   If((debugFlag!=null)&&(!debugFlag.equalsIgnoreCase(“false”))){   Return(EVAL_BODY_INCLUDE)&#59;   }   else{   return(SKIP_BODY)&#59;   }   }

這樣只有在url尾部給出請(qǐng)求參數(shù)值debug=true,才會(huì)顯示標(biāo)記正文的內(nèi)容。這樣可以隱藏一些調(diào)試信息。

⑶對(duì)標(biāo)記正文進(jìn)行處理

JSP的標(biāo)記可以對(duì)包含的正文進(jìn)行處理(修改),然后再輸出。這需要標(biāo)記處理類(lèi)繼承BodyTagSupport類(lèi)(TagSupport類(lèi)的繼承)。這個(gè)類(lèi)提供了2個(gè)重要的方法用于正文處理。

→doAfterBody:默認(rèn)執(zhí)行的方法,在此方法中包含正文的處理過(guò)程。

→getBodyContent:返回BodyContent類(lèi)型的的對(duì)象,此對(duì)象包含了有關(guān)標(biāo)記正文的信息。

BodyContent類(lèi)型包含的重要方法:

→getEnclosingWriter:返回JspWriter方法,輸出內(nèi)容。

→getString:返回包含全部JSP標(biāo)記正文的字符串。

注意:這里和⑵中介紹的輸出JSP標(biāo)記正文的方式不一樣。前者的輸出是先由JSP引擎解釋?zhuān)@里是在JSP標(biāo)記處理程序中直接輸出到給瀏覽器。

另外,在doAferBody中返回SKIP_BODY,表示終止標(biāo)記正文處理;若返回的是EVAL_BODY_TAG,將會(huì)再一次調(diào)用doAferBody方法,重新處理標(biāo)記正文,直到返回SKIP_BODY為止。

示例:

→標(biāo)記處理程序片:

下面的程序片將調(diào)用一個(gè)filter方法,此方法用于把JSP正文中的字符﹤﹥;“&分別用&it&#59;&gt&#59;&guot&#59;&amp&#59;來(lái)代替。以使瀏覽器按字符原樣輸出,不進(jìn)行解釋。

publicclassFillterTagextendsBodyTagSupport{   publicintdoAfterBody(){   BodyContentbody=getBodyContent()&#59;   StringfilteredBody=ServletUtilities.filter(body.getString())&#59;//將正文得到的字符串過(guò)濾   Try{   JspWriterout=body.getEnclosingWriter()&#59;   out.print(filteredBody)&#59;//輸出過(guò)濾后的文本   }catch(IOExceptionioe){   System.out.println(“ErrorinFilterTag:“+ioe)&#59;   }   return(SKIP_BODY)&#59;//終止JSP正文處理   }

→標(biāo)記符描述文件片

…   ﹤tag﹥;   ﹤name﹥;filter﹤/name﹥;   ﹤tagclass﹥;tags.FilterTag﹤/tagclass﹥;   ﹤bodycontent﹥;JSP﹤/bodycontent﹥;   ﹤/tag﹥;   …

→JSP文件片

﹤csajsp:filter﹥;   ﹤STRONG﹥;Iloveyou!﹤/STRONG﹥;  ;   ﹤EM﹥;Iloveyou!﹤EM﹥;   ﹤/csajsp:filter﹥;

這樣,在瀏覽器中輸出的標(biāo)記正文應(yīng)當(dāng)是

﹤STRONG﹥;Iloveyou!﹤/STRONG﹥;  ;   ﹤EM﹥;Iloveyou!﹤EM﹥;

而不是

Iloveyou!

Iloveyou!

⑶使用JSP嵌套標(biāo)記。

可以對(duì)多個(gè)JSP標(biāo)記進(jìn)行嵌套引用,這樣子標(biāo)記就可以訪問(wèn)和存儲(chǔ)父標(biāo)記的數(shù)據(jù)和方法。

子標(biāo)記訪問(wèn)父標(biāo)記需要使用BodyTagSupport類(lèi)中的findAccetorWithClass方法。注意它只能查找臨近的父標(biāo)記。

假如在JSP文件中如下的嵌套引用:

﹤!--此嵌套標(biāo)記模擬條件判斷--﹥;   ﹤csajsp:if﹥;   ﹤csajsp:condition﹥;true﹤/csajsp:condition﹥;   ﹤csajsp:then﹥;Conditionwastrue﹤/csajsp:then﹥;   ﹤csajsp:else﹥;Conditionwasfalse﹤/csajsp:else﹥;   ﹤/csajsp:if﹥;   相應(yīng)的標(biāo)記處理程序片:   →對(duì)于if標(biāo)記,執(zhí)行類(lèi)如下:   publicclassIfTagextendsTagSupport{   privatebooleancondition&#59;   privateBooleanhasCondition=flase&#59;   publicvoidsetCondition(Booleancondition){//設(shè)置判斷條件的真假;condition子標(biāo)   //記調(diào)用   this.condition=condition&#59;   hasCondition=true&#59;   }   publicBooleangetCondition(){//獲取判斷條件的真假then、else子標(biāo)   //記調(diào)用   return(condition)&#59;   }   publicvoidsetHasCondition(Booleanflag){//判斷if標(biāo)記后是否存在條件,由   //condition子標(biāo)記調(diào)用   this.hasCondition=flag&#59;   }   publicBooleangetHasCondition(){//獲取是否存在判斷條件的信息,由   //then、else標(biāo)記調(diào)用   return(hasCondition)&#59;   }   publicintdoStartTag(){   return(EVAL_BODY_INCLUDE)//包含子標(biāo)記   }   }

→那么對(duì)于condition等其它子標(biāo)記的處理程序,需要獲取父標(biāo)記處理程序?qū)ο螅?/p>

IfTagparent=(IfTag)findAncestorWithClass(this,IfTag.class)

之后就可以操作父標(biāo)記處理程序的相應(yīng)方法。

示例:(對(duì)于condition標(biāo)記)

publicclassIfConditionTagextendsBodyTagSupport{   ifTagparent=(IfTag)findAncestorWithClass(this,IfTag.class)&#59;//獲取父標(biāo)記對(duì)應(yīng)的對(duì)象   If(parent==null){   ThrownewJspTagException(“conditionnotinsideit”)&#59;   }   return(EVAL_BODY_TAG)&#59;   }     publicintdoAfterBody(){   ifTagparent=(IfTag)findAncestorWithClass(this,IfTag.class)&#59;   StringbodyString=getBodyContent().getString()&#59;   If(bodyString.trim().equals(“true”)){   Parent.setCondition(true)//訪問(wèn)父標(biāo)記處理類(lèi)中的方法   }else{   parent.setCondition(false)&#59;   }   return(SKIP_BODY)&#59;   }   }

其余標(biāo)記類(lèi)和此相似。

關(guān)于“JSP標(biāo)記是什么意思”這篇文章就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,使各位可以學(xué)到更多知識(shí),如果覺(jué)得文章不錯(cuò),請(qǐng)把它分享出去讓更多的人看到。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

jsp
AI