版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、基于Struts+Spring+JDBC架构的课程设计实训教学例如工程?网上银行账户管理系统?构建工程数据库连接组件和测试第2/6局部1.1.1 别离持久层中的数据库连接组件中的与环境有关的参数1、添加一个属性配置文件 或者XML文件1为什么要采用配置文件?1) 作用是什么?-灵活地满足变化!2) 是采用*.properties还是*.xml格式3) 如何对配置文件中的工程进行读写?-利用类利用该配置文件,封装系统中的各个“可变的工作参数也就是“策略模式中的“环境。2在工程中添加属性配置文件 3目前的内容如下连接MS SQLServer2000的数据库系统、MySQL数据库等 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、添加一个获得配置属性的ClassNameConfig类也就是策略模式中的环境类Context1包名称为2内容如下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(在加载属性文件时程序出现了异常错误!);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(在保存属性文件时程序出现了异常错误!);try oneProperties.store(propertiesFileStream, 这是修改后的属性文件内容); catch (IOException e) throw new WebBankException(在保存属性文件时程序出现了异常错误!);public void savePropertiesItemToXML(String xmlPropertiesFileName)throws WebBankExceptionOutputStream propertiesFileStream=null;try propertie
8、sFileStream = new FileOutputStream(xmlPropertiesFileName); catch (FileNotFoundException e1) throw new WebBankException(在保存属性文件时程序出现了异常错误!);try oneProperties.storeToXML(propertiesFileStream, 这是修改后的属性文件内容,gb2312); catch (IOException e) throw new WebBankException(在保存属性文件时程序出现了异常错误!);3注意的问题1) 其中的“privat
9、e static Properties props=null;为什么要设计为static ?到达全局缓存2) static语句块是在什么时候执行?3) static语句块也能够产生一种“单例单一对象,也就是单例设计模式的效果可以参考Hibernate框架所提供的HibernateUtil.java类代码4Class类中的getResourceAsStream方法直接返回一个InputStream流对象getResourceAsStream方法是查找具有给定名称的资源,返回 InputStream对象。注意getResourceAsStream方法是相对与/根路径下的位置。 这样的路径是指定绝对
10、路径,如果不以/“开头, 那么路径是相对与这个class所在的包的表示从当前classs下面的路径找文件。InputStream input=ClassNameConfig.class.getResourceAsStream(/classNameCperties);5Class/ClassLoader类中的getResource()方法返回的是一个URL对象Class/ClassLoader类中的getResource方法是查找带有给定名称的资源路径并返回一个URL对象其实Class.getResource()方法是委托装入该类的类装载器,并最后返回一个用于读取类文件资源的U
11、RL;当然,当指定的类名字不能在当前的classpath中找到时,Class.getResource()方法将返回null。Class/ClassLoader类中的getResource()方法两者不同是Class类中的getResource()方法是从当前包路径查找资源,而ClassLoader类那么是从系统的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类中的contextClassLoader属性代表线程的上下文 ClassLoader每个运行中的线程都有一个成员contextClassLoader,用来在运行时动态地载入其它类,系统默认的 contextClassLoader是systemClassLoader,所以一般而言java程序在执行时可以使用JVM自带的类、$ JAVA_HOME/jre/lib/ext/中的类和$CLASSPATH/中的类,并且在程序中可以使用Thread.currentThread(). getContextClassLoad
13、er()方法获得当前线程的contextClassLoader。因此,在某个线程中需要应用某个类,可以首先利用Thread.currentThread().getContextClassLoader()方法获得该线程的contextClassLoader;然后contextClassLoader请求它的父ClassLoader来完成该载入请求;但如果父ClassLoader无法载入类,那么contextClassLoader试图自己来载入。下面为JDK API帮助中对Thread类中的getContextClassLoader方法的说明。InputStream input =Thread.cu
14、rrentThread().getContextClassLoader().getResource(classNameCperties).openStream();其实等同于下面的代码:ClassLoader currentClassLoader = Thread.currentThread().getContextClassLoader(); URL oneURL = currentClassLoader.getResource(classNameCperties);InputStream input = oneURL.openStream();补充资料:
15、1、URI形式的绝对资源路径 如:file:/D:/java/eclipse32/workspace/jbpmtest3/bin/aaa.b URL是URI的特例。URL的前缀/协议,必须是Java认识的。URL可以翻开资源,而URI那么不行。并且URL和URI对象可以互相转换,使用各自的toURI(),toURL()方法即可。2、本地系统的绝对路径 D:/java/eclipse32/workspace/jbpmtest3/bin/aaa.b ,在java.io包中的类,需要使用这种形式的参数。但它们一般也提供了URI类型的参数,而URI类型的参数,接受的是URI样式的String。因此,通
16、过URI转换,还是可以把URI样式的绝对路径用在java.io包中的类中。 3、相对于classpath的相对路径 如:相对于 file:/D:/java/eclipse32/workspace/jbpmtest3/bin/这个路径的相对路径。其中,bin是本工程的classpath。所有的Java源文件编译后的.class文件复制到这个目录中。 4、相对于当前用户目录的相对路径 就是相对于System.getProperty(user.dir)返回的路径。对于一般工程,这是工程的根路径。对于JavaEE效劳器,这可能是效劳器的某个路径。这个并没有统一的标准! 所以,绝对不要使用“相对于当前用
17、户目录的相对路径。然而,默认情况下,java.io 包中的类总是根据当前用户目录来分析相对路径名。此目录由系统属性 user.dir 指定,通常是 Java 虚拟机的调用目录。这就是说,在使用java.io包中的类时,最好不要使用相对路径。否那么,虽然在J2SE应用程序中可能还算正常,但是到了J2EE程序中,一定会出问题!而且这个路径,在不同的效劳器中都是不同的! 推荐使用相对于当前classpath的相对路径,ClassLoader类的getResource(String name)、getResourceAsStream(String name)等方法,使用相对于当前工程的classpat
18、h的相对路径来查找资源。读取属性文件常用到的ResourceBundle类的getBundle(String path)也是如此。3、修改ConnectDBBean类的程序代码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实现附属性文件中获得与数据库相关的连接信息 * */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驱动程序+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(不能正确地连接数据库并且出现SQLException);catch (NullPointerException e)logger.log(Level.INFO, e.getMessage();throw new WebBankException(不能正确地连接数据库并且出现NullPointerException); public void closeDBCon() throws WebBankException if(con=null)return;trycon.close(); /注意:要识别
24、是否为重复调用,否那么会出现数据库连接已经关闭的状况con = null;catch (SQLException e)logger.log(Level.INFO, e.getMessage();throw new WebBankException(不能正确地关闭数据库连接);public Connection getConnection() throws WebBankException initDBConnection();return con;public boolean isDBConnectionClose()return (con=null)?true:false;注意:在代码中应用
25、JDK所提供的日志处理技术实现日志记录,该方法有什么问题?以后将改变为其它技术实现。1.1.2 别离对象的创立和对象的使用之间的职责应用GOF设计模式1、添加一个工厂类,用来统一创立ConnectDBInterface接口的对象实例什么是工厂模式?所应该要思考的如何更好地创立对象?如何动态地创立对象?为什么要应用工厂模式(别离对象使用者和对象创立者)?如何编程实现?1在工程中添加一个ConnectDBFactory类,包名称为bank.factory2编程该工厂类,并利用反射技术实现动态地创立目标类的对象实例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+类);tryconnectDBBean = (ConnectDBInterface) oneTargetClassInstance.newInstance(); catch (InstantiationException e)logger.log(Level.INFO, e.getMessage();throw new WebBankException(不能正确地创立+connectDBBeanClassName+类的对象实例); catch (IllegalAccessException e) logger.log(Level.INFO, e.getMessage
29、();throw new WebBankException(不能正确地创立+connectDBBeanClassName+类的对象实例);return connectDBBean;注意在该工厂类中应用Java中的反射机制动态地创立出ConnectDBInterface接口的实现类对象实例请见上面的红色的代码,因此为可配置化的工厂-因为常规的工厂类是与具体的产品类是紧密关联的,而可配置化的工厂是接收一个产品类名称的参数变量。2、添加JDBC的驱动程序1JDBC驱动程序的主要作用是什么?它是各个数据库厂家根据JDBC的标准制作的 JDBC实现类。2对数据库访问有什么性能的影响?3如何获得?4将支持MySQL的JDBC驱动程序包文件添加到本工
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- GB/T 31270.16-2025化学农药环境安全评价试验准则第16部分:土壤微生物毒性试验
- 2025标准版白酒行业劳动合同范本下载
- 2025版消化性溃疡常见症状及护理原则解析
- 重症医学科呼吸机功能调试技术培训
- 2025版结直肠癌症状与护理建议
- 电工技能测试题库及答案
- 2025年国际档案日档案知识竞赛题库(附答案)
- 防尘专项施工方案
- 2025年安全教育试题库及答案
- 肠外营养药物配置
- 市政道路工程施工交通工程施工方案
- 期中模拟卷02(全国适用)-【中职专用】高二语文上学期职业模块期中模拟卷(解析版)
- 【MOOC】空中机器人-浙江大学 中国大学慕课MOOC答案
- 融资担保贷款担保合同模板
- 初一新生家长会(共27张课件)
- 住宅小区分布式光伏安装方案
- 3D打印机组装与调试 课件 第2讲3D打印技术的发展
- 私人银行中的监管合规
- 智能天然气净化厂建设实践
- 洗碗业务承包合同
- 健康养生健康知识讲座课件
评论
0/150
提交评论