geoserver地圖配置文檔_第1頁
geoserver地圖配置文檔_第2頁
geoserver地圖配置文檔_第3頁
geoserver地圖配置文檔_第4頁
geoserver地圖配置文檔_第5頁
已閱讀5頁,還剩31頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、準備工作下載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支持,因此應預先安裝J

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

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

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

5、dmin III,在“工具”-“服務器配置”中配置 安裝pgRouting(版本應對應postgresql8.4)把“lib”文件夾下的librouting_tsp.dll、librouting_dd.dll、librouting.dll三個文件,拷貝到D:Program FilesPostgreSQL8.4lib目錄下; 在postgis數據庫的“查詢分析器”中,分別執行“sharePAGEXXX文件夾下的routing_tsp_wrappers.sql、routing_tsp.sql、routing_dd_wrappers.sql、routing_dd.sql、routing_core_w

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

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

8、ftware FoundationApache2.2conf下的httpd.conf:在下圖位置添加一行:LoadModule python_module modules/mod_python.so并創建名為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下,并把文件夾名稱重命名為OpenLayers;修改Tilecache文件夾中的index.html文件。修改內容如下,下文中紅色標注的應著重注意,根據具體地圖修改。另外,可參考OpenLayers文件夾中的examples子文件夾內的例子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(該圖層名稱應與配置的地圖名稱一致)mime_type=image/png8extension=pngsize=256,256srs=EPSG:4326metaTile=true metaSize=2,2啟動Apache、Tomcat和Geoserver服務后,在瀏覽器中瀏覽90/tilecache/index.html,如地圖顯示正常說明配置成功,且tilecache文件夾中的緩存文件夾cache內會生成多級的圖片。參

11、數和路徑修改在項目的文件中需要修改的包括web.config中修改參數, 項目文件Openlayers中WMSURL路徑,參考如下ST.OpenlayersConf = /GPS不同狀態對應不同的圖標的地址 GPSStateIconUrl: state1: ImageURL1, state2: ImageURL2 , /地圖服務地址 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 可能問題其他機器訪問本機的地圖不成功?如果其他機器中訪問 HYPERLINK 90/tilecache/index.html 90/tilecache/index.html不成功,把本機的防火墻去掉試試。Apache用localhost可以訪問,用IP不能訪問?配置過程中apache用localhost HYPERLINK http:/localhost/tilecache/index.html http:/localhost/tilecache/index.html可以訪問,用IP HYPERLIN

13、K 90/tilecache/index.html 90/tilecache/index.html不能訪問。如果本機使用代理,把勾選起來。如果不是,試著修改apache中的httpd.conf文件,把Deny from all注釋,注釋方法是在該句前面加上#。地圖不顯示,出現紅叉圖片。由于地圖在渲染中超出了等待時間的結果,刷新或重啟服務看看。tilecache中配置的WMS地址有問題,檢查端口看看是否正確,修改前應停掉apache和tomcat服務,修改后應重啟服務。還可能是地圖的參數問題,如bbox、width、height等應與geoserver中的保持一致。Tilecache配置出錯。問

14、題ImportError: No module named TileCache.Service tilecache時錯誤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解決方法:運行,輸入Regedit,打開注冊表編輯器,在注冊表的HKEY_LOCAL_MACHINESOFTWAREPythonPythonCore2.5PythonPath位置下的鍵值中添加TileCache的位置C:tilecache。PostgresSQL安裝說明:安裝步驟:如果在第十二步有選擇application,還會提示安裝你所選擇的app

16、lication。安裝即可。OK,安裝完成。配置連接PostgresSQL數據庫1、命令行模式:SQL Shell (psql)如圖:2、管理工具:pgAdmin3 如圖:打開初始界面:pgAdmin3的主界面:添加相應的參數以創建一個到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的一部分,定義了一個用于開發基于 HYPERLINK /phrase/200603302222545.html t _new 組件的企業多重應用 HYPERLINK /phrase/200604232224305.html t _new 程序的標準。其特點包括網絡服務支持和核心開發工具(SDK)。 在J2EE里,Enterprise Java Beans(EJB)稱為Java 企業柄,是Java的核心代碼,分為整體柄和片段柄和 HYPERLINK /phrase/200603090938465.html t _new

18、消息柄三個部分,其中的消息柄將在以后再作討論?,F在我們來看看什么是整體柄和片段柄。 整體柄是一種 HYPERLINK /phrase/200603090845215.html t _new 對象: 標準Java對象由創建它的程序創建,當程序終止時,對象也隨之丟失,這就意味著當再次運行些程序時,將無法找到先前創建的柄,而整體柄會一直存在著直到它被刪除。 一個程序可以創建一個整體柄,并且這個程序可以在被保存后隨時停止和重啟。整體柄將會依然存在。重啟后,程序可以找到與之相對應的整體柄,并且會繼續使用這個整體柄。 EJB實際上是SUN的J2EE中的一套規范,并且規定了一系列的 HYPERLINK /p

19、hrase/200604241228185.html t _new API用來實現把EJB概念轉換成EJB產品.EJB是BEANS,BEANS是什么概念,那就是得有一個容納她,讓她可勁造騰的地方,就是得有容器.EJB必須生存在EJB容器中.這個容器可是功能強大之極!她首先要包裝你BEAN,EJB的客戶程序實際上從來就不和你編寫的EJB直接打交道,他們之間是通過HOME/REMOTE接口來發生關系的.它負責你的BEAN的所有的吃喝拉薩睡,比如BEAN的持續化,安全性,事務管理. 一.什么是 EJB?一個技術規范:EJB 從技術上而言不是一種產品EJB 是一種標準描述了構建應用組件要解決的:可擴展

20、 (Scalable)分布式 (Distributed)事務處理 (Transactional)數據存儲 (Persistent)安全性 (Secure)二.Sun 對 EJB 的期望提供一個標準的分布的、基于 HYPERLINK /phrase/200604231401365.html t _new OO 的組件 HYPERLINK /phrase/200604241328115.html t _new 架構屏蔽復雜的系統級功能 HYPERLINK /phrase/200603101518295.html t _new 需求Write once, run anywhere與非 Java 應用

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

22、構的目標,規范中描述了服務器 (Server)容器 (Container)類 ( HYPERLINK /phrase/200604231359565.html t _new Class) 和實例 (Instance)Home 和 Remote 接口 HYPERLINK /phrase/200603082208195.html t _new 客戶端 ( HYPERLINK /phrase/200604231337375.html t _new Client)五. 簡化的編程模型關注于業務邏輯實現:EJB 負責生命周期 (lifecycle), 數據存儲 (persistence), 事務處理語義

23、 (transactional semantic), 安全(security), .通用的編程模型:各種服務的高層 APIJava 是其編程語言1.EJB 特點由一個 EJB 容器在運行時創建和管理 EJB在部署 EJB 時定制其運行方式由 EJB 容器和服務器來協調客戶端的訪問可以部署到任何兼容的 EJB 容器中客戶端對 EJB 的 HYPERLINK /phrase/200603141659315.html t _new 視圖是由 Bean 開發人員決定的2.EJB 服務器管理 EJB 容器 (它管理 Bean)提供對 HYPERLINK /phrase/200602281634075.h

24、tml t _new 操作系統服務的存取提供 Java 相關的服務,尤其是通過 JNDI 訪問命名空間基于 OTS 的事務處理服務3.EJB 容器管理 Bean 生命周期:將 EJB 服務器提供的服務傳遞給 Bean生成代碼來實現對 Bean 的存取訪問強制事務處理的限制創建、初始化和回收 Bean管理持久數據的存儲對客戶端而言 EJB 容器是透明的4.在一個 EJB 服務器中的容器目前容器通常是由 EJB 服務器本身提供的在 EJB 1.0 或 1.1 規范中沒有定義容器-到-服務器的接口各廠商可以根據他們的見解來實現服務器和容器的各自責任5.容器提供服務: 數據存儲容器決定何時載入/儲存狀

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

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

27、.html t _new JavaBeans+Entity Beans-CMP/BMPEjb-|+Session Beans-Stateful/Stateless會話 Bean (Session Bean):根據 EJB 規范,一個會話 Bean 是:代表單個客戶端來執行可以參與到事務處理中不直接代表共享于 HYPERLINK /phrase/200602271218062.html t _new 數據庫中的數據,但它能訪問和更新這些數據相對而言是短暫存在的當 EJB 容器失效后就不存在客戶端需要重新建立一個信新的會話對象來繼續運算實體 Bean (Entity Bean):根據 EJB 規范

28、,一個實體 Bean 是:提供在數據庫中數據的對象視圖允許被多個用戶共享存取訪問可以是長期存在 (只要它存在于數據庫中)實體 Bean, 它的主鍵對象, 以及它的遠程引用將能跨 EJB 容器的宕機而存在11.EJB 類和實例構建 EJB 應用包括來自三方的代碼開發人員編寫的代碼由 EJB API 定義的類和接口由容器自動生成的代碼開發人員編寫的代碼包括Bean 類 (定義了業務邏輯)Home 接口 (如何查找或創建 bean)Remote 接口 (如何存取 bean)其它組件,根據 bean 實際要求12.EJB Home 接口每個 bean 有一個用于:創建新的 bean 實例、查找現存的

29、bean (只能是實體 bean)Remote 接口:定義 bean 的公共接口只有在 Remote 接口中定義的方法才能被客戶端訪問EJB 客戶端可以為 HYPERLINK /phrase/200603091005185.html t _new servlet, JSP, 應用程序或其它 bean通過 JNDI 來查找 EJB home 接口,步驟為:創建一個 JNDI Context (initial context)使用 JNDI Context 來查找 bean home 接口使用 bean home 接口來創建/查找 bean 實例使用 bean 實例完成業務操作實際的存取 (對 E

30、JB) 是通過容器生成的類來完成EJB 架構客戶端對 bean 訪問永遠不是直接的EJBObject (tie) 是由容器自身提供的:用來幫助管理 bean 的生命周期EJB 中的角色EJB 服務器供應商: 開發并銷售 EJB 服務器EJB 容器供應商: 開發并銷售 EJB 容器Enterprise bean 開發人員: 開發并銷售 EJB應用組裝人員: 將不同的 EJB 搭建成應用六、EJB的 HYPERLINK /phrase/200603122156385.html t _new 體系結構 目前,EJB最新的標準是2.1,EJB3.0規范正在討論中,預計將于明年推出。EJB2.1定義了三

31、種企業Bean,分別是會話Bean(Session Bean),實體Bean(Entity Bean)和消息驅動Bean(MessageDriven Bean)。Session Bean用于實現業務邏輯,它可以是有狀態的,也可以是無狀態的。每當客戶端請求時,容器就會選擇一個Session Bean來為客戶端服務。Session Bean可以直接訪問數據庫,但更多時候,它會通過Entity Bean實現數據訪問。Entity Bean是域模型對象,用于實現O/R映射,負責將數據庫中的表記錄映射為內存中的Entity對象,事實上,創建一個Entity Bean對象相當于新建一條記錄,刪除一個Ent

32、ity Bean會同時從數據庫中刪除對應記錄,修改一個Entity Bean時,容器會自動將Entity Bean的狀態和數據庫同步。MessageDriven Bean是EJB2.0中引入的新的企業Bean,它基于 HYPERLINK /phrase/200604261605045.html t _new JMS消息,只能接收客戶端發送的JMS消息然后處理。MDB實際上是一個異步的無狀態Session Bean,客戶端調用MDB后無需等待,立刻返回,MDB將異步處理客戶請求。這適合于需要異步處理請求的場合,比如訂單處理,這樣就能避免客戶端長時間的等待一個方法調用直到返回結果。調用一個EJB組

33、件要比調用一個JavaBean麻煩些,由于EJB組件可以分布在多臺服務器上,因此必須首先獲得遠程或本地Home接口,然后使用Home接口創建EJB之后就可以調用EJB的方法了。七、EJB HYPERLINK /phrase/200603061631585.html t _new 設計模式常見EJB設計 HYPERLINK /phrase/200603061709535.html t _new 模式 SESsion Facade HYPERLINK /phrase/200604231320535.html t _new pattern 通常項目中,客戶端往往需要頻繁的對服務器端數據進行操作。當采

34、用實體EJB作為數據的抽象層時,如果直接讓客戶端程序與實體EJB交互,會產生實現一個業務需求便需要大量的EJB屬性操作(如下圖)。這直接導致如下問題:網絡負載大(遠程客戶端時)、并發性能低、客戶端與服務器端關聯度大、可重用性和可維護性差、性能因此有必要在客戶端與實體EJB層間加入SessionEJB層,在Sessino EJB中實現商業邏輯并封裝對實體EJB的操作。(如下圖)圖:客戶端直接與實體EJB交互圖:通過SessionEJB層實現 Session Facade模式的好處是:降低了網絡負載,SessionEjb可以調用實體EJB的本地接口;將商業邏輯與商業數據隔離;維護與開發方便;顯著提

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

36、存在如下問題: 1. 客戶端等待返回的時間過長。一個SessionEjb的實例在完成客戶請求過程中中涉及到的每一次對其他實體Ejb的調用過程中都會被鎖定直到得到實體EJB返回信息后才能進行下一步操作。這樣造成客戶不必要的等待,并很容易因時間導致整個事務失敗。 2. 系統可靠性和容錯性低。如果需要調用不同系統或服務器上或多個異構數據源的多個EJB時,任何一個環節出錯,均導致客戶請求失敗。以Message-Driven Bean為基礎的Message Facade Pattern則可以解決上述異步請求需求。具體架構見下圖圖:使用Message Facade PatternMessage Facad

37、e Pattern的不足之處在于: Message-Driven Bean沒有返回值。這樣通知客戶執行結果只能依賴于 HYPERLINK /phrase/200604230831275.html t _new AI或人工等其他手段。 Message-Driven Bean執行過程中無法將捕獲的異常直接返回給客戶端,即無法使客戶端直接直到錯誤信息。 Message-Driven Bean通過接收Message響應客戶請求,對Message內容的合法性(比如對象的 HYPERLINK /phrase/200603051002565.html t _new 類型等)依賴與客戶端.容易產生運行時錯誤。

38、Message Facade Pattern經常與Session Facade Pattern在同一個項目里共同使用。EJB Command Pattern Session Facade Pattern中將商業邏輯實現封裝在Session EJB中,這種做法帶來諸多益處之外也帶來如下問題: 由于業務經常的變化,導致經常需要更新Session EJB代碼。 客戶端代碼不得不包含大量EJB相關的,不利于后期項目維護。 項目開發測試需要經常的EJB重部署過程。 引起上述問題的重要根結就是Session EJB本身重量級組件,其開發測試部署工作量較大,開發周期較長。以上不足可以通過EJB Comman

39、d Pattern克服。 EJB Command Pattern中將商業邏輯實現封裝在普通的Java ClASs(稱之為Command Bean)中。該模式的具體實現有很多種,通常的 HYPERLINK /phrase/200603061723295.html t _new 框架都包括三部分: Command Bean.由應用開發者寫的具體實現某商業操作的Java Class.主要包含getXXX(),setXXX(),exECute()方法。 Client-Side Routing Logic.由多個Class組成,用于將請求轉發至Command Sever,這個過程對客戶是透明的。這部分代

40、碼可以跨項目使用。路由規則中可以考慮用 HYPERLINK /phrase/200604231236585.html t _new XML技術。 Remote Command Server.實際執行商業操作請求。通??梢杂肧ession EJB層實現。整個框架見下圖:圖:Command的基本框架 EJB Command Pattern具有如下好處: 適應與需要快速開發環境。因Command Bean是輕量級的Java Class,其編譯和調試比較方便。 將表現層與商業實現層隔離,同時將客戶端代碼與EJB層隔離。 將客戶端代碼開發與服務器端代碼開發相對清晰。早期可以創建空的Command Bea

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

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

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

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

45、tory。可以為一系列相關的Entity EJB創建一個Factory,或者只創建一個Factory。Generic Attribute Access 使用Entity EJB作為商業數據層時,我們首先需要從數據庫加載數據,創建對應的Entity EJB實例,之后對內存中Entity EJB實例的屬性進行相應操作。對屬性的操作比較直接的做法是:直接調用Entity EJB的getXXX()/setXXX(),通常利用EJB2.0的本地接口;通過DTO Factory生成DTO。但這兩種做法都存在如下問題: 當Entity EJB的屬性特別多時候,以上做法會帶來復雜羅嗦的代碼,使EJB變的龐大無

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

47、an類中定義包含所有屬性的私有成員變量HashMap。 CMP類型實體EJB可以在Bean類中可以適用Java Reflection API實現。 建立一個父類,在不同的情況下定義子類重載父類方法。使用Generic Attribute Access Interface需要在客戶端與服務器端對屬性以及對應的關鍵字建立統一的命名習慣。常見的做法如下: 建立并保持良好的文檔記錄和命名約定。 在實體EJB的實現類中定義靜態成員映射屬性。 創建共享靜態類,通過成員變量映射實體EJB屬性。 通過JNDI在服務器端保存屬性映射關系。Generic Attribute Access Interface的運用

48、帶來一下益處: 接口實現后對不通實體EJB都適用。 對屬性較多實體EJB能精簡代碼,并更具維護性。 使運行中動態增刪實體EJB屬性成為可能。Generic Attribute Access Interface的缺點在于: 訪問EJB屬性時增加了額外的操作。需要通過關鍵字映射屬性,最后還需進行類型轉換。 需要建立客戶端與服務器端的命名約定。 因為通過HashMap操作時候需要進行類型轉換,容易產生運行時類型不匹配異常。Business Interface EJB規范要求Bean實現類必須實現所有在遠程(或本地)接口中定義的所有方法,同時不允許Bean實現類直接繼承遠程(或本地)接口。這就導致編譯

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

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

51、比如客戶端對服務器端數據的批量讀寫操作等。比如需要得到實體EJB的屬性,直接的方法是多次調用不通的屬性,如下圖:圖:低效的數據傳遞方式但這種方法容易導致許多問題,比如性能以及代碼的復雜度等,更有效的辦法是在一個調用中得到所有需要的屬性。所以可以引入Data Transfer Object來封裝所需要的屬性,并在客戶與服務器端通過傳遞該對象一次實現對數據的操作。如下圖:圖:通過DTO傳遞數據DTO為普通的Java Class,通常是服務器端數據的快照。由于網絡傳輸的需要,DTO應該實現java.io.Serializable接口。DTO的設計有兩種模型:Domain DTO以及Custom DT

52、O。Domain DTO僅僅實現對服務器數據的拷貝,通常與實體EJB為一對一的關系(也存在為多個相關聯的實體EJB對應一個Domain DTO)。Domain DTO通常除用于讀取更改實體EJB屬性外也可用于創建實體EJB時候。實體EJB與Domain DTO對應關系如下圖:圖:Account EJB 與Account DomainDTO Domain DTO的應用除了DTO所具有的一般優點外,還有別的益處: 開發迅速。因為一旦實體EJB設計好后,很容易轉換得到Domain DTO。 可以利用Domain DTO的setXXX()方法在客戶端進行屬性有效性效驗。Domain DTO的缺點有: 客戶端綁定了服務器端數據模型,不利于維護。 不夠靈活,無法處理客戶端的多樣化數據要求。對一個數百個屬性的實體EJB請求一個屬性時候卻返回一個包含所有屬性值的Domain DTO明顯是笨重的實現。 導致代碼的重復。 Domain DTO中如果嵌套包含了別的Domai

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論