<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    Live a simple life

    沉默(zhu_xing@live.cn)
    隨筆 - 48, 文章 - 0, 評(píng)論 - 132, 引用 - 0
    數(shù)據(jù)加載中……

    【Eclipse插件開發(fā)】基于WTP開發(fā)自定義的JSP編輯器(五) WTP Structured Model

            有關(guān)另外一個(gè)WTP重要的數(shù)據(jù)模型IStructuredDocument已經(jīng)在前面介紹過(guò)了,今天我們看一下另外一個(gè)核心的數(shù)據(jù)模型IStructuredModel。在繼續(xù)下面的內(nèi)容之前,請(qǐng)確保當(dāng)前工作區(qū)中已經(jīng)導(dǎo)入(無(wú)論是源碼方式導(dǎo)入還是二進(jìn)制方式導(dǎo)入)了如下工程:
            org.eclipse.jst.jsp.core
            org.eclipse.jst.jsp.ui
            org.eclipse.wst.css.core
            org.eclipse.wst.css.ui
            org.eclipse.wst.html.core
            org.eclipse.wst.html.ui
            org.eclipse.wst.javascript.core
            org.eclipse.wst.javascript.ui
            org.eclipse.wst.sse.core
            org.eclipse.wst.sse.ui
            org.eclipse.wst.xml.core
            org.eclipse.wst.xml.ui

            在前面介紹IStructuredDocument的時(shí)候,我們知道IStructuredDocument的具體實(shí)現(xiàn)其實(shí)就是JFace Text Framework中IDocument接口的具體實(shí)現(xiàn),其核心作用也集中在將特定文本按照特定的語(yǔ)法規(guī)則進(jìn)行區(qū)域劃分,提供相應(yīng)的位置信息,這為WTP頁(yè)面資源編輯器建立了核心數(shù)據(jù)模型。但是,單純擁有偏重于語(yǔ)法的IStrucuturedDocument是不夠的,我們同時(shí)還需要另外一套偏重于語(yǔ)義的數(shù)據(jù)模型,這就是IStructuredModel和其背后的WTP xml DOM實(shí)現(xiàn)(說(shuō)明:對(duì)于CSS模型,是完全由WTP自己實(shí)現(xiàn)的,和本系列文章關(guān)系不大,本篇中不做詳細(xì)介紹)。
            
            注意:IStructuredModel以IStrucuturedDocument為基礎(chǔ)構(gòu)建,IStructuredDocument并不知道IStructuredModel,但是IStructuredModel知道該模型對(duì)應(yīng)的IStrucuturedDocument!!! 現(xiàn)在先大致猜測(cè)一下原因,如果是直接將特定頁(yè)面資源的內(nèi)容直接轉(zhuǎn)換為IStructuredModel肯定不容易,因?yàn)槲覀冺?yè)面資源中的內(nèi)容往往不是那么規(guī)則,那轉(zhuǎn)化的過(guò)程中肯定避免不了自己去做大量的解析,導(dǎo)致構(gòu)建IStructuredModel構(gòu)建過(guò)程異常復(fù)雜;如果利用已有的IStrucuturedDocument構(gòu)建機(jī)制,先將特定的內(nèi)容解析為IStrucuturedDocument完成語(yǔ)法劃分,再基于高度結(jié)構(gòu)化的IStrucuturedDocument去構(gòu)建IStrucuturedModel,那肯定會(huì)大大簡(jiǎn)化構(gòu)建過(guò)程,某種程度上就可以將構(gòu)建過(guò)程理解為把IStrucuturedDocument中節(jié)點(diǎn)列表轉(zhuǎn)換為IStrucuturedModel持有的Document對(duì)應(yīng)的節(jié)點(diǎn)列表了。IStructuredModel構(gòu)建過(guò)程大致示意如下:
            
            【IStructuredModel:句柄】
            
            為什么說(shuō)IStucturedModel是句柄呢,其實(shí)模型本身的信息并不是IStucturedModel角色在承擔(dān),而是每個(gè)IStructuredModel都持有對(duì)應(yīng)的一個(gè)document。上圖顯示了IStrucuturedModel有兩種實(shí)現(xiàn):IDOMModel和ICSSModel,IDOMModel持有的是一個(gè)IDOMDocument,而ICSSModel持有的是一個(gè)ICSSDocument。真正持有模型節(jié)點(diǎn)信息的是IDOMDocument或者ICSSDocument,所以很大程度上我們可以將IStucturedModel理解為句柄(也不完全是這樣,大致這么理解是為了更好的搞清楚這幾者之間的關(guān)系^_^)。
                
                【IStructuredModel構(gòu)建過(guò)程進(jìn)一步分析】
                有了上面的解釋我們應(yīng)該清楚了,我們是基于IStructuredDocument語(yǔ)法劃分的基礎(chǔ)上建立起了對(duì)應(yīng)的IDOMDocument或者ICSSDoucment,IStructuredModel持有對(duì)應(yīng)的IDOMDocument或者ICSSDocument(當(dāng)然,同時(shí)也會(huì)持有對(duì)應(yīng)的IStructuredDocument)。所以到這里,我們可以稍微修正一下上面IStructuredModel構(gòu)造流程圖:
                
      
                
                通過(guò)上面兩幅圖,語(yǔ)法Document(IStructuredDocument)、語(yǔ)義Document(IDOMDocument或者ICSSDocument)、WTP模型(IStructuredModel)三者的關(guān)系應(yīng)該更加清楚了吧^_^,后門我會(huì)再抽一節(jié)來(lái)總結(jié)和分析一下之間的關(guān)系。在我們的真是應(yīng)用中,語(yǔ)義Document(IDOMDocument或者ICSSDocument)一般在分析模型信息的時(shí)候才會(huì)用到,平時(shí)不會(huì)直接接觸到,所以我前面將IStructuredDocument稱之為WTP Document,將IStructuredModel稱之為WTP Model,壓根就沒提IDOMDocument或者ICSSDocument。
                
                【IStructuredModel提供的核心操作】
                1、模型管理相關(guān)的操作(十分重要):
                       getModelManager:獲取模型管理器(關(guān)于這個(gè)概念的信息闡述,到會(huì)放到后門的章節(jié)中)
                       getReferenceCount:獲取被模型的引用計(jì)數(shù)(和IModelManager的引用計(jì)數(shù)管理相關(guān))
                       getReferenceCountForEdit:獲取可寫方式的引用計(jì)數(shù)
                       getReferenceCountForRead:獲取只讀方式的引用計(jì)數(shù)
                       isShared:判斷該模型是否被IModelManager托管了,就是是否共享了
                       isSharedForEdit:本質(zhì)上是判斷該模型的只讀引用計(jì)數(shù)是否為零,是否被以只讀方式引用了
                       isSharedForRead:本質(zhì)上是判斷該模型的可寫引用計(jì)數(shù)是否為零,是否被以可寫方式引用了
                       releaseFromRead:減少只讀方式的引用計(jì)數(shù)
                       releaseFromEdit:減少可寫方式的引用計(jì)數(shù)
                       以上這些操作都是和一個(gè)重要的角色I(xiàn)ModelManger相關(guān),后門的章節(jié)中會(huì)詳細(xì)闡述!!!
                        
                2、相關(guān)監(jiān)聽器操作(IModelStateListener非常常用):
                      addModelLifecycleListener:我們使用較少,處理模型生命周期事件,詳細(xì)信息參見org.eclipse.wst.sse.core.internal.model.ModelLifecycleEvent和org.eclipse.wst.sse.core.internal.provisional.IModelLifecycleListener
                      addModelStateListener:我們使用較多,用于模型狀態(tài)變化監(jiān)聽,我們下一節(jié)在開發(fā)Structured Model分析視圖時(shí)候就會(huì)用到。詳細(xì)信息參加org.eclipse.wst.sse.core.internal.provisional.IModelStateListener

                3、訪問語(yǔ)法Document和語(yǔ)義Document(很常用!!!):
                       IStructuredDocument getStructuredDocument:獲取語(yǔ)法Document
                       IDOMDocument getDocument:定義在IStructuredModel的子類型IDOMModel中
                       ICSSDocument getDocument:定義在IStructuredModel的子類型ICSSModel中
                        
                       IndexedRegion getIndexedRegion(int offset):根據(jù)位置定位對(duì)應(yīng)語(yǔ)義Document(IDOMDocument或者ICSSDocument)中對(duì)應(yīng)的節(jié)點(diǎn),返回結(jié)果是一個(gè)IDOMNode或者ICSSNode
                       
                4、自身狀態(tài)相關(guān)操作(也較為常用):
                    isDirty()
                    isSaveNeeded()
                    save()
                    save(EncodingRule encodingRule)
                    save(IFile iFile)
                    save(IFile iFile, EncodingRule encodingRule)
                    save(OutputStream outputStream)

                    IStructuredModel reinit()
                    IStructuredModel reload(InputStream inputStream) 

                5、其他幾個(gè)重要操作
                    String getBaseLocation():獲取本模型對(duì)應(yīng)資源的位置信息。注意:某種程度上,IStructuredModel是面向資源文件的,而語(yǔ)法Doucment或者語(yǔ)義Document則不是,要注意其中的區(qū)別!!!
                    ...其他的幾個(gè)以后用到的時(shí)候再說(shuō)!!!

                6、recording相關(guān)操作,我們后面不會(huì)直接用到此特性,不做闡述
                
                【IDOMModel核心操作】
                IDOMDocument getDocument就是它的核心操作,上面已經(jīng)說(shuō)過(guò)。

            【IndexedRegion:WTP語(yǔ)義Document的Node】
               如果將IStructuredDocument視為WTP的語(yǔ)法Document,則可以將IStructuredModel視為WTP模型,IDOMDocument或ICSSDocument視為WTP語(yǔ)義Document。而這個(gè)語(yǔ)義Document的中節(jié)點(diǎn)的超類型則就是IndexedRegion(org.eclipse.wst.sse.core.internal.provisional.IndexedRegion),IDOMDocument或ICSSDocument不過(guò)是其中兩種節(jié)點(diǎn)類型(這個(gè)熟悉xml的朋友肯定知道了,xml Document本身就是一個(gè)xml Node)。首先來(lái)看一下IndexedRegion的類型體系圖:
                
                
                說(shuō)明:IDOMNode繼承自IndexedRegion接口,而ICSSNode并不是,看起來(lái)有點(diǎn)不自然^_^。那我們就把他們合并起來(lái)吧,來(lái)個(gè)全家福:
                
                從上面的類型體系我們可以看的出來(lái),IndexedRegion主要分為兩類:一類是dom node(org.eclipse.wst.xml.core.internal.provisional.document.IDOMNode),另一類是css node(org.eclipse.wst.css.core.internal.provisional.document.ICSSNode,這邊用接口更舒服點(diǎn)^_^)。WTP在實(shí)現(xiàn)dom node系列時(shí),借助于org.w3c.dom節(jié)點(diǎn)體系,這也是我們后面接觸最多的;WTP在實(shí)現(xiàn)css node的時(shí)候,則和org.w3c.dom沒有任何關(guān)系,完全是自己構(gòu)建節(jié)點(diǎn)體系
                            
                【IndexedRegion接口主要操作】
              上面看了IndexedRegion主要分為兩類,那么我們?cè)倩剡^(guò)頭看一下IndexedRegion提供的核心操作:
               
               我們看到IndexedRegion提供的核心操作都是關(guān)于位置信息的。這可能會(huì)產(chǎn)生一些疑問,例如位置信息的計(jì)算是不是挺繁瑣的呢?怎么實(shí)現(xiàn)的呢?  我們回顧一下前面在分析IStructuredDocument的時(shí)候,我們ITextRegion接口(IStructuredDocument中節(jié)點(diǎn)的超類型)提供的核心操作之一就是提供位置信息。如果我們的每個(gè)IndexRegion節(jié)點(diǎn)都持有相關(guān)的ITextRegion節(jié)點(diǎn)不就可以了???確實(shí)是這么做的。這和我們這篇文章開頭說(shuō)的是一直的,基于語(yǔ)義的IStructuredModel(實(shí)際上是構(gòu)造背后的IDOMDocument和ICSSDocument)構(gòu)建的基礎(chǔ)是基于語(yǔ)法的IStructuredDocument

                那么現(xiàn)在如果我們有了位置信息(例如編輯器中的光標(biāo)的offset),我們就可以把WTP Doucment中的ITextRegion和WTP Model中的IndexedRegion(IDOMNode、ICSSNode)聯(lián)系起來(lái)了。

            【IDOMNode:IndexRegion的XML DOM實(shí)現(xiàn)】
                絕大部分頁(yè)面資源的語(yǔ)義Document都是基于IDOMNode的,我們就介紹它^_^。首先來(lái)看一副圖片,可以和前面第三節(jié)介紹IStructuredDocument時(shí)用的圖片做一個(gè)比較:
                
                可以看到,IStructuredDocument的text region的劃分是基于語(yǔ)法的,只要是一個(gè)閉合區(qū)域就是一個(gè)IStructuredDocumentRegion;IDOMDocument中的indexed region是基于語(yǔ)義劃分的,看上圖就可以看的出來(lái),element之間都是有父子掛系的,再看一下一個(gè)dom attr區(qū)域是由三個(gè)text region組成的。 具體差異,后門的章節(jié)中會(huì)分析。           


                前面說(shuō)過(guò)了,WTP model中的節(jié)點(diǎn)IndexedRegion有兩種實(shí)現(xiàn):一種是基于xml dom的IDOMNode,另外一種是WTP完全自己實(shí)現(xiàn)的ICSSNode,這里重點(diǎn)介紹IDOMNode(org.eclipse.wst.xml.core.internal.provisional.document.IDOMNode)。有一點(diǎn)一定要記住:IDOMNode同時(shí)是一個(gè)w3c xml Node

                說(shuō)明:既然遵守了w3c xml dom協(xié)議,那么我們的一個(gè)IDOMDocument本質(zhì)上就是一個(gè)dom document,那這個(gè)dom對(duì)象肯定非常耗內(nèi)存了。是的,IDOMDocument絕對(duì)是個(gè)重量級(jí)對(duì)象,但是選擇dom還是有原因的:一可以提供較為豐富的語(yǔ)義;再者,一個(gè)頁(yè)面資源的大小通常不會(huì)太大,也就是說(shuō)一般不會(huì)產(chǎn)生非常巨大的DOM對(duì)象(例如大于10M)。 這其實(shí)和我們?cè)谌粘?yīng)用中選擇基于DOM的還是基于流的XML解析技術(shù)一樣,要求語(yǔ)義是否豐富、對(duì)應(yīng)的xml對(duì)象內(nèi)存占用是兩個(gè)重要的考慮。 為了dom對(duì)象耗內(nèi)存的缺點(diǎn)降低到最低,和通常的解決辦法一樣,WTP也提供了模型緩存管理功能,也就是后面我們要說(shuō)的IModelManager,對(duì)IStructuredModel進(jìn)行引用計(jì)數(shù)管理(我們的IDOMDocument這個(gè)大dom對(duì)象會(huì)被IStructuredModel持有)。

                【IDOMNode核心操作】
                
                圖中可以看的出來(lái),我們的IDOMNode有兩個(gè)超類型:IndexedRegion和org.w3c.dom.Node,我們的IDOMNode就提供了三類主要的操作:
                1、IndexedRegion相關(guān)操作:提供位置相關(guān)信息的操作

                2、org.w3c.dom.Node相關(guān)的操作:dom node相關(guān)操作(注意:有些dom node中規(guī)定的部分操作,WTP并沒有實(shí)現(xiàn),這些操作對(duì)WTP來(lái)說(shuō)意義不大,畢竟一個(gè)頁(yè)面資源并不完全是一個(gè)xml文件哈^_^)

                3、IDOMNode接口自身定義的操作。這又可以大致分為三類:
                      A、語(yǔ)法Document(IStructuredDocument)相關(guān)操作
                            IStructuredDocument getStructuredDocument
                            IStructuredDocumentRegion getStartStructuredDocumentRegion 
                            IStructuredDocumentRegion getEndStructuredDocumentRegion
                            IStructuredDocumentRegion getFirstStructuredDocumentRegion
                            IStructuredDocumentRegion getLastStructuredDocumentRegion
                            有了以上操作,我們就可以從語(yǔ)法和語(yǔ)義兩個(gè)層面來(lái)綜合分析一個(gè)節(jié)點(diǎn)了

                     B、獲取WTP 模型(IDOMModel)
                            IDOMModel getModel()

                    C、內(nèi)容設(shè)置相關(guān)操作
                           getSource:獲取節(jié)點(diǎn)內(nèi)容
                           setSource:設(shè)置節(jié)點(diǎn)內(nèi)容
                           getValueSource:獲取value內(nèi)容
                           setValueSource:設(shè)置value內(nèi)容
                           setEditable
                           setDataEditable
                           setChildEditable
                           isDataEditable
                           isChildEditable

                   D、其他操作,不常用,就不列舉了


                【···說(shuō)明···】
                  IDOMNode相關(guān)的子接口類型也是常用的,里面都有對(duì)應(yīng)的操作,可以幫助我們更好地操作語(yǔ)義Document,進(jìn)行語(yǔ)義層面的分析。相關(guān)要熟練了解使用的接口為:
                  org.eclipse.wst.xml.core.internal.provisional.document.IDOMAttr
                  org.eclipse.wst.xml.core.internal.provisional.document.IDOMDocument
                  org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement
                  org.eclipse.wst.xml.core.internal.provisional.document.IDOMText
                   
                 如果不了解XML DOM的,最好也稍微了解一下,對(duì)操作語(yǔ)義Document有很大幫助。
                  

            【ICSSNode:IndexRegion的CSS實(shí)現(xiàn)】
             
                我們后面基本用不到,因?yàn)槲覀兓旧喜蝗为?dú)分析css資源,就不在本系列文章中去講了。如果要分析ICSSNode,則可以參照分析IDOMNode的實(shí)現(xiàn),祝好運(yùn)^_^ 

                【后記】
                   我們這一節(jié)分析了WTP語(yǔ)義Document(IDOMDocument)和WTP模型(IStructuredModel),下一節(jié)會(huì)首先來(lái)開發(fā)一個(gè)類似于上一節(jié)中的分析視圖:DOM Document分析視圖。然后會(huì)單獨(dú)拿出一節(jié)來(lái)分析這些重要概念之間的關(guān)系,同時(shí)會(huì)突出強(qiáng)調(diào)org.eclipse.wst.sse.core.internal.provisional.IModelManager.

                    到這里,WTP最重要的數(shù)據(jù)模型已經(jīng)介紹完畢了,如下:
                    語(yǔ)法Document:IStructuredDocument
                    語(yǔ)義Document:重點(diǎn)介紹了IDOMDocument
                    WTP模型:IStructuredModel(重點(diǎn)介紹了IDOMModel)
                   

                  【模塊關(guān)系】
                  借住于上面的分析過(guò)程,到現(xiàn)在我們對(duì)開頭提到的幾個(gè)插件的體系結(jié)構(gòu)應(yīng)該有了一定的認(rèn)識(shí)了:
                
                    
                    WTP我們常接觸的是WST、JST、RDB三個(gè)組成部分,RDB是專門來(lái)處理數(shù)據(jù)庫(kù)相關(guān)的,本系列文章中不做討論。JST的基礎(chǔ)是WST,看上圖中就可以發(fā)現(xiàn),JSP類型的模型都需要基于WST中各種類型的模型,能不是基礎(chǔ)嗎。從語(yǔ)義上也講的通哈,沒有css、html、javascript、xml這些東東,怎么能建立起jsp呢???
                   再回顧文章開頭我們列舉的12個(gè)插件工程,結(jié)合Eclipse的“分層法則”,12個(gè)插件工程之間的關(guān)系應(yīng)該很清楚了吧...



    本博客中的所有文章、隨筆除了標(biāo)題中含有引用或者轉(zhuǎn)載字樣的,其他均為原創(chuàng)。轉(zhuǎn)載請(qǐng)注明出處,謝謝!

    posted on 2008-09-09 18:03 zhuxing 閱讀(2939) 評(píng)論(3)  編輯  收藏 所屬分類: Eclipse Plug-in & OSGIWTP(Web Tools Platform)

    評(píng)論

    # re: 【Eclipse插件開發(fā)】基于WTP開發(fā)自定義的JSP編輯器(五) WTP Structured Model  回復(fù)  更多評(píng)論   

    學(xué)習(xí),學(xué)習(xí)
    2008-09-10 22:41 | srdrm

    # re: 【Eclipse插件開發(fā)】基于WTP開發(fā)自定義的JSP編輯器(五) WTP Structured Model  回復(fù)  更多評(píng)論   

    補(bǔ)充一副圖片
    2008-09-16 18:22 | zhuxing

    # re: 【Eclipse插件開發(fā)】基于WTP開發(fā)自定義的JSP編輯器(五) WTP Structured Model  回復(fù)  更多評(píng)論   

    好文~看官都容易糊涂,LZ既然還能講這么清楚,V5啊~
    2012-09-19 15:12 | imu2008
    主站蜘蛛池模板: 免费欧洲毛片A级视频无风险| 亚洲伊人久久大香线焦| 18禁成年无码免费网站无遮挡| 中文字幕无线码免费人妻| 337P日本欧洲亚洲大胆艺术图| 91嫩草亚洲精品| 久热综合在线亚洲精品| 亚洲国产精品一区二区九九| 久久久久国色AV免费观看性色 | 91制片厂制作传媒免费版樱花| 青青草国产免费国产是公开| 亚洲老熟女五十路老熟女bbw| 亚洲无限乱码一二三四区| 亚洲AV午夜成人片| 国产亚洲精品自在线观看| 深夜国产福利99亚洲视频| 日韩电影免费在线观看视频 | 亚洲一区二区三区精品视频| 亚洲av午夜福利精品一区人妖| 亚洲午夜无码片在线观看影院猛| 日本免费一区二区三区最新| 国产日本一线在线观看免费| 最近中文字幕完整免费视频ww | 国产V亚洲V天堂无码| 国产成人毛片亚洲精品| 午夜国产大片免费观看| 国产一区在线观看免费| 日本黄页网站免费| 午夜影视在线免费观看| 天天摸天天碰成人免费视频| 国产福利在线免费| 毛片免费观看的视频| 成人午夜大片免费7777| 在线免费观看一级片| 日韩免费一级毛片| 又色又污又黄无遮挡的免费视| 免费a级毛片永久免费| 亚洲欧洲精品成人久久曰影片 | 日韩成人精品日本亚洲| 羞羞漫画页面免费入口欢迎你| 男人和女人高潮免费网站|