摘要: JpetStore提供了一個整套的測試代碼對于想進行單元測試卻不知道如何進行單元測試的人(me)來說,是一個很好的學習機會。
JpetStore的單元測試代碼與它的系統源文件是獨立分離的,在test文件夾中。打開文件夾可以很清楚的發現該文件夾的內容組成結構與源文件基本一致。
JpetStore分為領域層(domain),持久層(peristence),服務層(service),表現層(presentation),它的測試也分這幾個層來進行。
閱讀全文
posted @
2007-01-22 15:18 滌生 閱讀(3333) |
評論 (0) |
編輯 收藏
摘要: 本文是在參閱了http://ivanl.javaeye.com/blog/24739基礎上完成的
在看JPetStore的代碼時,發現它的分頁處理主要是通過返回PaginatedList對象來完成的。如:在CatalogService類中
public PaginatedList getProductListByCategory(String categoryId) {
return productDao.getProductListByCategory(categoryId);
}
分頁是操作數據庫型系統常遇到的問題。分頁實現方法很多,但效率的差異就很大了。iBatis是通過什么方式來實現這個分頁的了。查看它的實現部分:
閱讀全文
posted @
2007-01-18 16:27 滌生 閱讀(8459) |
評論 (6) |
編輯 收藏
關鍵字: OO ? UML,泛化,依賴,關聯,聚合????
類與類之間的關系對于理解面向對象具有很重要的作用,以前在面試的時候也經常被問到這個問題,在這里我就介紹一下。 類與類之間存在以下關系: (1)泛化(Generalization) (2)關聯(Association) (3)依賴(Dependency) (4)聚合(Aggregation)
UML圖與應用代碼例子:
1.泛化(Generalization)
[泛化]
表示類與類之間的繼承關系,接口與接口之間的繼承關系,或類對接口的實現關系。一般化的關系是從子類指向父類的,與繼承或實現的方法相反。 [具體表現] 父類 父類實例=new 子類() [UML圖](圖1.1)
 圖1.1Animal類與Tiger類,Dog類的泛化關系
[代碼表現]
-
class
?Animal{} ??
-
class
?Tiger?
extends
?Animal{} ??
-
public
?
class
?Test ??
-
{ ??
-
????
public
?
void
?test() ??
-
????{ ??
-
????????Animal?a=
new
?Tiger(); ??
-
????} ??
-
}??
2.依賴(Dependency)
[依賴]
對于兩個相對獨立的對象,當一個對象負責構造另一個對象的實例,或者依賴另一個對象的服務時,這兩個對象之間主要體現為依賴關系。 [具體表現] 依賴關系表現在局部變量,方法的參數,以及對靜態方法的調用 [現實例子] 比如說你要去擰螺絲,你是不是要借助(也就是依賴)螺絲刀(Screwdriver)來幫助你完成擰螺絲(screw)的工作 [UML表現](圖1.2)

圖1.2 Person類與Screwdriver類的依賴關系
[代碼表現]
- public?class?Person{ ??
- ??????
- ????public?void?screw(Screwdriver?screwdriver){ ??
- ????????screwdriver.screw(); ??
- ????} ??
- }??
3.關聯(Association) [關聯] 對于兩個相對獨立的對象,當一個對象的實例與另一個對象的一些特定實例存在固定的對應關系時,這兩個對象之間為關聯關系。 [具體表現] 關聯關系是使用實例變量來實現 [現實例子] 比如客戶和訂單,每個訂單對應特定的客戶,每個客戶對應一些特定的訂單;再例如公司和員工,每個公司對應一些特定的員工,每個員工對應一特定的公司 [UML圖] (圖1.3)
 圖1.3 公司和員工的關聯關系
[代碼表現]
- public?class?Company{ ??
- ????private?Employee?employee; ??
- ????public?Employee?getEmployee(){ ??
- ????????return?employee; ??
- ????} ??
- ????public?void?setEmployee(Employee?employee){ ??
- ????????this.employee=employee; ??
- ????} ??
- ??????
- ????public?void?run(){ ??
- ????????employee.startWorking(); ??
- ????} ??
- }??
(4)聚合(Aggregation)
[聚合]
當對象A被加入到對象B中,成為對象B的組成部分時,對象B和對象A之間為聚集關系。聚合是關聯關系的一種,是較強的關聯關系,強調的是整體與部分之間的關系。 [具體表現] 與關聯關系一樣,聚合關系也是通過實例變量來實現這樣關系的。關聯關系和聚合關系來語法上是沒辦法區分的,從語義上才能更好的區分兩者的區別。 [關聯與聚合的區別] (1)關聯關系所涉及的兩個對象是處在同一個層次上的。比如人和自行車就是一種關聯關系,而不是聚合關系,因為人不是由自行車組成的。 聚合關系涉及的兩個對象處于不平等的層次上,一個代表整體,一個代表部分。比如電腦和它的顯示器、鍵盤、主板以及內存就是聚集關系,因為主板是電腦的組成部分。 (2)對于具有聚集關系(尤其是強聚集關系)的兩個對象,整體對象會制約它的組成對象的生命周期。部分類的對象不能單獨存在,它的生命周期依賴于整體類的對象的生命周期,當整體消失,部分也就隨之消失。比如張三的電腦被偷了,那么電腦的所有組件也不存在了,除非張三事先把一些電腦的組件(比如硬盤和內存)拆了下來。 [UML圖](圖1.4)
 圖1.3 電腦和組件的聚合關系
[代碼表現]
- public?class?Computer{ ??
- ????private?CPU?cpu; ??
- ????public?CPU?getCPU(){ ??
- ????????return?cpu; ??
- ????} ??
- ????public?void?setCPU(CPU?cpu){ ??
- ????????this.cpu=cpu; ??
- ????} ??
- ??????
- ????public?void?start(){ ??
- ??????????
- ????????cpu.run(); ??
- ????} ??
- }??
|
posted @
2007-01-17 10:07 滌生 閱讀(575) |
評論 (0) |
編輯 收藏
摘要: 本文參考了
iBatis DAO入門與進階(http://www.matrix.org.cn/resource/article/44/44058_iBatis+DAO.html)
iBatis DAO事務探索(http://www.tkk7.com/RongHao/archive/2006/01/20/28817.html)
今天繼續研究了JPetStore的持久層,其中由于看了一篇文章的誤導,導致我對其中的事務處理深表懷疑。通過閱讀源代碼與看上面兩篇文章,對這個問題才認識清楚。和我當初預想的一致。
閱讀全文
posted @
2007-01-16 21:15 滌生 閱讀(2804) |
評論 (2) |
編輯 收藏
摘要: 問題就出現在這,Item類中包含了Product類,出現NestedSqlException錯誤。
查閱了ibatis幫助,此處sql_map的嵌套類寫法是正確的。我又將這個sql語句拷貝到MsSqlServer中執行,結果也是正確的。陷入困惑。
閱讀全文
posted @
2007-01-16 13:38 滌生 閱讀(3364) |
評論 (6) |
編輯 收藏
今天在看JPetStore代碼時,對他的鏈接中的請求參數感到疑惑,最后發現是自己的對Struts框架不熟悉導致的。
我是從Net陣營中剛轉入Java里的,在Net中對請求參數的名稱無特殊限制,只要在頁面中取參數的值即可。當然這個功能在Java中也具備。即request.Getparameter()
今天我在看JpetStore代碼時,在點擊
http://127.0.0.1:8083/JPetStore/shop/viewCategory.shtml?categoryId=BIRDS時,當跟蹤函數viewCategory時發現此時categoryID已經賦值了,我卻找不到在什么地方賦值的,好是花費了一番周執。
查看此段鏈接對應的struts.xml

????<action?path="/shop/viewCategory"?type="org.apache.struts.beanaction.BeanAction"
????????????name="catalogBean"?scope="session"
????????????validate="false">
??????<forward?name="success"?path="/catalog/Category.jsp"/>我首先跟蹤BeanAction的excute函數發現在此之前就已經賦值,說明和BeanAction無關,是Struts系統本身的結構。我故意將鏈接修改,修改成
http://127.0.0.1:8083/JPetStore/shop/viewCategory.shtml?category=BIRDS此時出現錯誤,錯誤如下:
java.lang.IllegalArgumentException:?Cannot?invoke?com.ibatis.jpetstore.presentation.CatalogBean.setCategory?-?argument?type?mismatch
????org.apache.commons.beanutils.PropertyUtilsBean.invokeMethod(PropertyUtilsBean.java:1778)
????org.apache.commons.beanutils.PropertyUtilsBean.setSimpleProperty(PropertyUtilsBean.java:1759)
????org.apache.commons.beanutils.PropertyUtilsBean.setNestedProperty(PropertyUtilsBean.java:1648)
????org.apache.commons.beanutils.PropertyUtilsBean.setProperty(PropertyUtilsBean.java:1677)
????org.apache.commons.beanutils.BeanUtilsBean.setProperty(BeanUtilsBean.java:1022)
????org.apache.commons.beanutils.BeanUtilsBean.populate(BeanUtilsBean.java:811)
????org.apache.commons.beanutils.BeanUtils.populate(BeanUtils.java:298)
????org.apache.struts.util.RequestUtils.populate(RequestUtils.java:493)
????org.apache.struts.action.RequestProcessor.processPopulate(RequestProcessor.java:805)
????org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:203)
????org.apache.struts.action.ActionServlet.process(ActionServlet.java:1194)
????org.apache.struts.action.ActionServlet.doGet(ActionServlet.java:414)
????javax.servlet.http.HttpServlet.service(HttpServlet.java:689)
????javax.servlet.http.HttpServlet.service(HttpServlet.java:802)

根據這個錯誤堆棧可知,它實際上采用的是反射,setProperty,此時找不到category的Setter函數報錯。然后我查看了一下RequestProcessor的默認實現代碼
//?Process?any?ActionForm?bean?related?to?this?request
ActionForm?form?=?processActionForm(request,?response,?mapping);
processPopulate(request,?response,?form,?mapping);這段函數功能為:
1)調用processActionForm( )方法檢查是否存在為ActionMapping配置的ActionForm 。如果存在,則在有效區
域內查找是否存在該ActionForm 的實例,存在,則復用,不存在,則創建一個實例。然后將實例保存與再配置
文件中配置好的有效區域(request,session,application)內,并用Action元素的name屬性作為該實例的關鍵字。
2)調用processPopulate( )方法,如果存來存在為ActionMapping配置的ActionForm,則封裝請求對象中的數據
到ActionForm 中,在進行封裝之前,先調用ActionForm 的reset( )方法進行屬性值的默認化。
根據以上的分析,可得知,在調用鏈接前struts框架會自動的將所有的請求參數封裝入指定的formbean中。所以請求參數的名稱應該是對應formbean的一個屬性。
這就是struts中請求參數的處理過程。主要是我對struts還沒有完全掌握,加上Net的影響,才花費了一圈發現這個原因。
posted @
2007-01-15 20:56 滌生 閱讀(969) |
評論 (0) |
編輯 收藏
對初接觸者來說,到底如何開始使用abator,資源比較少,本文記載了我今日初次使用的過程,希望對和我一樣的初學者有所幫助
獲得
????? http://ibatis.apache.org/abator.html
???? Eclipse可以自動的進行Update獲取此Plugin,官方的安裝步驟
Automatic Eclipse Install
If you've already installed a prior version of Abator, simply run the Eclipse Install/Update tool and the new version will be found automatically.
If you've not already installed Abator, then you can use the built in Eclipse install support by following these steps:
- Take the "Help>Software Updates>Find and Install" Menu Option
- Select the "Search for new features to install" radio button, press "Next"
- Press the "New Remote Site" button
- Enter the following information:
- Name:
- Abator for Eclipse Update Site
- URL:
- http://ibatis.apache.org/tools/abator
- Press OK
- Check the box next to "Abator for Eclipse Update Site"
- Follow the remainder of the install wizard
2、安裝好后將在New菜單中看到一個新的文件類型Abator for iBATIS Configuration File,此是Abator的配置文件,配置文件的詳細說明見http://ibatis.apache.org/docs/tools/abator/
3、新建一個配置文件,進行修改,根據自己的實際需求進行修改
關鍵點:
1)jdbcconnection,按照一般的配置即可,需要說明的是它需要指定訪問JdbcDriver的classPathEntry,對于MsSqlServer而言,要將這三個jar文件均包含在內,否則會出現jdbc訪問錯誤。
2)配置三個Pakage
3)配置表,此處需說明的是對于MsSqlServer不能寫TableSchema,我初次指定TableSchema,結果未找到對應的表
簡單的配置如下,復雜的見配置文件的詳細說明。示例配置文件如下
<abatorConfiguration>
? <abatorContext>??? <!-- TODO: Add Database Connection Information -->
??? <jdbcConnection driverClass="com.microsoft.jdbc.sqlserver.SQLServerDriver"
??????? connectionURL="jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=whm;SelectMethod=cursor"
??????? userId="sa"
??????? password="sa">
????? <classPathEntry location="C:/Program Files/Apache Software Foundation/Tomcat 5.0/common/lib/mssqlserver.jar" />
????? <classPathEntry location="C:/Program Files/Apache Software Foundation/Tomcat 5.0/common/lib/msutil.jar" />
????? <classPathEntry location="C:/Program Files/Apache Software Foundation/Tomcat 5.0/common/lib/msbase.jar" />
??? </jdbcConnection>
??? <javaModelGenerator targetPackage="com.dwerp.itatis.domain" targetProject="BhbManage" />
??? <sqlMapGenerator targetPackage="com.dwerp.itatis.persistence.xml" targetProject="BhbManage" />
??? <daoGenerator type="IBATIS" targetPackage="com.dwerp.itatis.persistence.sqlmapdao" targetProject="BhbManage" />
??? <table tableName="BHBGL">
????
??? </table>
? </abatorContext>
</abatorConfiguration>
4、右鍵單擊配置文件,點擊Generate iBatis Artifacts,生成文件。
?
posted @
2007-01-11 21:37 滌生 閱讀(2012) |
評論 (1) |
編輯 收藏
學習的最好方法莫過于研究示例程序。本文是鄙人今日在Eclipse中運行iBATIS的JpetStore的記錄,供同仁參考
1、下載iBAITS(
http://ibatis.apache.org/javadownloads.cgi)
2、下載JPetStore-5.0(
http://ibatis.apache.org/javadownloads.cgi)
準備工作完成,下面開始將示例程序轉移到Eclipse中
1、在Eclipse中新建一個空的WebProject,如:JPetStore
2、將下載的JPetStore-5.0文件夾的內容拷貝至JPetStore,其中由于Eclipse默認的Web文件夾是WebRoot所以JPetStore-5.0中的Web文件單獨拷貝到新建的Project的Web文件夾WebRoot下。簡單的是說,就是要保證空的WebProject中的所擁有文件模型不動,將下載的內容拷貝到相應的文件夾下
3、刷新Eclipse,此時會看到src下顯示為錯誤,錯誤的原因是此時對應的包未引入,由于Eclipse默認的是WebRoot/lib下的包文件,所以將主目錄下即JPetStore/devlib與JPetStore/lib引入到項目中
有兩種方法:直接將此兩個文件夾下的內容直接拷貝到JPetStore/WebRoot/lib下,或者,通過Import命令引入
4、至此就已經完成項目遷移工作,下面就是
1)建數據庫,鄙人用的是MsSqlServer,在JPetStore/src/ddl中有各種數據庫的sql文件
2)修改iBATIS的database.propertis,見上篇拙作
3)在Eclipse通過Tomcat部署
即可看到PetShop的網站了
http://127.0.0.1:8083/JPetStore希望對和我一樣的初學者有所幫助
posted @
2007-01-11 21:22 滌生 閱讀(4280) |
評論 (4) |
編輯 收藏
希望此文能對初次使用ibatis訪問MsSqlserver的朋友起個借鑒
1、在http://ibatis.apache.org/javadownloads.cgi下載ibatis,我下載的是2.2.0,由于還沒有看Spring,所以下載此版本,帶 iBATIS DAO 框架。以后版本都不再含有此框架。見網站說明:
Note: iBATIS 2.2.0 is the last release that includes the iBATIS DAO framework. After 2.2.0, the DAO iBATIS framework is removed from the downloads. We suggest converting iBATIS framework DAOs to the Spring Framework.
2、下載后將lib文件夾下的三個jar文件加入機器的Classpath中
此時,iBATIS 的框架已經搭建好
下面介紹一下如何訪問MsSqlServer。
1、機器已經下載了Jdbc for MSsqlServer的jar文件,共三個文件,微軟網站有下載。
2、可以通過Eclipse自帶的DataBase Explorer測試是否能訪問MsSqlServer
此時,通過iBATIS訪問MsSqlServer的前期條件均已經準備好,下面進行配置
1、配置sql-map-config.xml文件,核心部分如下
<sqlMapConfig>
? <properties resource="com/zyque/struts/database.properties"/>
? <transactionManager type="JDBC">
??? <dataSource type="SIMPLE">
????? <property value="${driver}" name="JDBC.Driver"/>
????? <property value="${url}" name="JDBC.ConnectionURL"/>
????? <property value="${username}" name="JDBC.Username"/>
????? <property value="${password}" name="JDBC.Password"/>
????? <property name="JDBC.DefaultAutoCommit" value="true" />
??? </dataSource>
? </transactionManager>
? <sqlMap resource="com/zyque/ibatis/BhbGl.xml"/>
?
</sqlMapConfig>
2、從上可以看出數據庫讀取的是database.properties,此配置如下
driver=com.microsoft.jdbc.sqlserver.SQLServerDriver
url=jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=whm;SelectMethod=cursor
username=sa
password=sa
此處注意的是在訪問MsSqlServer時候,需將SelectMethod=cursor,原因見上篇博客
通過這兩步就可以通過ibatis訪問MsSqlServer了
訪問示例代碼(參考的ibatis的入門指南,ibatis官方網站有下載),此處未對代碼進行功能隔離封裝,便于向嬖人之流的初學者學習
Bhbm elm = null;
String p_mc = "FM_BHJLDW";
String resource = "com/zyque/ibatis/sql-map-config.xml";
?Reader reader = Resources.getResourceAsReader(resource);
sqlMap = SqlMapClientBuilder.buildSqlMapClient(reader);
elm = (Bhbm) sqlMap.queryForObject ("getBhbByName", p_mc);
上面演示的一個簡單查詢,其余的示例可以看入門指南。并非本文的重點。
?????
posted @
2007-01-11 21:01 滌生 閱讀(987) |
評論 (1) |
編輯 收藏