這兩天我一直在想,怎樣定義框架結構的描述文件。我從以下幾個方面考慮:
現在我需要這樣的一個描述文件:描述框架網頁,也就是frame的網頁。 先前我分析了eclipse的插件描述文件。它是這樣定義的:
plugin.xml中一共有四個主要的標簽:plugin,requires,runtime,extension。其中plugin標簽的屬性提供的是我們要開發的Welcome插件的基本信息,除了name,version,provider-name等,最重要的是id,我們通過它可以索引到此元素。requires標簽中所列出的是需要的插件,這裡我們要用到Eclipse Workbench和SWT API,因此導入了org.eclipse.ui插件。 runtime標簽指明的是我們開發的插件所在JAR包的文件名。extension標簽是插件擴展點的信息。 org.eclipse.ui.views是Eclipse系統提供的觀察窗口擴展點,我們的例子是一個觀察窗口(View),這表明我們是要在 org.eclipse.ui.views擴展點上進一步開發。 extension中還包括category和view兩個標簽,並且在view的屬性中聲明了Welcome插件的類名。<?XML version="1.0" encoding="UTF-8"?> <plugin id="com.nidapeng.eclipse.plugin" name="Welcome to Eclipse" version="1.0" provider-name="Ni Dapeng"> <requires> <import plugin="org.eclipse.ui"/> </requires> <runtime> <library name="welcome.jar"/> </runtime> <extension point="org.eclipse.ui.views"> <category name="Welcome" id="com.nidapeng.eclipse.plugin.category1"> </category> <view name="Welcome to Eclipse" category="com.nidapeng.eclipse.plugin.category1" class="com.nidapeng.eclipse.plugin.Welcome" id="com.nidapeng.eclipse.plugin.view1"> </view> </extension> </plugin>
我以為我發現了寶貝,興奮了好一陣!你看,多麼美妙的結構。包含了外部包的聲明、運行時的庫、擴展點的設置、視圖的定義。最最閃亮之處就是擴展點。這意味著所有的插件都可以具備容器的能力,插件可以插入另外一個插件裡面,插件本身就是個可擴展的。
當我著手建立這樣的Java模型時候,我碰到難題了。我怎樣才能將插件視圖插入到框架視圖裡呢?我怎樣才能實現框架與插件之間的通信,包括事件的傳遞。
首先說明一下這個框架的具體的應用和所采用的技術。這個框架是個web應用,窗體可配置的,可能是上下一分為二,也可能是左右一分為二等等,並且窗體可嵌套的。窗體的每一區域具體的視圖也可配置的,可能是個導航條,也可能是個列表框。技術打算采用struts的架構,保留action、bean、view。它們可以幫助我們完成其中一些繁重的工作。所以容器治理只能是struts本身的ActionServlet容器或者它的子類。
Struts是一個高度可配置、高度擴展性的MVC框架,我們幾乎可以用它開發任何能想到的用Java技術的Web應用。MVC模式的每一部分在StrUCts中都有相關對應部分。在struts裡action是控制層,bean是模型層,view是視圖層。
現在我們把框架需求整理一下,以便我們更好的分析和定義框架的描述文件。
好了,現在知道我們需要做什麼了。我們的描述文件裡需要包括下列元素:
這裡沒有視圖描述,因為struts已經將action關聯了視圖。所以我們只需要治理action就行了。視圖的處理全部交給struts去做了。
太累了,這裡先放上初步的框架描述文件。以後等大腦清醒了,再闡述~
<?xml version="1.0" encoding="UTF-8"?> /*begin插件定義*/ <plugin id="com.useeasy.plugin" name="Welcome to frame" version="1.0" provider-name="doJava"> /*begin擴展區定義*/ <frameset rows="64,*" desc="可擴展插件的web框架" extension="com.useeasy.frame"> <frame id="com.useeasy.header" scrolling="no" noresize="true" action="/headAction" desc="第一個擴展區" </frame> <frame id="com.useeasy.main action="/listAction" desc="第二個擴展區"> </frame> </frameset> //定義兩個擴展區 /*end擴展區定義 </plugin> /*end插件定義*/