程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 網頁編程 >> JSP編程 >> 關於JSP >> 自定義JSP標簽(tag)淺議

自定義JSP標簽(tag)淺議

編輯:關於JSP

因為版本變化的關系,這篇文章未必有普適性

 (標准化越來越近了):namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

看這篇文章之前應該先看Sun的文章並最好動手實踐之

http://java.sun.com/developer/technicalArticles/xml(標准化越來越近了)/WebAppDev3/

並且知道J2EE API文檔的位置在

http://java.sun.com/j2ee/sdk_1.3/techdocs/api/index.html

 

自定義Tag其實並不是一件很困難的事情,就是猛一接觸,不知道該從何下手。推薦先看看Sun公司的一篇文章,看完了,大致就有了一個印象。在這裡無意去翻譯這篇簡單的文章,而是從這篇文章展開去說說。要說明的一點就是sun的文檔中代碼都是完全可用的,但是因為排版問題,代碼的分行有些地方不正確,直接copy的時候要仔細整理一下代碼,否則有可能會通不過編譯,部署的時候會給你一大堆異常。

 

自定義Tag使用的包是javax.servlet.jsp(SUN企業級應用的首選).tagext,如果編譯有問題,可以去tomcat(一個很好用的JSP運行平台)的commonlib文件夾下面找jsp(SUN企業級應用的首選)-api.jar引用上就可以了。

 

這個包裡面的類和接口,基本上我們主要關心的就是以“Tag”結尾的那幾個,接口Tag和BodyTag,類TagSupport和BodyTagSupport,還有一個接口IterationTag,不過一般不會用到。其他的我們都可以看作是輔助類,幫助獲取信息什麼的。我們可以仔細看看J2EE的API文檔裡面關於這個包的類說明。

 

上面類名裡面的Body的意思可能一下子比較難理解。tag指的就是像<tagname></tagname>這樣的東西,Body就是夾在tag中間的東西,比如<tagname>I am Body</tagname>。這麼一來,這個tag也就成了BodyTag,因為它可以帶Body。所以設計tag也要事先考慮好帶不帶Body,不過現實考慮,好像沒有Body的tag應該也比較少吧。

 

Tag接口是這些類裡面的根,所以先看看裡面有什麼。API文檔裡面那個Lifecycle圖畫的很粗糙,不過也能大致看清楚。我們也不過分糾纏細節,大致關心的就是doStartTag() 和doEndTag() 這一段。每當你寫的tag在jsp(SUN企業級應用的首選)頁面裡面要被解釋的時候,服務器就自動調用你的類裡面的doStartTag()函數來完成你定義的邏輯,當解析完標簽後調用doEndTag()。實現Tag接口來定制自己的tag無疑是最靈活的。但是,難度也比較大,我們定義自己的tag的時候完全不必要搞得這麼有內涵。

BodyTag跟Tag類也差別不大,BodyTag繼承自Tag和IterationTag,因為涉及了Body的原因,邏輯要復雜一些。API文檔裡面的Lifecycle圖也比較清晰。有必要好好看看。裡面主要說明的就是函數調用的順序。但是在具體應用中,不一定都要按部就班的走完這整個Lifecycle,如果要想控制這些調用的路線。就要借用函數的返回值了,在上一個函數返回特定的值(都是已經定義好的常數)就可以改變服務器調用下一個函數的行為來完成你自己的邏輯。看到這裡我也不禁佩服這些寫類庫的人,能想出這麼個辦法來解決問題。

 

為了方便我們開發,又提供了兩個帶“Support”的類來“支持”我們,方便我們開發。一般情況下我們只要繼承這兩個類中的一個,而且我覺得BodyTagSupport也更常用一些好像。要說明的一點就是兩個Support類中TagSupport是BodyTagSupport的父類。類中的getId()和setId()這兩個函數名並不是死的,這兩個“Id”應該在你的程序中替換成你的標簽名,比如你的tag名字是tagname,就是<tagname>,那麼函數名就變成了getTagname ()和getTagname ()。這樣的搞法原來在其他地方也有領教。(注意tagname第一個字母在函數名中大寫)變化的名字有服務器自己去處理,無需編程者自己操心。原來函數名都是可以變化的,一定要注意。

 

說到這裡可以結合Sun的文檔的代碼看看,就明白了。

 

至於部署和.tlb文件的格式,Sun文檔上也都有。不再贅述。最後附上整理的返回值列表,這個我認為比較重要。

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved