基于Struts+Spring+JDBC架構(gòu)的課程設(shè)計(jì)實(shí)訓(xùn)教學(xué)示例項(xiàng)目——《網(wǎng)上銀行賬戶管理系統(tǒng)》——構(gòu)建項(xiàng)目數(shù)據(jù)庫(kù)連接組件和測(cè)試(第2部分)_第1頁(yè)
基于Struts+Spring+JDBC架構(gòu)的課程設(shè)計(jì)實(shí)訓(xùn)教學(xué)示例項(xiàng)目——《網(wǎng)上銀行賬戶管理系統(tǒng)》——構(gòu)建項(xiàng)目數(shù)據(jù)庫(kù)連接組件和測(cè)試(第2部分)_第2頁(yè)
基于Struts+Spring+JDBC架構(gòu)的課程設(shè)計(jì)實(shí)訓(xùn)教學(xué)示例項(xiàng)目——《網(wǎng)上銀行賬戶管理系統(tǒng)》——構(gòu)建項(xiàng)目數(shù)據(jù)庫(kù)連接組件和測(cè)試(第2部分)_第3頁(yè)
基于Struts+Spring+JDBC架構(gòu)的課程設(shè)計(jì)實(shí)訓(xùn)教學(xué)示例項(xiàng)目——《網(wǎng)上銀行賬戶管理系統(tǒng)》——構(gòu)建項(xiàng)目數(shù)據(jù)庫(kù)連接組件和測(cè)試(第2部分)_第4頁(yè)
基于Struts+Spring+JDBC架構(gòu)的課程設(shè)計(jì)實(shí)訓(xùn)教學(xué)示例項(xiàng)目——《網(wǎng)上銀行賬戶管理系統(tǒng)》——構(gòu)建項(xiàng)目數(shù)據(jù)庫(kù)連接組件和測(cè)試(第2部分)_第5頁(yè)
已閱讀5頁(yè),還剩10頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、基于Struts+Spring+JDBC架構(gòu)的課程設(shè)計(jì)實(shí)訓(xùn)教學(xué)例如工程?網(wǎng)上銀行賬戶管理系統(tǒng)?構(gòu)建工程數(shù)據(jù)庫(kù)連接組件和測(cè)試第2/6局部1.1.1 別離持久層中的數(shù)據(jù)庫(kù)連接組件中的與環(huán)境有關(guān)的參數(shù)1、添加一個(gè)屬性配置文件 或者XML文件1為什么要采用配置文件?1) 作用是什么?-靈活地滿足變化!2) 是采用*.properties還是*.xml格式3) 如何對(duì)配置文件中的工程進(jìn)行讀寫(xiě)?-利用類(lèi)利用該配置文件,封裝系統(tǒng)中的各個(gè)“可變的工作參數(shù)也就是“策略模式中的“環(huán)境。2在工程中添加屬性配置文件 3目前的內(nèi)容如下連接MS SQLServer2000的數(shù)據(jù)庫(kù)系統(tǒng)、MySQL數(shù)據(jù)庫(kù)等 JDBC_DSN

2、_URL = jdbc:jtds:sqlserver:/:1433/webbank JDBC_dbUserName =sa JDBC_dbUserPassWord =1234 JDBC_dbcp_maxActive =10JDBC_DSN_URL = jdbc:mysql:/localhost:3306/webbankJDBC_dbUserName=rootJDBC_dbUserPassWord=rootJDBC_dbcp_maxActive=10JDBC_DSN_URL = jdbc:odbc:webbankDSNJDBC_dbUserName=rootJDBC_dbUse

3、rPassWord=rootJDBC_dbcp_maxActive=10注意:也可以采用XML形式的配置文件。2、添加一個(gè)獲得配置屬性的ClassNameConfig類(lèi)也就是策略模式中的環(huán)境類(lèi)Context1包名稱(chēng)為2內(nèi)容如下package com.px1987.webbank.config;import java.io.FileNotFoundException;import java.io.FileOutputStream;import java.io.IOException;import java.io.InputStream;import java.io.OutputStream;im

4、port java.util.Properties;import com.px1987.webbank.exception.WebBankException;public class ClassNameConfig public ClassNameConfig()throws WebBankException static Properties oneProperties=null;/?staticoneProperties=new Properties();InputStream propertiesFileStream=ClassNameConfig.class.getResourceAs

5、Stream(/classNameCperties);try oneProperties.load(propertiesFileStream); catch (IOException e) intln(在加載屬性文件時(shí)程序出現(xiàn)了異常錯(cuò)誤!);public static String getProperty (String propertiesName)return oneProperties.getProperty(propertiesName);public static void setProperty (String propertiesName,String prop

6、ertiesValue)oneProperties.put(propertiesName, propertiesValue);public void savePropertiesItem(String propertiesFileName)throws WebBankExceptionOutputStream propertiesFileStream=null;try propertiesFileStream = new FileOutputStream(propertiesFileName); catch (FileNotFoundException e) throw new WebBank

7、Exception(在保存屬性文件時(shí)程序出現(xiàn)了異常錯(cuò)誤!);try oneProperties.store(propertiesFileStream, 這是修改后的屬性文件內(nèi)容); catch (IOException e) throw new WebBankException(在保存屬性文件時(shí)程序出現(xiàn)了異常錯(cuò)誤!);public void savePropertiesItemToXML(String xmlPropertiesFileName)throws WebBankExceptionOutputStream propertiesFileStream=null;try propertie

8、sFileStream = new FileOutputStream(xmlPropertiesFileName); catch (FileNotFoundException e1) throw new WebBankException(在保存屬性文件時(shí)程序出現(xiàn)了異常錯(cuò)誤!);try oneProperties.storeToXML(propertiesFileStream, 這是修改后的屬性文件內(nèi)容,gb2312); catch (IOException e) throw new WebBankException(在保存屬性文件時(shí)程序出現(xiàn)了異常錯(cuò)誤!);3注意的問(wèn)題1) 其中的“privat

9、e static Properties props=null;為什么要設(shè)計(jì)為static ?到達(dá)全局緩存2) static語(yǔ)句塊是在什么時(shí)候執(zhí)行?3) static語(yǔ)句塊也能夠產(chǎn)生一種“單例單一對(duì)象,也就是單例設(shè)計(jì)模式的效果可以參考Hibernate框架所提供的HibernateUtil.java類(lèi)代碼4Class類(lèi)中的getResourceAsStream方法直接返回一個(gè)InputStream流對(duì)象getResourceAsStream方法是查找具有給定名稱(chēng)的資源,返回 InputStream對(duì)象。注意getResourceAsStream方法是相對(duì)與/根路徑下的位置。 這樣的路徑是指定絕對(duì)

10、路徑,如果不以/“開(kāi)頭, 那么路徑是相對(duì)與這個(gè)class所在的包的表示從當(dāng)前classs下面的路徑找文件。InputStream input=ClassNameConfig.class.getResourceAsStream(/classNameCperties);5Class/ClassLoader類(lèi)中的getResource()方法返回的是一個(gè)URL對(duì)象Class/ClassLoader類(lèi)中的getResource方法是查找?guī)в薪o定名稱(chēng)的資源路徑并返回一個(gè)URL對(duì)象其實(shí)Class.getResource()方法是委托裝入該類(lèi)的類(lèi)裝載器,并最后返回一個(gè)用于讀取類(lèi)文件資源的U

11、RL;當(dāng)然,當(dāng)指定的類(lèi)名字不能在當(dāng)前的classpath中找到時(shí),Class.getResource()方法將返回null。Class/ClassLoader類(lèi)中的getResource()方法兩者不同是Class類(lèi)中的getResource()方法是從當(dāng)前包路徑查找資源,而ClassLoader類(lèi)那么是從系統(tǒng)的classpath的根查找;比方com.px1987.ClassA.getResource(a.gif)得到的是com/px1987/a.gif文件。如果在根路徑classpath,使用com.px1987.ClassA.getResource(/a.gif)或getClass().g

12、etClassLoader().getResource(a.gif)。6Thread類(lèi)中的contextClassLoader屬性代表線程的上下文 ClassLoader每個(gè)運(yùn)行中的線程都有一個(gè)成員contextClassLoader,用來(lái)在運(yùn)行時(shí)動(dòng)態(tài)地載入其它類(lèi),系統(tǒng)默認(rèn)的 contextClassLoader是systemClassLoader,所以一般而言java程序在執(zhí)行時(shí)可以使用JVM自帶的類(lèi)、$ JAVA_HOME/jre/lib/ext/中的類(lèi)和$CLASSPATH/中的類(lèi),并且在程序中可以使用Thread.currentThread(). getContextClassLoad

13、er()方法獲得當(dāng)前線程的contextClassLoader。因此,在某個(gè)線程中需要應(yīng)用某個(gè)類(lèi),可以首先利用Thread.currentThread().getContextClassLoader()方法獲得該線程的contextClassLoader;然后contextClassLoader請(qǐng)求它的父ClassLoader來(lái)完成該載入請(qǐng)求;但如果父ClassLoader無(wú)法載入類(lèi),那么contextClassLoader試圖自己來(lái)載入。下面為JDK API幫助中對(duì)Thread類(lèi)中的getContextClassLoader方法的說(shuō)明。InputStream input =Thread.cu

14、rrentThread().getContextClassLoader().getResource(classNameCperties).openStream();其實(shí)等同于下面的代碼:ClassLoader currentClassLoader = Thread.currentThread().getContextClassLoader(); URL oneURL = currentClassLoader.getResource(classNameCperties);InputStream input = oneURL.openStream();補(bǔ)充資料:

15、1、URI形式的絕對(duì)資源路徑 如:file:/D:/java/eclipse32/workspace/jbpmtest3/bin/aaa.b URL是URI的特例。URL的前綴/協(xié)議,必須是Java認(rèn)識(shí)的。URL可以翻開(kāi)資源,而URI那么不行。并且URL和URI對(duì)象可以互相轉(zhuǎn)換,使用各自的toURI(),toURL()方法即可。2、本地系統(tǒng)的絕對(duì)路徑 D:/java/eclipse32/workspace/jbpmtest3/bin/aaa.b ,在java.io包中的類(lèi),需要使用這種形式的參數(shù)。但它們一般也提供了URI類(lèi)型的參數(shù),而URI類(lèi)型的參數(shù),接受的是URI樣式的String。因此,通

16、過(guò)URI轉(zhuǎn)換,還是可以把URI樣式的絕對(duì)路徑用在java.io包中的類(lèi)中。 3、相對(duì)于classpath的相對(duì)路徑 如:相對(duì)于 file:/D:/java/eclipse32/workspace/jbpmtest3/bin/這個(gè)路徑的相對(duì)路徑。其中,bin是本工程的classpath。所有的Java源文件編譯后的.class文件復(fù)制到這個(gè)目錄中。 4、相對(duì)于當(dāng)前用戶目錄的相對(duì)路徑 就是相對(duì)于System.getProperty(user.dir)返回的路徑。對(duì)于一般工程,這是工程的根路徑。對(duì)于JavaEE效勞器,這可能是效勞器的某個(gè)路徑。這個(gè)并沒(méi)有統(tǒng)一的標(biāo)準(zhǔn)! 所以,絕對(duì)不要使用“相對(duì)于當(dāng)前用

17、戶目錄的相對(duì)路徑。然而,默認(rèn)情況下,java.io 包中的類(lèi)總是根據(jù)當(dāng)前用戶目錄來(lái)分析相對(duì)路徑名。此目錄由系統(tǒng)屬性 user.dir 指定,通常是 Java 虛擬機(jī)的調(diào)用目錄。這就是說(shuō),在使用java.io包中的類(lèi)時(shí),最好不要使用相對(duì)路徑。否那么,雖然在J2SE應(yīng)用程序中可能還算正常,但是到了J2EE程序中,一定會(huì)出問(wèn)題!而且這個(gè)路徑,在不同的效勞器中都是不同的! 推薦使用相對(duì)于當(dāng)前classpath的相對(duì)路徑,ClassLoader類(lèi)的getResource(String name)、getResourceAsStream(String name)等方法,使用相對(duì)于當(dāng)前工程的classpat

18、h的相對(duì)路徑來(lái)查找資源。讀取屬性文件常用到的ResourceBundle類(lèi)的getBundle(String path)也是如此。3、修改ConnectDBBean類(lèi)的程序代碼package com.px1987.webbank.dao.imple;import java.sql.Connection;import java.sql.DriverManager;import java.sql.SQLException;import java.util.logging.Level;import java.util.logging.Logger;import com.px1987.webbank.

19、config.ClassNameConfig;import er.ConnectDBInterface;import com.px1987.webbank.exception.WebBankException;public class ConnectDBBean implements ConnectDBInterface private static String JDBC_DBDriver_ClassName =null;private static String JDBC_DSN_URL = null;private static Str

20、ing JDBC_dbUserName=null;private static String JDBC_dbUserPassWord=null;private java.sql.Connection con = null;private static Logger logger = Logger.getLogger(ConnectDBBean.class.getName(); static/* * 利用ClassNameConfig實(shí)現(xiàn)附屬性文件中獲得與數(shù)據(jù)庫(kù)相關(guān)的連接信息 * */JDBC_DBDriver_ClassName = ClassNameConfig.getProperty(JD

21、BC_DBDriver_ClassName);JDBC_DSN_URL = ClassNameConfig.getProperty(JDBC_DSN_URL);JDBC_dbUserName = ClassNameConfig.getProperty(JDBC_dbUserName);JDBC_dbUserPassWord = ClassNameConfig.getProperty(JDBC_dbUserPassWord);tryClass.forName(JDBC_DBDriver_ClassName); catch (java.lang.ClassNotFoundException e)

22、/在此先不考慮異常處理logger.log(Level.INFO, 不能正確地加載JDBC驅(qū)動(dòng)程序+e.getMessage();public ConnectDBBean() throws WebBankException public void initDBConnection() throws WebBankExceptiontrycon = DriverManager.getConnection(JDBC_DSN_URL,JDBC_dbUserName,JDBC_dbUserPassWord);catch (java.sql.SQLException e)logger.log(Level

23、.INFO, e.getMessage();throw new WebBankException(不能正確地連接數(shù)據(jù)庫(kù)并且出現(xiàn)SQLException);catch (NullPointerException e)logger.log(Level.INFO, e.getMessage();throw new WebBankException(不能正確地連接數(shù)據(jù)庫(kù)并且出現(xiàn)NullPointerException); public void closeDBCon() throws WebBankException if(con=null)return;trycon.close(); /注意:要識(shí)別

24、是否為重復(fù)調(diào)用,否那么會(huì)出現(xiàn)數(shù)據(jù)庫(kù)連接已經(jīng)關(guān)閉的狀況con = null;catch (SQLException e)logger.log(Level.INFO, e.getMessage();throw new WebBankException(不能正確地關(guān)閉數(shù)據(jù)庫(kù)連接);public Connection getConnection() throws WebBankException initDBConnection();return con;public boolean isDBConnectionClose()return (con=null)?true:false;注意:在代碼中應(yīng)用

25、JDK所提供的日志處理技術(shù)實(shí)現(xiàn)日志記錄,該方法有什么問(wèn)題?以后將改變?yōu)槠渌夹g(shù)實(shí)現(xiàn)。1.1.2 別離對(duì)象的創(chuàng)立和對(duì)象的使用之間的職責(zé)應(yīng)用GOF設(shè)計(jì)模式1、添加一個(gè)工廠類(lèi),用來(lái)統(tǒng)一創(chuàng)立ConnectDBInterface接口的對(duì)象實(shí)例什么是工廠模式?所應(yīng)該要思考的如何更好地創(chuàng)立對(duì)象?如何動(dòng)態(tài)地創(chuàng)立對(duì)象?為什么要應(yīng)用工廠模式(別離對(duì)象使用者和對(duì)象創(chuàng)立者)?如何編程實(shí)現(xiàn)?1在工程中添加一個(gè)ConnectDBFactory類(lèi),包名稱(chēng)為bank.factory2編程該工廠類(lèi),并利用反射技術(shù)實(shí)現(xiàn)動(dòng)態(tài)地創(chuàng)立目標(biāo)類(lèi)的對(duì)象實(shí)例package com.px1987.webbank.factory;import c

26、om.px1987.webbank.dao.*;import com.px1987.webbank.exception.*;import java.util.logging.*; import er.ConnectDBInterface;public class ConnectDBFactory public static ConnectDBInterface newConnectDBBean(String connectDBBeanClassName) throws WebBankException ConnectDBInterface c

27、onnectDBBean=null;Logger logger = Logger.getLogger(ConnectDBFactory.class.getName(); Class oneTargetClassInstance=null;try oneTargetClassInstance= Class.forName(connectDBBeanClassName); catch (ClassNotFoundException e)logger.log(Level.INFO, e.getMessage();throw new WebBankException(不能正確地獲得+connectDB

28、BeanClassName+類(lèi));tryconnectDBBean = (ConnectDBInterface) oneTargetClassInstance.newInstance(); catch (InstantiationException e)logger.log(Level.INFO, e.getMessage();throw new WebBankException(不能正確地創(chuàng)立+connectDBBeanClassName+類(lèi)的對(duì)象實(shí)例); catch (IllegalAccessException e) logger.log(Level.INFO, e.getMessage

29、();throw new WebBankException(不能正確地創(chuàng)立+connectDBBeanClassName+類(lèi)的對(duì)象實(shí)例);return connectDBBean;注意在該工廠類(lèi)中應(yīng)用Java中的反射機(jī)制動(dòng)態(tài)地創(chuàng)立出ConnectDBInterface接口的實(shí)現(xiàn)類(lèi)對(duì)象實(shí)例請(qǐng)見(jiàn)上面的紅色的代碼,因此為可配置化的工廠-因?yàn)槌R?guī)的工廠類(lèi)是與具體的產(chǎn)品類(lèi)是緊密關(guān)聯(lián)的,而可配置化的工廠是接收一個(gè)產(chǎn)品類(lèi)名稱(chēng)的參數(shù)變量。2、添加JDBC的驅(qū)動(dòng)程序1JDBC驅(qū)動(dòng)程序的主要作用是什么?它是各個(gè)數(shù)據(jù)庫(kù)廠家根據(jù)JDBC的標(biāo)準(zhǔn)制作的 JDBC實(shí)現(xiàn)類(lèi)。2對(duì)數(shù)據(jù)庫(kù)訪問(wèn)有什么性能的影響?3如何獲得?4將支持MySQL的JDBC驅(qū)動(dòng)程序包文件添加到本工

溫馨提示

  • 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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論