【正文】
cket生成合適的URL。)在類不需要參數(shù)到它的構(gòu)建函數(shù)的情況下,我們可以用Spring插入一個(gè)鏈接。在Sping創(chuàng)建鏈接要求我們的頁(yè)面鏈接文本必須國(guó)際化。我們呆會(huì)會(huì)對(duì)國(guó)際化進(jìn)行更加深入的討論。GeoServer的最簡(jiǎn)單的可能的Wicket擴(kuò)展包含3個(gè)文件。有個(gè)Java類定義(在src/main/java/org/geoserver/web/example/)。package 。import 。public class MyPage extends GeoServerBasePage{ // We will fill in the rest later, for now the page can just be blank}同樣也需要一個(gè)Spring應(yīng)用環(huán)境文檔(src/main/java/):bean class= id=myPageLink ! An internal identifier for the link ponent property name=id value=mypage/ ! The i18n key for the link title property name=titleKey value=/ ! The i18n key for a longer description of the page property name=descriptionKey value=/ ! The fully qualified name of the page class property name=ponentClass value=/ ! Optional, an icon to display alongside the link. property name=icon value=imgs// ! Optional, the category in which the link should be grouped. property name=category ref=someCategory/ ! Optional, a key used to order the links in the menu. property name=order value=100//bean第三個(gè)需要的文件是國(guó)際化字符串的默認(rèn)字典,存于src/main/java/:=My Example Page=An example page for developers trying to extend the GeoServer UI.如果你使用了這些三個(gè)文件創(chuàng)建了一個(gè)jar,并且把它添加到GeoServer類路徑(Classpath)中,我們就能在左側(cè)看到新的鏈接。加到頁(yè)面到這我們已經(jīng)給UI添加一個(gè)頁(yè)面,但是這個(gè)還不是很有趣。在Wicket里面,頁(yè)面以HTML文件提供他們的內(nèi)容,該HTML文件與Java代碼有著同樣的名稱,當(dāng)然擴(kuò)展名不同。關(guān)于這些文件的有些具體細(xì)節(jié)與標(biāo)準(zhǔn)HTML不同;一方面,它們必須是標(biāo)準(zhǔn)有效的XML,Wicket才能處理。另外,Wicket使用少量的“特殊”元素來(lái)描述哪里需要Java代碼檢測(cè)并處理成HTML。下面是GeoServer管理控制臺(tái)最常用的: Wicket元素目的foo wicket:id=”bar”/fooWicket:id屬性告知Wicket將要使用的名稱,當(dāng)匹配到Wicket組件的。wicket:child/不需要內(nèi)容,但是擴(kuò)展該頁(yè)的類可以此處插入內(nèi)容。wicket:extend/wicket:extend封裝的內(nèi)容將會(huì)在wicket:child/的地方插入到父頁(yè),wicket:panel/wicket:panel與wicket:extend相似,但是用于創(chuàng)建特定的組件而非擴(kuò)展的頁(yè)。wicket:head/wicket:head包含這個(gè)標(biāo)記(能用于頁(yè)面pages或者面板panels)的頁(yè)面頭部需要添加的這節(jié)內(nèi)容(像包含的CSS或JavaScript代碼)wicket:link/wicket:link封裝那些將會(huì)重寫到頁(yè)面的鏈接,CSS文件和它管理的其它資源。(這會(huì)允許你引用那些相對(duì)于Java源代碼的路徑的資源,而不是渲染后的HTML)。wicket:message key=”i18nKey”Default Text/wicket:message告知Wicket到國(guó)際化數(shù)據(jù)庫(kù)查找字符串,如果找到了就替換成需要的文本。Wicket只提供很少的組件,其中一些見(jiàn)于Wicket組件參考??傮w上,Wicket組件需要一個(gè)模型對(duì)象來(lái)處理getting,setting,和轉(zhuǎn)換組件相關(guān)的值的to/from字符串。這個(gè)示例的目的是,我們將會(huì)集中于一個(gè)最簡(jiǎn)單的,即為L(zhǎng)abel,它會(huì)在運(yùn)行時(shí)替換所綁定的值的元素內(nèi)容。由以上的內(nèi)容我們繼續(xù),我們可以把一個(gè)字符串提供給Label的構(gòu)造函數(shù),并且它透明式的轉(zhuǎn)換成一個(gè)模型:package 。import 。import 。public class MyPage extends GeoServerBasePage{ public MyPage(){ add(new Label(label, Hello World))。 }}相關(guān)的HTML源是src/main/java/org/geoserver/web/example/:htmlhead/headbody wicket:extend Greetings, GeoServer User! My message for you is span wicket:id=label thanks for using GeoServer /span. /wicket:extend/body/html當(dāng)然,我們可以使用Wicket來(lái)做很多更加復(fù)雜(并且有用)的事,但是這個(gè)示例演示的是最通用功能:僅僅是添加一些動(dòng)作到HTML元素。在導(dǎo)航菜單外部添加鏈接當(dāng)然,我們不能在左邊菜單中添加全部的東西;一方面,它只定義了靜態(tài)鏈接集,GeoServer綁定這些鏈接到很多不同配置的資源。加一方面,有些頁(yè)面需要傳參數(shù)給它們的構(gòu)造函數(shù)。如果你需要添加特定的鏈接到頁(yè)面上,你可以使用Wicket Links組件,并且定制onClick行為來(lái)調(diào)用相應(yīng)的構(gòu)造函數(shù)。(你也可以在處理用戶輸入的其它方法里使用setResponsePage,如form提交。更詳細(xì)的信息請(qǐng)查詢Wicket文檔。)一個(gè)示例://...import 。//...add(new Link(link){ public void onClick(){ setResponsePage(new MyPage())。 }})。相對(duì)應(yīng)的HTML將像:Follow this lovely a href= wicket:id=linklink/a.使它國(guó)際化在GeoServer UI,我們使用一個(gè)定制的資源查找工具,以供任意模塊提供資源字符。,在你的src目錄的根部(比如project/src/main/java/)。wicket:message元素使得文本國(guó)際化變得十分容易,但是在你需要插入值到句子中依語(yǔ)言不同而變化的位置時(shí),你將會(huì)使用到一些更加復(fù)雜的方法。在Wicket里面,i18n值字符串能定義參數(shù),通過(guò)這些參數(shù)能提供放置動(dòng)態(tài)值到國(guó)際化字符串的能力。詳見(jiàn):添加資源通常在HTML里面,你會(huì)需要包含一些有用的東西,如CSS文件,JavaScript庫(kù),或者包含到頁(yè)面上的圖片。Wicket允許你使用URL來(lái)描述這些相對(duì)于你的Java源文件,使用封裝在wicket:link標(biāo)簽里面的相對(duì)路徑。Wicket會(huì)在運(yùn)行時(shí)使用正確的路徑來(lái)重寫這些鏈接。盡管如此,對(duì)于類似于不是繼承于父類的資源,因此如果你需要包含多個(gè)包里都有的資源,你就需要一個(gè)新的類供兩個(gè)類中共享資源??碐eoServer UI核心模塊中的XMLEditor組件,作為組件的示例,它也是起這個(gè)功能。UI設(shè)計(jì)準(zhǔn)則下面是GeoServer中Wicket頁(yè)面的UI設(shè)計(jì)簡(jiǎn)單準(zhǔn)則:表單Forms在表單里面,將每個(gè)字段分組作為包含一個(gè)標(biāo)簽和一個(gè)字段的一項(xiàng)放在一個(gè)無(wú)序列表中。對(duì)于單選按鈕和復(fù)選框,標(biāo)簽應(yīng)當(dāng)放在字段后面;對(duì)于其它的,標(biāo)簽就可放在字段的前面,比如:ul li label for=foowicket:message key=foo Foo /wicket:message input wicket:id=foo type=text/input /li/ul避免用戶需要特殊知識(shí)比如,當(dāng)需要一個(gè)值列表時(shí),可以提供一個(gè)工具允許用戶一次一個(gè)元素地操作列表,而不是給一個(gè)逗號(hào)分隔的值列表定制組件我們推薦創(chuàng)建一個(gè)可持續(xù)利用的Wicket組件用于任意一個(gè)復(fù)雜的值,這些值可能被用戶編輯,比如外框或者自由字符串列表。通過(guò)提取并封裝成一個(gè)組件,就能更易于提供一個(gè)兼容的、豐富的編輯功能給用戶。Web用戶接口簡(jiǎn)介GeoServer使用著名的Wicket網(wǎng)絡(luò)應(yīng)用程序框架作為它的用戶接口。Wicket與很多Java網(wǎng)絡(luò)框架不同的是它是基于組件的而非JSP模板的。這點(diǎn)使得Wicket對(duì)于很多javat程序員來(lái)說(shuō)是一個(gè)顯得更加自然的網(wǎng)絡(luò)框架,因?yàn)檫@些人對(duì)于Swing編程比網(wǎng)絡(luò)編程更熟。插件原生的Wicket組件可由類路徑(classpath)加載。這就意味著網(wǎng)絡(luò)應(yīng)用程序可以基于模塊方式構(gòu)建,而不是單一方式。GeoServer將這種理念更前進(jìn)一步,提供一個(gè)可插拔的用戶接口,在該接口中Wicket組件可通過(guò)Spring和規(guī)則的GeoServer插件機(jī)制進(jìn)行插拔。插件化的每個(gè)組件由組件描述符描述,:public abstract class ComponentInfo implements Serializable { /** * the id of the ponent */ String id。 /** * the title of the ponent */ String title。 /** * The description of the ponent */ String description。 /** * the class of the ponent */ Class ponentClass。 }ComponentInfo的實(shí)例包含了關(guān)于組件的元信息,如標(biāo)題和描述等等,還有實(shí)現(xiàn)該組件的類。每個(gè)ComponentInfo的子類表示了一個(gè)特定的擴(kuò)展點(diǎn)。例如,”main”頁(yè)面的擴(kuò)展點(diǎn),如從應(yīng)用程序主菜單鏈接過(guò)去的頁(yè)面。實(shí)現(xiàn)一個(gè)Wicket UI擴(kuò)展本節(jié)描述如何實(shí)現(xiàn)一個(gè)GeoServer Wicket用戶接口的擴(kuò)展。該擴(kuò)展非常簡(jiǎn)單,就是一個(gè)由主菜單鏈接過(guò)去的很基礎(chǔ)的頁(yè)面,顯示一下“Hello World”。預(yù)置條件在開(kāi)始之前,GeoServer必須在本地系統(tǒng)上構(gòu)建成功。具體細(xì)節(jié)見(jiàn)源代碼和快速入門兩章。創(chuàng)建新模塊1. 在本地系統(tǒng)上創(chuàng)建一個(gè)名為hello_web的模塊。2. : xmlns= xmlns:xsi= xsi:schemaLocation=:// web2 hello_web jar hello_web webcore mavenpilerplugin 3. 在新模塊根目錄下創(chuàng)建src/main/java目錄。[hello_web]% mkdir p src/main/java 創(chuàng)建頁(yè)面類1. 。,它由GeoServerBasePage頁(yè)面擴(kuò)展而來(lái)。package 。import 。public class HelloPage extends GeoServerBasePage {} 2. 首先,我們需要實(shí)現(xiàn)它的構(gòu)造函數(shù)。在Wicket里面,一個(gè)頁(yè)面或組件都是在它的構(gòu)造函數(shù)里面構(gòu)建。我們的頁(yè)面很簡(jiǎn)單,將會(huì)創(chuàng)建一個(gè)值為“Hello World!”的標(biāo)簽。import 。... public HelloPage() { add( new Label( hellolabel, Hello World!) )。 } 在上面代碼中,創(chuàng)建了一個(gè)Label的實(shí)例。構(gòu)造函數(shù)的第一個(gè)參數(shù)是組件id。在Wicket框架中每個(gè)組件都必須有一個(gè)自己的id。下一節(jié)中該id還會(huì)用于綁定這些組件到它的HTML表達(dá)上。Label構(gòu)造函數(shù)的第二個(gè)參數(shù)是值,這里我們寫的是“Hello World!”創(chuàng)建頁(yè)面表達(dá)效果1. 頁(yè)面完成后,接下來(lái)一步就是為頁(yè)面創(chuàng)建HTML表達(dá)效果。,放在與HelloPagejava類同一目錄下 wicket:id=hellolabel 有幾件事需要注意下。第一件是元素的使用,它會(huì)告訴wicket說(shuō)HelloPage是另一個(gè)頁(yè)面的擴(kuò)展,本示例中是GeoServerBasePage,并且它會(huì)繼承來(lái)自于這個(gè)頁(yè)面的表達(dá)效果。元素的使用,它會(huì)告訴wicket說(shuō)HelloPage是另一個(gè)頁(yè)面的擴(kuò)展,本示例中是GeoServerBasePage,并且它會(huì)繼承來(lái)自于