




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
./目錄寫在前面3一介紹4二工具4Java4Maven4Subversion4三源代碼4源代碼5提交5庫(kù)結(jié)構(gòu)5分支結(jié)構(gòu)6快速入門6取出源代碼7由Maven構(gòu)建7由Maven生成Eclipse工程文件9導(dǎo)入模塊進(jìn)Eclipse9在Eclipse中運(yùn)行GeoServer12訪問(wèn)GeoServer首頁(yè)13Maven指南13安裝Maven13運(yùn)行Maven13構(gòu)建13跳過(guò)測(cè)試14離線構(gòu)建14構(gòu)建擴(kuò)展14Profiles15Eclipse15構(gòu)建Web模塊15使用Jetty運(yùn)行web模塊16Eclipse指南16導(dǎo)入模塊17運(yùn)行和調(diào)試17設(shè)置數(shù)據(jù)目錄17更改Jetty默認(rèn)端口18配置Jetty的JNDI資源19Eclipse首選項(xiàng)20代碼格式化21代碼模板22文本編輯器22編譯器23OWS服務(wù)24OWS服務(wù)概覽24實(shí)現(xiàn)一個(gè)簡(jiǎn)單的OWS服務(wù)24建立25創(chuàng)建插件27試一試30REST服務(wù)34簡(jiǎn)介34RESTful服務(wù)實(shí)現(xiàn)35基于Maps的Restful服務(wù)實(shí)現(xiàn)43基于反射的Restful服務(wù)實(shí)現(xiàn)49GeoServer中的Wicket開發(fā)55Web用戶接口61簡(jiǎn)介61實(shí)現(xiàn)一個(gè)WicketUI擴(kuò)展63encoding="ISO-8859-1"?><project4.0.0"xmlns:xsi="/2001/XMLSchema-instance"/maven-v4_0_0.xsd"><modelVersion></modelVersion><!--setparentpomtocommunitypom--><parent><groupId>org.geoserver</groupId><artifactId>community</artifactId><version></version></parent><groupId>org.geoserver</groupId><artifactId>hello</artifactId><packaging>jar</packaging><version>1.0</version><name>HelloWorldServiceModule</name><!--declaredepenencyongeoservermain--><dependencies><dependency><groupId>org.geoserver</groupId><artifactId>main</artifactId><version></version></dependency></dependencies><repositories><repository><id>opengeo</id><name>opengeo</name><url></url></repository></repositories></project>3.在hello目錄下創(chuàng)建Java源文件目錄。hello/+pom.xml+src/+main/+java/創(chuàng)建插件插件是一系列由springbeans實(shí)現(xiàn)的擴(kuò)展。實(shí)例中擴(kuò)展興趣點(diǎn)是一個(gè)HelloWorld的POJO。1.創(chuàng)建一個(gè)名為HelloWorld的類:importjava.io.IOException;importjavax.servlet.ServletException;importttpServletRequest;importjavax.servlet.http.HttpServletResponse;publicclassHelloWorld{publicHelloWorld<>{//Donothing}publicvoidsayHello<HttpServletRequestrequest,HttpServletResponseresponse>throwsServletException,IOException{response.getOutputStream<>.write<"HelloWorld".getBytes<>>;}}該服務(wù)相對(duì)比較簡(jiǎn)單。它提供了一個(gè)一個(gè)名為sayHello的方法,帶有HttpServletRequest,HttpServletResponse參數(shù)。該函數(shù)的參數(shù)列表會(huì)由自動(dòng)發(fā)現(xiàn)。2.創(chuàng)建applicationContext.xml文件將上面的類申明為一個(gè)bean。<?xmlversion="1.0"encoding="UTF-8"?><!DOCTYPEbeansPUBLIC"-//SPRING//DTDBEAN//EN""/dtd/spring-beans.dtd"><beans><!--SpringwillreferencetheinstanceoftheHelloWorldclassbytheidname"helloService"--><beanid="helloService"class="HelloWorld"></bean>tolocateit.--><beanid="helloService-"class="org.geoserver.platform.Service"><!--usedtoreferencetheserviceintheURL--><constructor-argindex="0"value="hello"/><!--ouractualservicePOJOdefinedpreviously--><constructor-argindex="1"ref="helloService"/><!--aversionnumberforthisservice--><constructor-argindex="2"value=""/><!--alistoffunctionsforthisservice--><constructor-argindex="3"><list><value>sayHello</value></list></constructor-arg></bean></beans>到此,hello工程內(nèi)容應(yīng)該是看上去像下面這樣了:hello/+pom.xml+src/+main/+java/+HelloWorld.java+applicationContext.xml試一試1.安裝hello模塊。[hello]%mvninstall[hello]%mvninstall[INFO]Scanningforprojects...[INFO][INFO]BuildingHelloWorldServiceModule[INFO]task-segment:[install][INFO][INFO][resources:resources][INFO]Usingdefaultencodingtocopyfilteredresources.[INFO][compiler:compile][INFO]Compiling1sourcefileto/home/ak/geoserver/community/hello/target/classes[INFO][resources:testResources][INFO]Usingdefaultencodingtocopyfilteredresources.[INFO][compiler:testCompile][INFO]Nosourcestocompile[INFO][surefire:test][INFO]Noteststorun.[INFO][jar:jar][INFO][INFO][jar:test-jar{execution:default}][WARNING]JARwillbeempty-nocontentwasmarkedforinclusion![INFO][INFO][install:install][INFO][INFO][INFO][INFO]BUILDSUCCESSFUL[INFO][INFO]Totaltime:6seconds[INFO]Finishedat:FriSep2114:52:31EDT2007[INFO]FinalMemory:27M/178M[INFO]1.拷貝文件到到你的GeoServer安裝的WEB-INF/lib目錄。2.重啟GeoServer。3.訪問(wèn):http:<host>/geoserver/ows?request=sayHello&service=hello&version=請(qǐng)求request我們服務(wù)內(nèi)定義的方法服務(wù)service applicationContext.xml文件中Service描述符的名稱版本version applicationContext.xml文件中Service描述符的版本可選方法1.與web模塊一起構(gòu)建另外一個(gè)可選方法是在新的插件工程上從web模塊申明一個(gè)依賴。1.像上面一樣安裝hello模塊。2.編輯web/pom.xml,添加如下依賴:<dependency><groupId>org.geoserver</groupId><artifactId>hello</artifactId><version>1.0</version></dependency>3.安裝、運(yùn)行web模塊[web]mvninstalljetty:run4.訪問(wèn):http://localhost:8080/geoserver/ows?request=sayHello&serv可選方法2:由GeoServer源中運(yùn)行作為嘗試插件開發(fā)的一種可選方法:1.安裝hello模塊。2.更改路徑到web模塊3.安裝web模塊。4.拷貝<hello文件到<webmodule>/target/geoserver/WEB-INF/lib目錄:[/dev/geoserver/web]%cp~/hello/target/hello-1.0.jartarget/geoserver/WEB-INF/lib5.使用Jetty運(yùn)行打包的war。[/dev/geoserver/web]%mvnjetty6:run-exploded6.訪問(wèn):http://localhost:8080/geoserver/ows?request=sayHeREST服務(wù)本節(jié)是GeoServer中運(yùn)行RESTful服務(wù)的的預(yù)覽。簡(jiǎn)介GeoServer使用著名的Restlet庫(kù)提供系統(tǒng)所有REST相關(guān)功能。Restlet是由Java編寫的輕量級(jí)rest框架,它能很好的集成基于已有的servlet的應(yīng)用程序Rest派發(fā)GeoServer里面,所有路徑/rest下面的請(qǐng)求都被認(rèn)為是一個(gè)restful請(qǐng)求。這每一個(gè)請(qǐng)求都交由一個(gè)rest派發(fā)器來(lái)處理。派發(fā)器的工作職責(zé)是請(qǐng)每個(gè)請(qǐng)求導(dǎo)向到相關(guān)的處理終端上。該終端就是restlet。Restlet由spring環(huán)境加載,因此它們是可插拔的。RestletsRestlet是處理派發(fā)器轉(zhuǎn)發(fā)來(lái)的調(diào)用,與類相對(duì)應(yīng)。我們可以擴(kuò)展該類以實(shí)現(xiàn)一個(gè)服務(wù)端點(diǎn)〔服務(wù)點(diǎn)。同樣,我們也可以為了某個(gè)特殊目的擴(kuò)展出一個(gè)子類。下節(jié)描述的就是一個(gè)名為finder的子類。Finders和資源Restful服務(wù)通常是實(shí)現(xiàn)了某一個(gè)資源。Finder對(duì)象是一個(gè)特殊的restlet,它的職責(zé)是為特定的請(qǐng)求找到正確的資源。該資源就作為一個(gè)最終的終點(diǎn),并處理請(qǐng)求。相關(guān)的類是和。表達(dá)Representations\o"Permalinktothisheadline"?Repreentation,通常是指特殊狀態(tài)的狀態(tài)或者資源編碼的格式。例如,當(dāng)某個(gè)特殊資源請(qǐng)求進(jìn)來(lái)時(shí),該資源的表達(dá)就返回給了客戶端。RESTful服務(wù)實(shí)現(xiàn)本節(jié)描述GeoServer如何實(shí)現(xiàn)一個(gè)restful服務(wù),將以"helloworld"為示例。該服務(wù)非常簡(jiǎn)單,將會(huì)向一個(gè)GET請(qǐng)求返回一個(gè)"HelloWorld"的文本。預(yù)置條件在開始之前,GeoServer必須在本地系統(tǒng)上構(gòu)建成功。具體細(xì)節(jié)見(jiàn)源代碼和/maven-v4_0_0.xsd"><modelVersion></modelVersion><groupId>org.geoserver</groupId><artifactId>hello_rest</artifactId><packaging>jar</packaging><version>1.0-SNAPSHOT</version><name>hello_rest</name><dependencies><dependency><groupId>org.geoserver</groupId><artifactId>rest</artifactId><version>2.0-SNAPSHOT</version></dependency><dependency><groupId>org.geoserver</groupId><artifactId>main</artifactId><version>2.0-SNAPSHOT</version><classifier>tests</classifier><scope>test</scope></dependency><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version></version><scope>test</scope></dependency><dependency><groupId>com.mockrunner</groupId><artifactId>mockrunner</artifactId><version></version><scope>test</scope></dependency></dependencies><build><plugins><plugin><artifactId>maven-compiler-plugin</artifactId><configuration><source>1.5</source><target>1.5</target></configuration></plugin></plugins></build></project>1.在新模塊根部創(chuàng)建src/main/java目錄[hello_rest]%mkdir-psrc/main/java創(chuàng)建資源類1.當(dāng)創(chuàng)建新的資源時(shí),我們可以拿到類。在包內(nèi)創(chuàng)建一個(gè)名為HelloResource的新類,它由AbstractResource擴(kuò)展。packageorg.geoserver.hellorest;importjava.util.List;importorg.geoserver.rest.AbstractResource;importorg.geoserver.rest.format.DataFormat;importorg.restlet.data.Request;importorg.restlet.data.Response;publicclassHelloResourceextendsAbstractResource{@OverrideprotectedList<DataFormat>createSupportedFormats<Requestrequest,Responseresponse>{returnnull;}}2.第一個(gè)要實(shí)現(xiàn)的方法是createSupportedFormats〔。該方法的目的是創(chuàng)建一個(gè)由擴(kuò)展到特殊格式的映射。那么好,現(xiàn)在我們的目標(biāo)就是給客戶端的".txt"擴(kuò)展請(qǐng)求返回"HelloWorld"的文本。importjava.util.ArrayList;importorg.geoserver.rest.format.StringFormat;...@OverrideprotectedList<DataFormat>createSupportedFormats<Requestrequest,Responseresponse>{List<DataFormat>formats=newArrayList<>;formats.add<newStringFormat<MediaType.TEXT_PLAIN>>;returnformats;}2.接下來(lái)需要覆蓋handleGet〔方法。該方法在資源的GET請(qǐng)求拿到時(shí)調(diào)用。@OverridepublicvoidhandleGet<>{//gettheappropriateformatDataFormatformat=getFormatGet<>;//transformthestring"HelloWorld"totheappropriateresponsegetResponse<>.setEntity<format.toRepresentation<"HelloWorld">>;}上面代碼使用getFormatGet〔方法,該方法的目的是確定客戶端請(qǐng)求的擴(kuò)展,并為它找到對(duì)應(yīng)的格式。在本例中,當(dāng)客戶端請(qǐng)求".txt"擴(kuò)展時(shí),就可看到前面步驟中的StringFormat創(chuàng)建了。創(chuàng)建應(yīng)用程序環(huán)境1.下面一步是創(chuàng)建應(yīng)用程序環(huán)境,用以告知GeoServer上節(jié)中所創(chuàng)建的資源。在hello_rest模塊根部創(chuàng)建src/main/resources目錄。[hello_rest]%mkdirsrc/main/resources2.在hello_rest模塊根部創(chuàng)建src/main/resources目錄中添加如下的applicationContext.xml文件。<!DOCTYPEbeansPUBLIC"-//SPRING//DTDBEAN//EN""/dtd/spring-beans.dtd"><beans><beanid="hello"class="org.geoserver.hellorest.HelloResource"/><beanid="helloMapping"class="org.geoserver.rest.RESTMapping"><propertyname="routes"><map><entry><key><value>/hello.{format}</value></key><value>hello</value></entry></map></property></bean></beans>這部分里面有兩點(diǎn)需要注意。第一個(gè)是前一節(jié)中創(chuàng)建的HelloResource類的實(shí)例hellobean。第二個(gè)是helloMappingbean,它定義了uri的模塊,該uri是用來(lái)訪問(wèn)資源的。上面的映射描述了資源將被定位在/rest/hello.{format},其中format是代表客戶端請(qǐng)求格式。就像實(shí)現(xiàn)程序里的那樣,hello.txt是唯一受支持的表達(dá)格式。測(cè)試1.hello_rest模塊根部創(chuàng)建/src/test/java目錄。[hello_rest]%mkdir-psrc/test/java2.在包內(nèi)創(chuàng)建名為HelloResourceTest的測(cè)試類,該類由擴(kuò)展而來(lái):packageorg.geoserver.hellorest;importorg.geoserver.test.GeoServerTestSupport;publicclassHelloResourceTestextendsGeoServerTestSupport{publicvoidtest<>throwsException{}}3.為/rest/hello.txt的GET請(qǐng)求添加一個(gè)狀態(tài),并且斷言到它等于"HelloWorld"字符串。publicvoidtest<>throwsException{assertEquals<"HelloWorld",getAsString<"/rest/hello.txt">>;}4.構(gòu)建并且測(cè)試hello_test模塊。[hello_rest]%mvninstall基于Maps的Restful服務(wù)實(shí)現(xiàn)前一節(jié)中我們介紹了如何實(shí)現(xiàn)一個(gè)簡(jiǎn)單的restful服務(wù)。本節(jié)將介紹如何為請(qǐng)求所表達(dá)的資源支持額外的格式利用已有的基類,以節(jié)省時(shí)間。我們所使用的類是。MapResource的目的是資源由包含在中的數(shù)據(jù)結(jié)構(gòu)來(lái)提供。在該map集合中,MapResource類可自動(dòng)以XML或者JSON格式為資源創(chuàng)建表達(dá)形式。預(yù)置條件本節(jié)建立在上一節(jié)中"/dtd/spring-beans.dtd"><beans><beanid="hello"class="org.geoserver.hellorest.HelloResource"/><beanid="helloMap"class="org.geoserver.hellorest.HelloMapResource"/><beanid="helloMapping"class="org.geoserver.rest.RESTMapping"><propertyname="routes"><map><entry><key><value>/hello.{format}</value></key><!--value>hello</value--><value>helloMap</value></entry></map></property></bean></beans>這段中有兩件事需要注意。第一個(gè)是helloMapbean的添加。第二個(gè)是helloMappingbean的修改,它現(xiàn)在映射的是helloMapbean,而非hellobean。測(cè)試在包中創(chuàng)建一個(gè)新的名為HelloMapResourceTest測(cè)試類,它由擴(kuò)展而來(lái):packageorg.geoserver.hellorest;importorg.geoserver.test.GeoServerTestSupport;publicclassHelloMapResourceTestextendsGeoServerTestSupport{}2.為構(gòu)建/rest/hello.xmlGET請(qǐng)求添加一個(gè)名為testGetAsXML〔的測(cè)試方法:...importorg.w3c.dom.Document;importorg.w3c.dom.Node;...publicvoidtestGetAsXML<>throwsException{//maketherequest,parsingtheresultasadomDocumentdom=getAsDOM<"/rest/hello.xml">;//printouttheresultprint<dom>;//makeassertionsNodemessage=getFirstElementByTagName<dom,"message">;assertNotNull<message>;assertEquals<"HelloWorld",message.getFirstChild<>.getNodeValue<>>;}3.為/rest/hello.json的GET請(qǐng)求添加名為testGetAsJSON〔的測(cè)試方法。...importnet.sf.json.JSON;importnet.sf.json.JSONObject;...publicvoidtestGetAsJSON<>throwsException{//maketherequest,parsingtheresultintoajsonobjectJSONjson=getAsJSON<"/rest/hello.json">;//printouttheresultprint<json>;//makeassertionsassertTrue<jsoninstanceofJSONObject>;assertEquals<"HelloWorld",<<JSONObject>json>.get<"message">>;}4.構(gòu)建并測(cè)試hello_tes模塊。[hello_rest]%mvncleaninstall-Dtest=HelloMapResourceTest基于反射的Restful服務(wù)實(shí)現(xiàn)上一節(jié)中我們介紹了利用MapResource基類可更高效實(shí)現(xiàn)RESTful服務(wù)的范例。本節(jié)我們將介紹另外一個(gè)不同的基類,但卻有同樣的功效。該類是。該類的基本思想是資源由任意一個(gè)對(duì)象來(lái)提供。ReflectiveResource類使用反射來(lái)自動(dòng)創(chuàng)建XML或者JSON格式的資源結(jié)果表達(dá)。預(yù)置條件本節(jié)建立在上一節(jié)"/dtd/spring-beans.dtd"><beans><beanid="hello"class="org.geoserver.hellorest.HelloResource"/><beanid="helloMap"class="org.geoserver.hellorest.HelloMapResource"/><beanid="helloReflective"class="org.geoserver.hellorest.HelloReflectiveResource"/><beanid="helloMapping"class="org.geoserver.rest.RESTMapping"><propertyname="routes"><map><entry><key><value>/hello.{format}</value></key><!--value>hello</value--><!--value>helloMap</value--><value>helloReflective</value></entry></map></property></bean></beans>有兩點(diǎn)需要注意。第一件是helloReflectivebean的添加。第二件是helloMappingbean的修改,它映射到了helloReflectivebean。測(cè)試1.在包中創(chuàng)建一個(gè)名為HelloReflectiveResourceTest的類,它由擴(kuò)展而來(lái):packageorg.geoserver.hellorest;importorg.geoserver.test.GeoServerTestSupport;publicclassHelloReflectiveResourceTestextendsGeoServerTestSupport{}2.為構(gòu)建/rest/hello.xml的GET請(qǐng)求添加一個(gè)名為testGetAsXML〔的方法。...importorg.w3c.dom.Document;importorg.w3c.dom.Node;...publicvoidtestGetAsXML<>throwsException{//maketherequest,parsingtheresultasadomDocumentdom=getAsDOM<"/rest/hello.xml">;//printouttheresultprint<dom>;//makeassertionsNodemessage=getFirstElementByTagName<dom,"message">;assertNotNull<message>;assertEquals<"HelloWorld",message.getFirstChild<>.getNodeValue<>>;}3.為/rest/hello.json的GET請(qǐng)求添加一個(gè)名為testGetAsJSON〔的方法。...importnet.sf.json.JSON;importnet.sf.json.JSONObject;...publicvoidtestGetAsJSON<>throwsException{//maketherequest,parsingtheresultintoajsonobjectJSONjson=getAsJSON<"/rest/hello.json">;//printouttheresultprint<json>;//makeassertionsassertTrue<jsoninstanceofJSONObject>;JSONObjecthello=<<JSONObject>json>.getJSONObject<"org.geoserver.hellorest.Hello">;assertEquals<"HelloWorld",hello.get<"message">>;}4.構(gòu)建并測(cè)試hello_test模塊。[hello_rest]%mvncleaninstall-Dtest=HelloMapReflectiveResourceTestGeoServer中的Wicket開發(fā)本節(jié)介紹GeoServer2中基于Wicket配置接口創(chuàng)建頁(yè)面。關(guān)于Wicket的更多信息,可去取出工程站點(diǎn)。添加一頁(yè)在Wicket里面,每個(gè)頁(yè)面都有相應(yīng)的Java類。為了添加一個(gè)頁(yè)面,我們需要?jiǎng)?chuàng)建新類以擴(kuò)展,我們也同樣需要?jiǎng)?chuàng)建一個(gè)鏈接來(lái)引導(dǎo)用戶到該頁(yè)面?!部傮w上,Wicket頁(yè)面沒(méi)有可靠的URL,因此我們必須在已有頁(yè)面明確的創(chuàng)建一個(gè)鏈接,讓W(xué)icket生成合適的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/MyPage.java文件中。packageorg.geoserver.web.example;import;publicclassMyPageextendsGeoServerBasePage{//Wewillfillintherestlater,fornowthepagecanjustbeblank}同樣也需要一個(gè)Spring應(yīng)用環(huán)境文檔〔src/main/java/applicationContext.xml:<beanclass="org.geoserver.web.MenuPageInfo"id="myPageLink"><!--Aninternalidentifierforthelinkcomponent--><propertyname="id"value="mypage"/><!--Thei18nkeyforthelinktitle--><propertyname="titleKey"value="org.geoserver.web.example.MyPage.page.title"/><!--Thei18nkeyforalongerdescriptionofthe><propertyname="descriptionKey"value="org.geoserver.web.example.MyPage.page.description"/><!--Thefullyqualifiednameofthepageclass--><propertyname="componentClass"value="org.geoserver.web.example.MyPage"/><!--Optional,anicontodisplayalongsidethelink.--><propertyname="icon"value="imgs/some-image.png"/><!--Optional,thecategoryinwhichthelinkshouldbegrouped.--><propertyname="category"ref="someCategory"/><!--Optional,akeyusedtoorderthelinksinthemenu.--><propertyname="order"value="100"/></bean>第三個(gè)需要的文件是國(guó)際化字符串的默認(rèn)字典,存于src/main/java/GeoServerAperties文件:=MyExamplePage=AnexamplepagefordeveloperstryingtoextendtheGeoServerUI.如果你使用了這些三個(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元素目的<foowicket:id="bar"></foo>Wicket: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:messagekey="i18nKey">DefaultText</wicket:message>告知Wicket到國(guó)際化數(shù)據(jù)庫(kù)查找字符串,如果找到了就替換成需要的文本。Wicket只提供很少的組件,其中一些見(jiàn)于Wicket組件參考。總體上,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è)模型:packageorg.geoserver.web.example;import;import;publicclassMyPageextendsGeoServerBasePage{publicMyPage<>{add<newLabel<"label","HelloWorld">>;}}相關(guān)的HTML源是src/main/java/org/geoserver/web/example/MyPage.html:<html><head></head><body><wicket:extend>Greetings,GeoServerUser!Mymessageforyouis<spanwicket:id="label">thanksforusingGeoServer</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è)面上,你可以使用WicketLinks組件,并且定制onClick行為來(lái)調(diào)用相應(yīng)的構(gòu)造函數(shù)。〔你也可以在處理用戶輸入的其它方法里使用setResponsePage,如form提交。更詳細(xì)的信息請(qǐng)查詢Wicket文檔。一個(gè)示例://...import;//...add<newLink<"link">{publicvoidonClick<>{setResponsePage<newMyPage<>>;}}>;相對(duì)應(yīng)的HTML將像:Followthislovely<ahref="#"wicket:id="link">link</a>.使它國(guó)際化在GeoServerUI,我們使用一個(gè)定制的資源查找工具,以供任意模塊提供資源字符。你所需要做的是引入你的i18n值在名為GeoServerAperties的Java屬性文件,在你的src目錄的根部〔比如project/src/main/java/GeoServerAperties。<wicket:message>元素使得文本國(guó)際化變得十分容易,但是在你需要插入值到句子中依語(yǔ)言不同而變化的位置時(shí),你將會(huì)使用到一些更加復(fù)雜的方法。在Wicket里面,i18n值字符串能定義參數(shù),通過(guò)這些參數(shù)能提供放置動(dòng)態(tài)值到國(guó)際化字符串的能力。詳見(jiàn):f添加資源通常在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è)類中共享資源。看GeoServerUI核心模塊中的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><labelfor="foo"><wicket:messagekey="foo">Foo</wicket:message><inputwicket: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è)組件由組件描述符描述,每個(gè)組件描述符是類的一個(gè)實(shí)例:publicabstractclassComponentInfoimplementsSerializable{/***theidofthecomponent*/Stringid;/***thetitleofthecomponent*/Stringtitle;/***Thedescriptionofthecomponent*/Stringdescription;/***theclassofthecomponent*/ClasscomponentClass;}ComponentInfo的實(shí)例包含了關(guān)于組件的元信息,如標(biāo)題和描述等等,還有實(shí)現(xiàn)該組件的類。每個(gè)ComponentInfo的子類表示了一個(gè)特定的\l"extension-points"擴(kuò)展點(diǎn)。例如,類就表示"main"頁(yè)面的擴(kuò)展點(diǎn),如從應(yīng)用程序主菜單鏈接過(guò)去的頁(yè)面。實(shí)現(xiàn)一個(gè)WicketUI擴(kuò)展本節(jié)描述如何實(shí)現(xiàn)一個(gè)GeoServerWicket用戶接口的擴(kuò)展。該擴(kuò)展非常簡(jiǎn)單,就是一個(gè)由主菜單鏈接過(guò)去的很基礎(chǔ)的頁(yè)面,顯示一下"HelloWorld"。預(yù)置條件在開始之前,GeoServer必須在本地系統(tǒng)上構(gòu)建成功。具體細(xì)節(jié)見(jiàn)\l"source"源代碼和\l"quickstart"快速入門兩章。創(chuàng)建新模塊1.在本地系統(tǒng)上創(chuàng)建一個(gè)名為hello_web的模塊。2.添加如下的pom.xml文件到新模塊根部:xmlns="xmlns:xsi="/2001/XMLSchema-instance"xsi:schemaLocation="/POM/4.0.0/maven-v4_0_0.xsd">org.geoserverweb22.0-SNAPSHOTorg.geoserverhello_webjar1.0-SNAPSHOThello_weborg.geoserver.webweb-core2.0-SNAPSHOTmaven-compiler-plugin1.51.53.在新模塊根目錄下創(chuàng)建src/main/java目錄。[hello_web]%mkdir-psrc/main/java創(chuàng)建頁(yè)面類1.類是GeoServer中所有頁(yè)面的基類。在包中創(chuàng)建一個(gè)新類HelloPage,它由GeoServerBasePage頁(yè)面擴(kuò)展而來(lái)。packageorg.geoserver.helloweb;import;publicclassHelloPageextendsGeoServerBasePage{}2.首先,我們需要實(shí)現(xiàn)它的構(gòu)造函數(shù)。在Wicket里面,一個(gè)頁(yè)面或組件都是在它的構(gòu)造函數(shù)里面構(gòu)建。我們的頁(yè)面很簡(jiǎn)單,將會(huì)創(chuàng)建一個(gè)值為"HelloWorld!"的標(biāo)簽。import;...publicHelloPage<>{add<newLabel<"hellolabel","He
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 移動(dòng)施工合同范本
- 什么借款合同范本
- 2023-2024學(xué)年高中信息技術(shù)必修一滬科版(2019)第三單元項(xiàng)目七《 用計(jì)算機(jī)計(jì)算圓周率-設(shè)計(jì)簡(jiǎn)單數(shù)值數(shù)據(jù)算法》教學(xué)設(shè)計(jì)
- 建魚池合同范本
- 雜志制作合同范本
- 基金合同范本
- 個(gè)人測(cè)繪合同范本
- 廣告巡展合同范本
- 二年級(jí)期末家長(zhǎng)會(huì)的演講稿
- 1《北京的春節(jié)》教學(xué)設(shè)計(jì)-2023-2024學(xué)年統(tǒng)編版語(yǔ)文六年級(jí)下冊(cè)
- 2024年濟(jì)南廣播電視臺(tái)招聘工作人員筆試真題
- 2025年臨床醫(yī)師定期考核必考復(fù)習(xí)題庫(kù)及答案(1060題)
- 市場(chǎng)消防安全課件
- 名師工作室建設(shè)課件
- 2025-2025學(xué)年度人教版小學(xué)五年級(jí)美術(shù)下冊(cè)教學(xué)計(jì)劃
- 《電力建設(shè)工程施工安全管理導(dǎo)則》(NB∕T 10096-2018)
- 2024-2025學(xué)年廣東省部分學(xué)校高一(上)第一次聯(lián)合考試物理試卷(含答案)
- 《黃色新聞的泛濫》課件
- 2024年山東省公務(wù)員考試《行測(cè)》真題及答案解析
- 化工原理Ⅱ?qū)W習(xí)通超星期末考試答案章節(jié)答案2024年
- 2024-2025學(xué)年初中體育與健康九年級(jí)全一冊(cè)人教版(2024)教學(xué)設(shè)計(jì)合集
評(píng)論
0/150
提交評(píng)論