geoserver地圖配置文檔_第1頁(yè)
geoserver地圖配置文檔_第2頁(yè)
geoserver地圖配置文檔_第3頁(yè)
geoserver地圖配置文檔_第4頁(yè)
geoserver地圖配置文檔_第5頁(yè)
已閱讀5頁(yè),還剩31頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、準(zhǔn)備工作下載JDK(java development kit)下載Apache下載Tomcat下載geoserver下載PostgreSQL 下載Postgis下載Pgrouting下載Openlayers/wiki/HowToDownload下載Tilecache2.10,python-2.5.1,mod_python-31.3.1.win32-py2.5-Apache2.2,鏈接分別為 / ,http:/ /, /。注意版本要匹配。geoserver安裝安裝Sun Java 2 SDK(java se development kit)Geoserver的安裝需要JDK支持,因此應(yīng)預(yù)先安裝J

2、DK,安裝JDK到指定目錄。安裝完成后配置環(huán)境變量:“我的電腦”-“屬性”, “高級(jí)”選項(xiàng)卡-“環(huán)境變量”; 在“系統(tǒng)變量”中JAVA_HOME變量名D:Program FilesJavajdk1.7.0(以本機(jī)為例)。安裝Apache服務(wù)器安裝Apache到指定目錄,默認(rèn)使用80端口。安裝完成后,在瀏覽器中輸入http:/localhost或者 HYPERLINK / /,檢測(cè)apache安裝是否正確。如果Apache Server無(wú)法正常啟動(dòng),檢查端口是否被占用。端口查看方法是“開(kāi)始”-“運(yùn)行”-“cmd” 命令-“netstat a n”命令。若端口被占用,修改apache的conf文件

3、夾中的httpd.conf文件,將端口改為其他值。修改前應(yīng)關(guān)閉服務(wù),修改保存后重啟服務(wù)。安裝Tomcat 安裝Tomcat到指定目錄,默認(rèn)使用8080端口。安裝完成后,在瀏覽器輸入 HYPERLINK http:/localhost/8080 http:/localhost/8080或者 HYPERLINK http:/localhost/8080 /8080,檢測(cè)Tomcat是否安裝正確。若安裝正確,訪(fǎng)問(wèn)出現(xiàn)的頁(yè)面如下。如果Tomcat無(wú)法正常啟動(dòng),檢查端口是否被占用。方法和apache類(lèi)似,修改confg文件夾中server.xml文件中的端口。將geoserver.war包復(fù)制到Tomc

4、at安裝目錄D:Program FilesApache Software FoundationTomcat 6.0webapps(以本機(jī)為例)。再啟動(dòng)Tomcat,Tomcat將自動(dòng)部署geoserver。該過(guò)程中會(huì)在webapps文件夾內(nèi)自動(dòng)生成geoserver文件夾。打開(kāi) HYPERLINK http:/localhost:8080/geoserver http:/localhost:8080/geoserver,若出現(xiàn)geoserver歡迎頁(yè)面,則tomcat部署geoserver成功。安裝geoserver安裝地圖空間數(shù)據(jù)庫(kù)安裝postgresql-8.4安裝postgis打開(kāi)pgA

5、dmin III,在“工具”-“服務(wù)器配置”中配置 安裝pgRouting(版本應(yīng)對(duì)應(yīng)postgresql8.4)把“l(fā)ib”文件夾下的librouting_tsp.dll、librouting_dd.dll、librouting.dll三個(gè)文件,拷貝到D:Program FilesPostgreSQL8.4lib目錄下; 在postgis數(shù)據(jù)庫(kù)的“查詢(xún)分析器”中,分別執(zhí)行“sharePAGEXXX文件夾下的routing_tsp_wrappers.sql、routing_tsp.sql、routing_dd_wrappers.sql、routing_dd.sql、routing_core_w

6、rappers.sql、routing_core.sql文件;數(shù)據(jù)庫(kù)還原:還原“福建地圖數(shù)據(jù)”下的所有文件;地圖配置新建工作空間和數(shù)據(jù)集2.發(fā)布地圖配置TileCacheTileCache是一個(gè)地圖瓦片緩存器,緩存目的是為了提高訪(fǎng)問(wèn)地圖的響應(yīng)速度。它是使用python開(kāi)發(fā)的一個(gè)開(kāi)源工具,因此安裝tilecache前應(yīng)先安裝python。安裝python-2.5.1.msi由于tilecache是Python寫(xiě)的一個(gè)小程序,所以首先需要安裝Python解釋器。安裝完畢后,要在環(huán)境變量的“系統(tǒng)變量”中的“Path”,在“變量值”中添加Python的安裝目錄。 安裝mod_python-3.3.1.

7、win32-py2.5-Apache2.2.exeMod_python是一個(gè)嵌入python解釋器的apache模塊。安裝過(guò)程中mod_python會(huì)自動(dòng)找到python所在目錄,且安裝時(shí)要指定正確的apache目錄。安裝完成后會(huì)在A(yíng)pache2modules目錄下自動(dòng)生成mod_python.so文件。 配置TileCache。將下載的tilecache文件解壓至系統(tǒng)盤(pán)的根目錄。修改titlecache.cgi文件,將第一行修改為 #!C:Python25python.exe u(以本機(jī)為例)。再將這個(gè)文件更名為titlecache.py。配置D:Program FilesApache So

8、ftware FoundationApache2.2conf下的httpd.conf:在下圖位置添加一行:LoadModule python_module modules/mod_python.so并創(chuàng)建名為tilecache的虛擬目錄。Alias /tilecache/ E:/ tilecache-2.10/ AddHandler mod_python .py AddHandler python-program .py PythonHandler TileCache.Service PythonOption TileCacheConfig E:/ tilecache-2.10/tilecac

9、he.cfg PythonDebug On Allow from all解壓OpenLayers-2.9.1.zip到E: tilecache-2.10下,并把文件夾名稱(chēng)重命名為OpenLayers;修改Tilecache文件夾中的index.html文件。修改內(nèi)容如下,下文中紅色標(biāo)注的應(yīng)著重注意,根據(jù)具體地圖修改。另外,可參考OpenLayers文件夾中的examples子文件夾內(nèi)的例子example.html等html文件。 配置E: tilecache-2.10的tilecache.cfg:cachetype=Diskbase=E:/ tilecache-2.10/cache(此處為ti

10、lecache中緩存的路徑)china type=WMSurl=90:8088/geoserver/wms?(注意此處端口8088為tomcat的端口)layers=china(該圖層名稱(chēng)應(yīng)與配置的地圖名稱(chēng)一致)mime_type=image/png8extension=pngsize=256,256srs=EPSG:4326metaTile=true metaSize=2,2啟動(dòng)Apache、Tomcat和Geoserver服務(wù)后,在瀏覽器中瀏覽90/tilecache/index.html,如地圖顯示正常說(shuō)明配置成功,且tilecache文件夾中的緩存文件夾cache內(nèi)會(huì)生成多級(jí)的圖片。參

11、數(shù)和路徑修改在項(xiàng)目的文件中需要修改的包括web.config中修改參數(shù), 項(xiàng)目文件Openlayers中WMSURL路徑,參考如下ST.OpenlayersConf = /GPS不同狀態(tài)對(duì)應(yīng)不同的圖標(biāo)的地址 GPSStateIconUrl: state1: ImageURL1, state2: ImageURL2 , /地圖服務(wù)地址 WMSUrl: 90:80/tilecache/tilecache.py?,(此處80為apache的端口) BaseLayerName: china, DefaultMarkIconUrl: , MarkType: VehicleMark: 0, Default

12、Mark: 1 , CenterPoint: lon: 118.58, lat: 24.90 可能問(wèn)題其他機(jī)器訪(fǎng)問(wèn)本機(jī)的地圖不成功?如果其他機(jī)器中訪(fǎng)問(wèn) HYPERLINK 90/tilecache/index.html 90/tilecache/index.html不成功,把本機(jī)的防火墻去掉試試。Apache用localhost可以訪(fǎng)問(wèn),用IP不能訪(fǎng)問(wèn)?配置過(guò)程中apache用localhost HYPERLINK http:/localhost/tilecache/index.html http:/localhost/tilecache/index.html可以訪(fǎng)問(wèn),用IP HYPERLIN

13、K 90/tilecache/index.html 90/tilecache/index.html不能訪(fǎng)問(wèn)。如果本機(jī)使用代理,把勾選起來(lái)。如果不是,試著修改apache中的httpd.conf文件,把Deny from all注釋?zhuān)⑨尫椒ㄊ窃谠摼淝懊婕由?。地圖不顯示,出現(xiàn)紅叉圖片。由于地圖在渲染中超出了等待時(shí)間的結(jié)果,刷新或重啟服務(wù)看看。tilecache中配置的WMS地址有問(wèn)題,檢查端口看看是否正確,修改前應(yīng)停掉apache和tomcat服務(wù),修改后應(yīng)重啟服務(wù)。還可能是地圖的參數(shù)問(wèn)題,如bbox、width、height等應(yīng)與geoserver中的保持一致。Tilecache配置出錯(cuò)。問(wèn)

14、題ImportError: No module named TileCache.Service tilecache時(shí)錯(cuò)誤ImportError: No module named TileCache.ServiceAlias /tilecache/ C:/tilecache/ AddHandler mod_python .py AddHandler python-program .py PythonHandler TileCache.Service PythonOption TileCacheConfig C:/tilecache/tilecache.cfg PythonDebug On Pyt

15、honPath C:/tilecache/+sys.path AllowOverride None Options Indexes FollowSymLinks Multiviews Order allow,deny Allow from all解決方法:運(yùn)行,輸入Regedit,打開(kāi)注冊(cè)表編輯器,在注冊(cè)表的HKEY_LOCAL_MACHINESOFTWAREPythonPythonCore2.5PythonPath位置下的鍵值中添加TileCache的位置C:tilecache。PostgresSQL安裝說(shuō)明:安裝步驟:如果在第十二步有選擇application,還會(huì)提示安裝你所選擇的app

16、lication。安裝即可。OK,安裝完成。配置連接PostgresSQL數(shù)據(jù)庫(kù)1、命令行模式:SQL Shell (psql)如圖:2、管理工具:pgAdmin3 如圖:打開(kāi)初始界面:pgAdmin3的主界面:添加相應(yīng)的參數(shù)以創(chuàng)建一個(gè)到PostgreSql的連接: 附錄資料:JAVA工程師EJB面試題集JAVA工程師EJB面試題集 HYPERLINK /phrase/200604241156485.html t _new EJB ( HYPERLINK /phrase/200603091138035.html t _new Enterprise JavaBean)是 HYPERLINK /p

17、hrase/200603091447335.html t _new J2EE的一部分,定義了一個(gè)用于開(kāi)發(fā)基于 HYPERLINK /phrase/200603302222545.html t _new 組件的企業(yè)多重應(yīng)用 HYPERLINK /phrase/200604232224305.html t _new 程序的標(biāo)準(zhǔn)。其特點(diǎn)包括網(wǎng)絡(luò)服務(wù)支持和核心開(kāi)發(fā)工具(SDK)。 在J2EE里,Enterprise Java Beans(EJB)稱(chēng)為Java 企業(yè)柄,是Java的核心代碼,分為整體柄和片段柄和 HYPERLINK /phrase/200603090938465.html t _new

18、消息柄三個(gè)部分,其中的消息柄將在以后再作討論。現(xiàn)在我們來(lái)看看什么是整體柄和片段柄。 整體柄是一種 HYPERLINK /phrase/200603090845215.html t _new 對(duì)象: 標(biāo)準(zhǔn)Java對(duì)象由創(chuàng)建它的程序創(chuàng)建,當(dāng)程序終止時(shí),對(duì)象也隨之丟失,這就意味著當(dāng)再次運(yùn)行些程序時(shí),將無(wú)法找到先前創(chuàng)建的柄,而整體柄會(huì)一直存在著直到它被刪除。 一個(gè)程序可以創(chuàng)建一個(gè)整體柄,并且這個(gè)程序可以在被保存后隨時(shí)停止和重啟。整體柄將會(huì)依然存在。重啟后,程序可以找到與之相對(duì)應(yīng)的整體柄,并且會(huì)繼續(xù)使用這個(gè)整體柄。 EJB實(shí)際上是SUN的J2EE中的一套規(guī)范,并且規(guī)定了一系列的 HYPERLINK /p

19、hrase/200604241228185.html t _new API用來(lái)實(shí)現(xiàn)把EJB概念轉(zhuǎn)換成EJB產(chǎn)品.EJB是BEANS,BEANS是什么概念,那就是得有一個(gè)容納她,讓她可勁造騰的地方,就是得有容器.EJB必須生存在EJB容器中.這個(gè)容器可是功能強(qiáng)大之極!她首先要包裝你BEAN,EJB的客戶(hù)程序?qū)嶋H上從來(lái)就不和你編寫(xiě)的EJB直接打交道,他們之間是通過(guò)HOME/REMOTE接口來(lái)發(fā)生關(guān)系的.它負(fù)責(zé)你的BEAN的所有的吃喝拉薩睡,比如BEAN的持續(xù)化,安全性,事務(wù)管理. 一.什么是 EJB?一個(gè)技術(shù)規(guī)范:EJB 從技術(shù)上而言不是一種產(chǎn)品EJB 是一種標(biāo)準(zhǔn)描述了構(gòu)建應(yīng)用組件要解決的:可擴(kuò)展

20、 (Scalable)分布式 (Distributed)事務(wù)處理 (Transactional)數(shù)據(jù)存儲(chǔ) (Persistent)安全性 (Secure)二.Sun 對(duì) EJB 的期望提供一個(gè)標(biāo)準(zhǔn)的分布的、基于 HYPERLINK /phrase/200604231401365.html t _new OO 的組件 HYPERLINK /phrase/200604241328115.html t _new 架構(gòu)屏蔽復(fù)雜的系統(tǒng)級(jí)功能 HYPERLINK /phrase/200603101518295.html t _new 需求Write once, run anywhere與非 Java 應(yīng)用

21、之間的互操作能力兼容 HYPERLINK /phrase/200604031336425.html t _new CORBA 標(biāo)準(zhǔn)三.為什么選擇 EJB?EJB 服務(wù)器完成繁雜的工作:應(yīng)用開(kāi)發(fā)人員關(guān)注于業(yè)務(wù)邏輯的實(shí)現(xiàn)而不是底層的實(shí)現(xiàn)機(jī)制( HYPERLINK /phrase/200603090857555.html t _new 類(lèi)似于 4GL 語(yǔ)言設(shè)計(jì)的目標(biāo))支持事務(wù)處理多個(gè)業(yè)務(wù)操作同時(shí)成功,或全部失敗可以通過(guò)在代碼外的描述來(lái)定義事務(wù)處理級(jí)別可擴(kuò)展性EJB 可以根據(jù)您應(yīng)用的增長(zhǎng)而擴(kuò)展EJB 服務(wù)器往往還提供了負(fù)載均衡和安全性:由 EJB 服務(wù)器提供資源的訪(fǎng)問(wèn)權(quán)限控制四.EJB 架構(gòu)為了滿(mǎn)足架

22、構(gòu)的目標(biāo),規(guī)范中描述了服務(wù)器 (Server)容器 (Container)類(lèi) ( HYPERLINK /phrase/200604231359565.html t _new Class) 和實(shí)例 (Instance)Home 和 Remote 接口 HYPERLINK /phrase/200603082208195.html t _new 客戶(hù)端 ( HYPERLINK /phrase/200604231337375.html t _new Client)五. 簡(jiǎn)化的編程模型關(guān)注于業(yè)務(wù)邏輯實(shí)現(xiàn):EJB 負(fù)責(zé)生命周期 (lifecycle), 數(shù)據(jù)存儲(chǔ) (persistence), 事務(wù)處理語(yǔ)義

23、 (transactional semantic), 安全(security), .通用的編程模型:各種服務(wù)的高層 APIJava 是其編程語(yǔ)言1.EJB 特點(diǎn)由一個(gè) EJB 容器在運(yùn)行時(shí)創(chuàng)建和管理 EJB在部署 EJB 時(shí)定制其運(yùn)行方式由 EJB 容器和服務(wù)器來(lái)協(xié)調(diào)客戶(hù)端的訪(fǎng)問(wèn)可以部署到任何兼容的 EJB 容器中客戶(hù)端對(duì) EJB 的 HYPERLINK /phrase/200603141659315.html t _new 視圖是由 Bean 開(kāi)發(fā)人員決定的2.EJB 服務(wù)器管理 EJB 容器 (它管理 Bean)提供對(duì) HYPERLINK /phrase/200602281634075.h

24、tml t _new 操作系統(tǒng)服務(wù)的存取提供 Java 相關(guān)的服務(wù),尤其是通過(guò) JNDI 訪(fǎng)問(wèn)命名空間基于 OTS 的事務(wù)處理服務(wù)3.EJB 容器管理 Bean 生命周期:將 EJB 服務(wù)器提供的服務(wù)傳遞給 Bean生成代碼來(lái)實(shí)現(xiàn)對(duì) Bean 的存取訪(fǎng)問(wèn)強(qiáng)制事務(wù)處理的限制創(chuàng)建、初始化和回收 Bean管理持久數(shù)據(jù)的存儲(chǔ)對(duì)客戶(hù)端而言 EJB 容器是透明的4.在一個(gè) EJB 服務(wù)器中的容器目前容器通常是由 EJB 服務(wù)器本身提供的在 EJB 1.0 或 1.1 規(guī)范中沒(méi)有定義容器-到-服務(wù)器的接口各廠(chǎng)商可以根據(jù)他們的見(jiàn)解來(lái)實(shí)現(xiàn)服務(wù)器和容器的各自責(zé)任5.容器提供服務(wù): 數(shù)據(jù)存儲(chǔ)容器決定何時(shí)載入/儲(chǔ)存狀

25、態(tài)Container-Managed Persistence(容器管理存儲(chǔ)/CMP)容器負(fù)責(zé)存儲(chǔ)您的 Bean容器生成必要的類(lèi)和代碼Bean-Managed Persistence(Bean 管理存儲(chǔ)/BMP)Bean 開(kāi)發(fā)人員提供存儲(chǔ)代碼開(kāi)發(fā)人員決定 如何存儲(chǔ), 容器仍然決定 何時(shí)進(jìn)行6.容器提供服務(wù): 事務(wù)處理可以由容器代理來(lái)實(shí)現(xiàn)容器將得到業(yè)務(wù)邏輯方法的事務(wù)處理需求容器提供事務(wù)控制代碼也可以由程序員通過(guò)代碼實(shí)現(xiàn)7.容器提供服務(wù): 其它服務(wù)其它服務(wù)包括命名 (Naming)安全 (Security) HYPERLINK /phrase/200603091754305.html t _new

26、線(xiàn)程管理 ( HYPERLINK /phrase/200604231348385.html t _new Thread management)這些服務(wù)由容器代理完成將減少應(yīng)用開(kāi)發(fā)人員的負(fù)擔(dān)8.分布式對(duì)象運(yùn)算遠(yuǎn)程對(duì)象被作為本地對(duì)象來(lái)處理:傳遞信息的方式不變,但開(kāi)銷(xiāo)更大Enterprise JavaBeans 永遠(yuǎn)運(yùn)行在服務(wù)器上:對(duì) Bean 的訪(fǎng)問(wèn)永遠(yuǎn)是遠(yuǎn)程調(diào)用9.Stub 和 Skeleton由 EJB 生成:Stub 對(duì)要傳遞出去的信息編碼Tie/Skel 將接受到的信息解碼并傳遞給目標(biāo)對(duì)象10.分類(lèi): Enterprise HYPERLINK /phrase/200604251741535

27、.html t _new JavaBeans+Entity Beans-CMP/BMPEjb-|+Session Beans-Stateful/Stateless會(huì)話(huà) Bean (Session Bean):根據(jù) EJB 規(guī)范,一個(gè)會(huì)話(huà) Bean 是:代表單個(gè)客戶(hù)端來(lái)執(zhí)行可以參與到事務(wù)處理中不直接代表共享于 HYPERLINK /phrase/200602271218062.html t _new 數(shù)據(jù)庫(kù)中的數(shù)據(jù),但它能訪(fǎng)問(wèn)和更新這些數(shù)據(jù)相對(duì)而言是短暫存在的當(dāng) EJB 容器失效后就不存在客戶(hù)端需要重新建立一個(gè)信新的會(huì)話(huà)對(duì)象來(lái)繼續(xù)運(yùn)算實(shí)體 Bean (Entity Bean):根據(jù) EJB 規(guī)范

28、,一個(gè)實(shí)體 Bean 是:提供在數(shù)據(jù)庫(kù)中數(shù)據(jù)的對(duì)象視圖允許被多個(gè)用戶(hù)共享存取訪(fǎng)問(wèn)可以是長(zhǎng)期存在 (只要它存在于數(shù)據(jù)庫(kù)中)實(shí)體 Bean, 它的主鍵對(duì)象, 以及它的遠(yuǎn)程引用將能跨 EJB 容器的宕機(jī)而存在11.EJB 類(lèi)和實(shí)例構(gòu)建 EJB 應(yīng)用包括來(lái)自三方的代碼開(kāi)發(fā)人員編寫(xiě)的代碼由 EJB API 定義的類(lèi)和接口由容器自動(dòng)生成的代碼開(kāi)發(fā)人員編寫(xiě)的代碼包括Bean 類(lèi) (定義了業(yè)務(wù)邏輯)Home 接口 (如何查找或創(chuàng)建 bean)Remote 接口 (如何存取 bean)其它組件,根據(jù) bean 實(shí)際要求12.EJB Home 接口每個(gè) bean 有一個(gè)用于:創(chuàng)建新的 bean 實(shí)例、查找現(xiàn)存的

29、bean (只能是實(shí)體 bean)Remote 接口:定義 bean 的公共接口只有在 Remote 接口中定義的方法才能被客戶(hù)端訪(fǎng)問(wèn)EJB 客戶(hù)端可以為 HYPERLINK /phrase/200603091005185.html t _new servlet, JSP, 應(yīng)用程序或其它 bean通過(guò) JNDI 來(lái)查找 EJB home 接口,步驟為:創(chuàng)建一個(gè) JNDI Context (initial context)使用 JNDI Context 來(lái)查找 bean home 接口使用 bean home 接口來(lái)創(chuàng)建/查找 bean 實(shí)例使用 bean 實(shí)例完成業(yè)務(wù)操作實(shí)際的存取 (對(duì) E

30、JB) 是通過(guò)容器生成的類(lèi)來(lái)完成EJB 架構(gòu)客戶(hù)端對(duì) bean 訪(fǎng)問(wèn)永遠(yuǎn)不是直接的EJBObject (tie) 是由容器自身提供的:用來(lái)幫助管理 bean 的生命周期EJB 中的角色EJB 服務(wù)器供應(yīng)商: 開(kāi)發(fā)并銷(xiāo)售 EJB 服務(wù)器EJB 容器供應(yīng)商: 開(kāi)發(fā)并銷(xiāo)售 EJB 容器Enterprise bean 開(kāi)發(fā)人員: 開(kāi)發(fā)并銷(xiāo)售 EJB應(yīng)用組裝人員: 將不同的 EJB 搭建成應(yīng)用六、EJB的 HYPERLINK /phrase/200603122156385.html t _new 體系結(jié)構(gòu) 目前,EJB最新的標(biāo)準(zhǔn)是2.1,EJB3.0規(guī)范正在討論中,預(yù)計(jì)將于明年推出。EJB2.1定義了三

31、種企業(yè)Bean,分別是會(huì)話(huà)Bean(Session Bean),實(shí)體Bean(Entity Bean)和消息驅(qū)動(dòng)Bean(MessageDriven Bean)。Session Bean用于實(shí)現(xiàn)業(yè)務(wù)邏輯,它可以是有狀態(tài)的,也可以是無(wú)狀態(tài)的。每當(dāng)客戶(hù)端請(qǐng)求時(shí),容器就會(huì)選擇一個(gè)Session Bean來(lái)為客戶(hù)端服務(wù)。Session Bean可以直接訪(fǎng)問(wèn)數(shù)據(jù)庫(kù),但更多時(shí)候,它會(huì)通過(guò)Entity Bean實(shí)現(xiàn)數(shù)據(jù)訪(fǎng)問(wèn)。Entity Bean是域模型對(duì)象,用于實(shí)現(xiàn)O/R映射,負(fù)責(zé)將數(shù)據(jù)庫(kù)中的表記錄映射為內(nèi)存中的Entity對(duì)象,事實(shí)上,創(chuàng)建一個(gè)Entity Bean對(duì)象相當(dāng)于新建一條記錄,刪除一個(gè)Ent

32、ity Bean會(huì)同時(shí)從數(shù)據(jù)庫(kù)中刪除對(duì)應(yīng)記錄,修改一個(gè)Entity Bean時(shí),容器會(huì)自動(dòng)將Entity Bean的狀態(tài)和數(shù)據(jù)庫(kù)同步。MessageDriven Bean是EJB2.0中引入的新的企業(yè)Bean,它基于 HYPERLINK /phrase/200604261605045.html t _new JMS消息,只能接收客戶(hù)端發(fā)送的JMS消息然后處理。MDB實(shí)際上是一個(gè)異步的無(wú)狀態(tài)Session Bean,客戶(hù)端調(diào)用MDB后無(wú)需等待,立刻返回,MDB將異步處理客戶(hù)請(qǐng)求。這適合于需要異步處理請(qǐng)求的場(chǎng)合,比如訂單處理,這樣就能避免客戶(hù)端長(zhǎng)時(shí)間的等待一個(gè)方法調(diào)用直到返回結(jié)果。調(diào)用一個(gè)EJB組

33、件要比調(diào)用一個(gè)JavaBean麻煩些,由于EJB組件可以分布在多臺(tái)服務(wù)器上,因此必須首先獲得遠(yuǎn)程或本地Home接口,然后使用Home接口創(chuàng)建EJB之后就可以調(diào)用EJB的方法了。七、EJB HYPERLINK /phrase/200603061631585.html t _new 設(shè)計(jì)模式常見(jiàn)EJB設(shè)計(jì) HYPERLINK /phrase/200603061709535.html t _new 模式 SESsion Facade HYPERLINK /phrase/200604231320535.html t _new pattern 通常項(xiàng)目中,客戶(hù)端往往需要頻繁的對(duì)服務(wù)器端數(shù)據(jù)進(jìn)行操作。當(dāng)采

34、用實(shí)體EJB作為數(shù)據(jù)的抽象層時(shí),如果直接讓客戶(hù)端程序與實(shí)體EJB交互,會(huì)產(chǎn)生實(shí)現(xiàn)一個(gè)業(yè)務(wù)需求便需要大量的EJB屬性操作(如下圖)。這直接導(dǎo)致如下問(wèn)題:網(wǎng)絡(luò)負(fù)載大(遠(yuǎn)程客戶(hù)端時(shí))、并發(fā)性能低、客戶(hù)端與服務(wù)器端關(guān)聯(lián)度大、可重用性和可維護(hù)性差、性能因此有必要在客戶(hù)端與實(shí)體EJB層間加入SessionEJB層,在Sessino EJB中實(shí)現(xiàn)商業(yè)邏輯并封裝對(duì)實(shí)體EJB的操作。(如下圖)圖:客戶(hù)端直接與實(shí)體EJB交互圖:通過(guò)SessionEJB層實(shí)現(xiàn) Session Facade模式的好處是:降低了網(wǎng)絡(luò)負(fù)載,SessionEjb可以調(diào)用實(shí)體EJB的本地接口;將商業(yè)邏輯與商業(yè)數(shù)據(jù)隔離;維護(hù)與開(kāi)發(fā)方便;顯著提

35、高性能。 Session Facade模式因其簡(jiǎn)單使用,是目前使用很廣的模式。但具體應(yīng)用過(guò)程中應(yīng)注意:避免將所有的操作封裝到一個(gè)很大的SessionEJB內(nèi);服務(wù)器端數(shù)據(jù)結(jié)構(gòu)應(yīng)由實(shí)體EJB實(shí)現(xiàn),除非特例否則避免直接的數(shù)據(jù)庫(kù)操作;SessionEjb內(nèi)某些系統(tǒng)通用操作的代碼容易重復(fù)(比如權(quán)限檢查等,解決辦法是將系統(tǒng)通用服務(wù)封裝在Java Class內(nèi))。MesSAge Facade Pattern 很多時(shí)候,一次RequeST需要操作多個(gè)EJB又不需要得到即時(shí)返回。對(duì)這種異步調(diào)用,通常應(yīng)用Message Fa?ade Pattern. 這種時(shí)候,如采用Session Fa?ade Pattern

36、存在如下問(wèn)題: 1. 客戶(hù)端等待返回的時(shí)間過(guò)長(zhǎng)。一個(gè)SessionEjb的實(shí)例在完成客戶(hù)請(qǐng)求過(guò)程中中涉及到的每一次對(duì)其他實(shí)體Ejb的調(diào)用過(guò)程中都會(huì)被鎖定直到得到實(shí)體EJB返回信息后才能進(jìn)行下一步操作。這樣造成客戶(hù)不必要的等待,并很容易因時(shí)間導(dǎo)致整個(gè)事務(wù)失敗。 2. 系統(tǒng)可靠性和容錯(cuò)性低。如果需要調(diào)用不同系統(tǒng)或服務(wù)器上或多個(gè)異構(gòu)數(shù)據(jù)源的多個(gè)EJB時(shí),任何一個(gè)環(huán)節(jié)出錯(cuò),均導(dǎo)致客戶(hù)請(qǐng)求失敗。以Message-Driven Bean為基礎(chǔ)的Message Facade Pattern則可以解決上述異步請(qǐng)求需求。具體架構(gòu)見(jiàn)下圖圖:使用Message Facade PatternMessage Facad

37、e Pattern的不足之處在于: Message-Driven Bean沒(méi)有返回值。這樣通知客戶(hù)執(zhí)行結(jié)果只能依賴(lài)于 HYPERLINK /phrase/200604230831275.html t _new AI或人工等其他手段。 Message-Driven Bean執(zhí)行過(guò)程中無(wú)法將捕獲的異常直接返回給客戶(hù)端,即無(wú)法使客戶(hù)端直接直到錯(cuò)誤信息。 Message-Driven Bean通過(guò)接收Message響應(yīng)客戶(hù)請(qǐng)求,對(duì)Message內(nèi)容的合法性(比如對(duì)象的 HYPERLINK /phrase/200603051002565.html t _new 類(lèi)型等)依賴(lài)與客戶(hù)端.容易產(chǎn)生運(yùn)行時(shí)錯(cuò)誤。

38、Message Facade Pattern經(jīng)常與Session Facade Pattern在同一個(gè)項(xiàng)目里共同使用。EJB Command Pattern Session Facade Pattern中將商業(yè)邏輯實(shí)現(xiàn)封裝在Session EJB中,這種做法帶來(lái)諸多益處之外也帶來(lái)如下問(wèn)題: 由于業(yè)務(wù)經(jīng)常的變化,導(dǎo)致經(jīng)常需要更新Session EJB代碼。 客戶(hù)端代碼不得不包含大量EJB相關(guān)的,不利于后期項(xiàng)目維護(hù)。 項(xiàng)目開(kāi)發(fā)測(cè)試需要經(jīng)常的EJB重部署過(guò)程。 引起上述問(wèn)題的重要根結(jié)就是Session EJB本身重量級(jí)組件,其開(kāi)發(fā)測(cè)試部署工作量較大,開(kāi)發(fā)周期較長(zhǎng)。以上不足可以通過(guò)EJB Comman

39、d Pattern克服。 EJB Command Pattern中將商業(yè)邏輯實(shí)現(xiàn)封裝在普通的Java ClASs(稱(chēng)之為Command Bean)中。該模式的具體實(shí)現(xiàn)有很多種,通常的 HYPERLINK /phrase/200603061723295.html t _new 框架都包括三部分: Command Bean.由應(yīng)用開(kāi)發(fā)者寫(xiě)的具體實(shí)現(xiàn)某商業(yè)操作的Java Class.主要包含getXXX(),setXXX(),exECute()方法。 Client-Side Routing Logic.由多個(gè)Class組成,用于將請(qǐng)求轉(zhuǎn)發(fā)至Command Sever,這個(gè)過(guò)程對(duì)客戶(hù)是透明的。這部分代

40、碼可以跨項(xiàng)目使用。路由規(guī)則中可以考慮用 HYPERLINK /phrase/200604231236585.html t _new XML技術(shù)。 Remote Command Server.實(shí)際執(zhí)行商業(yè)操作請(qǐng)求。通??梢杂肧ession EJB層實(shí)現(xiàn)。整個(gè)框架見(jiàn)下圖:圖:Command的基本框架 EJB Command Pattern具有如下好處: 適應(yīng)與需要快速開(kāi)發(fā)環(huán)境。因Command Bean是輕量級(jí)的Java Class,其編譯和調(diào)試比較方便。 將表現(xiàn)層與商業(yè)實(shí)現(xiàn)層隔離,同時(shí)將客戶(hù)端代碼與EJB層隔離。 將客戶(hù)端代碼開(kāi)發(fā)與服務(wù)器端代碼開(kāi)發(fā)相對(duì)清晰。早期可以創(chuàng)建空的Command Bea

41、n方便客戶(hù)端代碼調(diào)試。EJB Command Pattern的弱處在于: Command Bean中對(duì)事務(wù)的控制不如Session EJB中。 Command Bean是無(wú)狀態(tài)的。 無(wú)法將異常直接返回給客戶(hù)。 在大項(xiàng)目中,由于商業(yè)邏輯復(fù)雜,常導(dǎo)致大數(shù)量的Command Bean存在. 作為Command Server的Session EJB打包時(shí)必須包含Command Bean以致存在維護(hù)上的不便。EJB Command Pattern的一個(gè)實(shí)際實(shí)現(xiàn)可以參考IBMs Command HYPERLINK /phrase/200604241001145.html t _new framework.

42、Data Transfer HYPERLINK /phrase/200604231338435.html t _new object Factory 基于EJB的J2EE項(xiàng)目,經(jīng)常需要在客戶(hù)端與服務(wù)器端傳輸大量數(shù)據(jù)。數(shù)據(jù)的組織形式常用的是DTO(Data Transfer Object,服務(wù)器端數(shù)據(jù)對(duì)象的抽象)。但因?yàn)榭蛻?hù)端表現(xiàn)層經(jīng)常是變化的,所需要服務(wù)器端數(shù)據(jù)也變動(dòng)頻繁,換句話(huà)說(shuō),DTO的數(shù)量和屬性經(jīng)常要更改。因此如何以及在何處生成和維護(hù)DTO便是需要考慮的問(wèn)題。 一種解決方案是直接在Entity EJB中直接處理,即在Entity EJB的Bean類(lèi)中加入getXXXDTO()、setXX

43、XDTO()等。但這樣做導(dǎo)致EJB與DTO層緊緊綁定。一旦DTO更改,與該DTO相關(guān)的EJB即需要重編譯打包。EJB層與 HYPERLINK /phrase/200603101712585.html t _new 客戶(hù)端層相關(guān)聯(lián)不僅使維護(hù)困難而且導(dǎo)致EJB的重用性大大降低。 更好的解決方案是利用Data Transfer Object Factory封裝對(duì)DTO的操作邏輯(如下圖)。圖:DTO Factory示例 DTO Factory具體實(shí)現(xiàn)方式通常有兩種: 普通Java Class實(shí)現(xiàn),用于Session Facade Pattern使用DTO環(huán)境下。 Stateless Session

44、EJB實(shí)現(xiàn),用于非EJB客戶(hù)端使用DTO環(huán)境下(見(jiàn)圖)。 圖:SessionEJB實(shí)現(xiàn)DTOFactory DTO Factory帶來(lái)如下好處: 使Entity EJB的重用成為可能。由于不含DTO處理邏輯,Entity EJB功能單一化,只作為數(shù)據(jù)源。不通客戶(hù)端通過(guò)各自的DTO Factory可以從同一個(gè)Entity EJB得到各自所需的個(gè)性化數(shù)據(jù)(自定義DTO)。 提高可維護(hù)性和性能。 可以根據(jù)在DTO Factory層生成很復(fù)雜的DTO結(jié)構(gòu),諸如繼承、關(guān)聯(lián)關(guān)系等,而對(duì)客戶(hù)端提供一個(gè)透明、細(xì)化的數(shù)據(jù)接口。使用DTO Factory時(shí)需要注意的是:不需為每個(gè)Entity EJB定義一個(gè)Fac

45、tory??梢詾橐幌盗邢嚓P(guān)的Entity EJB創(chuàng)建一個(gè)Factory,或者只創(chuàng)建一個(gè)Factory。Generic Attribute Access 使用Entity EJB作為商業(yè)數(shù)據(jù)層時(shí),我們首先需要從數(shù)據(jù)庫(kù)加載數(shù)據(jù),創(chuàng)建對(duì)應(yīng)的Entity EJB實(shí)例,之后對(duì)內(nèi)存中Entity EJB實(shí)例的屬性進(jìn)行相應(yīng)操作。對(duì)屬性的操作比較直接的做法是:直接調(diào)用Entity EJB的getXXX()/setXXX(),通常利用EJB2.0的本地接口;通過(guò)DTO Factory生成DTO。但這兩種做法都存在如下問(wèn)題: 當(dāng)Entity EJB的屬性特別多時(shí)候,以上做法會(huì)帶來(lái)復(fù)雜羅嗦的代碼,使EJB變的龐大無(wú)

46、比。 使Entity EJB的客戶(hù)端(比如Session EJB)和Entity EJB的接口緊密關(guān)聯(lián)。Entity EJB屬性的增刪都需要更改客戶(hù)端代碼,給項(xiàng)目開(kāi)發(fā)和維護(hù)帶來(lái)不便。 事實(shí)上可以利用更通用的方式訪(fǎng)問(wèn)Entity EJB的屬性,即定義Generic Attribute Access Interface。見(jiàn)下圖:圖:Generic Attribute Access Interface示例 Generic Attribute Access Interface由Entity EJB的本地或遠(yuǎn)程接口實(shí)現(xiàn),并利用Hash Maps傳輸數(shù)據(jù)。實(shí)現(xiàn)方式常見(jiàn)如下: BMP類(lèi)型實(shí)體EJB可以在Be

47、an類(lèi)中定義包含所有屬性的私有成員變量HashMap。 CMP類(lèi)型實(shí)體EJB可以在Bean類(lèi)中可以適用Java Reflection API實(shí)現(xiàn)。 建立一個(gè)父類(lèi),在不同的情況下定義子類(lèi)重載父類(lèi)方法。使用Generic Attribute Access Interface需要在客戶(hù)端與服務(wù)器端對(duì)屬性以及對(duì)應(yīng)的關(guān)鍵字建立統(tǒng)一的命名習(xí)慣。常見(jiàn)的做法如下: 建立并保持良好的文檔記錄和命名約定。 在實(shí)體EJB的實(shí)現(xiàn)類(lèi)中定義靜態(tài)成員映射屬性。 創(chuàng)建共享靜態(tài)類(lèi),通過(guò)成員變量映射實(shí)體EJB屬性。 通過(guò)JNDI在服務(wù)器端保存屬性映射關(guān)系。Generic Attribute Access Interface的運(yùn)用

48、帶來(lái)一下益處: 接口實(shí)現(xiàn)后對(duì)不通實(shí)體EJB都適用。 對(duì)屬性較多實(shí)體EJB能精簡(jiǎn)代碼,并更具維護(hù)性。 使運(yùn)行中動(dòng)態(tài)增刪實(shí)體EJB屬性成為可能。Generic Attribute Access Interface的缺點(diǎn)在于: 訪(fǎng)問(wèn)EJB屬性時(shí)增加了額外的操作。需要通過(guò)關(guān)鍵字映射屬性,最后還需進(jìn)行類(lèi)型轉(zhuǎn)換。 需要建立客戶(hù)端與服務(wù)器端的命名約定。 因?yàn)橥ㄟ^(guò)HashMap操作時(shí)候需要進(jìn)行類(lèi)型轉(zhuǎn)換,容易產(chǎn)生運(yùn)行時(shí)類(lèi)型不匹配異常。Business Interface EJB規(guī)范要求Bean實(shí)現(xiàn)類(lèi)必須實(shí)現(xiàn)所有在遠(yuǎn)程(或本地)接口中定義的所有方法,同時(shí)不允許Bean實(shí)現(xiàn)類(lèi)直接繼承遠(yuǎn)程(或本地)接口。這就導(dǎo)致編譯

49、時(shí)候很容易產(chǎn)生兩者不一致的問(wèn)題,即遠(yuǎn)程(或本地)接口中定義的某方法為在Bean實(shí)現(xiàn)類(lèi)中被實(shí)現(xiàn)等錯(cuò)誤。為避免上訴錯(cuò)誤,可以利用應(yīng)用服務(wù)器廠(chǎng)商所提供的工具。但也可以應(yīng)用EJB的設(shè)計(jì)架構(gòu)來(lái)實(shí)現(xiàn):定義商業(yè)接口。Business Interface即創(chuàng)建自定義商業(yè)接口,在接口中定義所有EJB提供的商業(yè)方法,并讓Bean實(shí)現(xiàn)類(lèi)和遠(yuǎn)程(或本地)接口都實(shí)現(xiàn)該商業(yè)接口。其繼承關(guān)系見(jiàn)下圖:圖:商業(yè)接口的使用 Business Interface是個(gè)普通的Java Class。依賴(lài)于使用本地接口與遠(yuǎn)程接口的不通,Business Interface的定義略有不同:應(yīng)用與遠(yuǎn)程接口時(shí),在接口中的方法需要拋出java.

50、HYPERLINK /phrase/200604281025035.html t _new rmi.RemoteException;而應(yīng)用與本地接口時(shí)候則不需要作任何特別處理。應(yīng)用Business Interface時(shí)候必須注意一點(diǎn):EJB規(guī)范不允許直接EJB的實(shí)例將對(duì)自己的引用(this對(duì)象)返回給客戶(hù)端,否則編譯時(shí)候即報(bào)錯(cuò)。但使用Business Interface后,編譯時(shí)候無(wú)法檢查出有無(wú)將this對(duì)象返回給客戶(hù)端。這一點(diǎn)需要程序員自己保證。三 內(nèi)部數(shù)據(jù)轉(zhuǎn)換策略Data Transfer Object 基于EJB的J2EE多層架構(gòu)應(yīng)用中,經(jīng)常涉及的一個(gè)問(wèn)題就是如何在各層之間傳遞批量數(shù)據(jù),

51、比如客戶(hù)端對(duì)服務(wù)器端數(shù)據(jù)的批量讀寫(xiě)操作等。比如需要得到實(shí)體EJB的屬性,直接的方法是多次調(diào)用不通的屬性,如下圖:圖:低效的數(shù)據(jù)傳遞方式但這種方法容易導(dǎo)致許多問(wèn)題,比如性能以及代碼的復(fù)雜度等,更有效的辦法是在一個(gè)調(diào)用中得到所有需要的屬性。所以可以引入Data Transfer Object來(lái)封裝所需要的屬性,并在客戶(hù)與服務(wù)器端通過(guò)傳遞該對(duì)象一次實(shí)現(xiàn)對(duì)數(shù)據(jù)的操作。如下圖:圖:通過(guò)DTO傳遞數(shù)據(jù)DTO為普通的Java Class,通常是服務(wù)器端數(shù)據(jù)的快照。由于網(wǎng)絡(luò)傳輸?shù)男枰?,DTO應(yīng)該實(shí)現(xiàn)java.io.Serializable接口。DTO的設(shè)計(jì)有兩種模型:Domain DTO以及Custom DT

52、O。Domain DTO僅僅實(shí)現(xiàn)對(duì)服務(wù)器數(shù)據(jù)的拷貝,通常與實(shí)體EJB為一對(duì)一的關(guān)系(也存在為多個(gè)相關(guān)聯(lián)的實(shí)體EJB對(duì)應(yīng)一個(gè)Domain DTO)。Domain DTO通常除用于讀取更改實(shí)體EJB屬性外也可用于創(chuàng)建實(shí)體EJB時(shí)候。實(shí)體EJB與Domain DTO對(duì)應(yīng)關(guān)系如下圖:圖:Account EJB 與Account DomainDTO Domain DTO的應(yīng)用除了DTO所具有的一般優(yōu)點(diǎn)外,還有別的益處: 開(kāi)發(fā)迅速。因?yàn)橐坏?shí)體EJB設(shè)計(jì)好后,很容易轉(zhuǎn)換得到Domain DTO。 可以利用Domain DTO的setXXX()方法在客戶(hù)端進(jìn)行屬性有效性效驗(yàn)。Domain DTO的缺點(diǎn)有: 客戶(hù)端綁定了服務(wù)器端數(shù)據(jù)模型,不利于維護(hù)。 不夠靈活,無(wú)法處理客戶(hù)端的多樣化數(shù)據(jù)要求。對(duì)一個(gè)數(shù)百個(gè)屬性的實(shí)體EJB請(qǐng)求一個(gè)屬性時(shí)候卻返回一個(gè)包含所有屬性值的Domain DTO明顯是笨重的實(shí)現(xiàn)。 導(dǎo)致代碼的重復(fù)。 Domain DTO中如果嵌套包含了別的Domai

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
  • 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ì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論