今天一個項目要使用RMI,于是開始寫了一個小示例運行一下。
1. 寫接口繼承Remote,并給出要實現的方法
2. 寫一個方法繼承UnicastRemoteObject,并實現上面的接口
3. 寫Server,進行Naming.rebind
4. 運行rmic(在JDK的bin目錄,而不是在JDK\jre\bin目錄下)生成Stub。
這中間有一個小麻煩,舉例來說如果第2步中的類名是TestObj,放在com.test包中。
那么典型的目錄結構是WEB-INF\classes\com\test目錄下有一個TestObj.class
這時候需要在WEB-INF\classes目錄下運行命令 rmic com.test.TestObj
注意:如何運行的路徑和方式不正確的話, 會出現找不到TestObj.class的錯誤.
5. 寫Client端代碼,Naming.lookup. 然后調用遠程方法。
6. 運行start rmiregistry
7. java com.test.TestObjServer, 這時候出問題了,總是報告說找不到TestObj_Stub.class,奇怪啊,這個Class明明很安靜地躺在目錄下啊?
經過一番查找,最后目標鎖定在java的版本上,因為機器安裝了Oracle,而Oracle自帶了JDK,而且版本較低,在環境變量中調換了JDK使用的順序,重新運行命令。
成功了!
8. 生成policy.txt
9. java -Djava.security.policy=policy.txt TestObjClient
得到正確結果!
注意點:
啟動server時如果遇到找不到stub問題,原因是rmiregistry找不到stub,而不是java com.Server找不到stub,解決方法,在stub的類同一個目錄下啟動rmiregistry.
spring不重復發明輪子。Spring使你能創建一個一致的、可管理的系統應用。
Spring可以集成的框架包括:
1. 持久框架
Hibernate
JDO implementation
TopLink
Apache OJB
iBATIS
所有的集成方式是統一的。Spring使用DAO接口,都拋出DataAcessException異常。
Spring提供helpers(比如模板)實現統一的編程風格。
如果要使用SQL-BASED的數據存取,那么Spring自身的JDBC Framework是適合的。
重要的是:Spring允許你混合使用數據存取的方法---比如:Hibernate和JDBC代碼共用一個數據庫連接。這對于復雜的應用來說是非常有益的,因為使用單獨的持久框架很可能不能完成所有的持久操作。
2. Web framework
Struts
WebWork
Spring MVC
Tapestry
JSF
Spring對于Web框架的集成與持久框架的集成是不一樣的。Spring提供了自己完整的Web框架。Spring在與其他Web框架很好集成的同時,提供一些特殊的便利給自己的Web框架。比如:使用一些先進的依賴注入功能,或者應用AOP建議到Web控制中。
3. AOP Framework
Spring提供基于代理的AOP框架,這可以解決大多數J2EE應用的問題。
但是如果你需要使用一些基于代理的框架無法提供的功能,比如:用new創建對象,而且不由任何工廠管理。
為支持這種需求,Spring集成了AspectJ和AspectWerkz,2種最好的基于類交織的AOP框架。
4. Other Framework
Spring還可以和許多框架集成,Quartz Scheduler,Jasper Reporter, Velocity,FreeMaker 模板引擎。
一個統一的異常層次結構對于提供服務抽象是必需的. 最重要的就是org.springframework.dao.DataAccessException以及其子類了. 需要強調的是Spring的異常機制重點在于應用編程模型. 與SqlException和其他數據存取API不同的是: Spring的異常機制是為了讓開發者使用最少, 最清晰的代碼.
DataAccessException和其他底層異常都是非檢查性異常(unchecked exception). spring的原則之一就是基層異常就應該是非檢查性異常. 原因如下:
1. 基層異常通常來說是不可恢復的.
2. 檢查性異常將會降低異常層次結構的價值.如果底層異常是檢查性的, 那么就需要在所有地方添加catch語句進行捕獲.
3.try/catch代碼塊冗長混亂, 而且不增加多少價值.
使用檢查異常理論上很好, 但是實際上好象并不如此.
Hibernate3也將從檢查性異常轉為非檢查性異常.
1. 創建J2EE工程
2. 在windows->preference->MyEclipse正確配置Tomcat5(需要Tomcat5以上)設置
3. Deployee MyEclipse J2ee Project to server(也就是點工具欄中MyEclipse的第1個按鈕)
4. 點擊Add, 將工程部署到Tomcat中.
5. Run Appliction Server, 選擇Tomcat5
然后, 在Jsp中設置斷點, IE中瀏覽相應的網頁時, 就會跳到Debug Perpective中了, 在視圖中可以在.jsp中調試.
遇到的問題和解決:
如何Tomcat設置的JRE路徑是指到完整的JDK的bin目錄, 比如: d:\jdK1.5\bin
在Run Application Server時會遇到
" A configuration error occurred during startup. Please verify the
preference filed with the prompt: Transport dt_socket failed to
initialize, rc = 509. " 錯誤.
解決方法: 把d:\jdK1.5\jre\bin目錄下的dt_socket.dll拷貝到d:\jdK1.5\bin目錄下.
在main.jsp中加入下面的語句
<jsp:include page="footer.jsp" flush="true" />
結果main.jsp中的中文能夠正確顯示, 而footer.jsp的頁面中文亂碼.
方法:
在footer.jsp中, 添加<%@ page contentType="text/html;charset=GBK"%>這一行.
Spring這個三角形一共有三條邊
第一條邊: IoC
第二條邊: AOP
這兩條邊不需要多說了.
那么第三條邊是什么呢:
3. Service Abstraction
Spring使用service abstraction而不依賴于標準J2ee的API(比如: JNDI)或者其他的開源項目(比如Hibernate), 原因如下:
1. 是否依賴于特定的API取決于API的本身而不是起源(原文:Whether it's desirable to depend on a particular API depends more on the nature of that API than its provenance). 比如: 如果依賴于一個特定的API導致單元測試困難的話, 就應該進行抽象封裝. 典型的例子就是: JavaMail.
2. 依賴于Spring, 可以把依賴關系控制在一個比較小的范圍之內, 只與一系列接口相關. 這種依賴簡單而明確.
3. Spring的抽象接口適用范圍廣. 而如果你綁定了JTA, 那么你如果使用的是Tomcat的話, 就還需要加一個JTA的第三方實現.
4. Spring的API是面向程序開發員的, 而不是藏在幕后的. 比如JTA就是藏在EJB之后,因此JTA的異常處理就非常麻煩.
正是這三條邊組成了一個穩定的Spring三角形.