spring2.5 学习笔记

更新时间:2024-01-22 18:31:01 阅读量: 教育文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

Spring –SSH整合 学习笔记 ---wjt276

[2010-05-14]

spring2.5 学习笔记 第2页 共46页

目录

第一课:面向抽象编程 ....................................................................................... 4 第二课:Jdom的基本使用 ..................................................................................... 5 第三课:模拟Spring功能 .................................................................................... 5 第四课:搭建sping的运行环境 ............................................................................... 8

一、 二、 三、 四、 五、 一、 二、 三、

建立一个新的项目 ............................................................................. 8 建立spring的配置文件 ......................................................................... 8 引入spring的jar包........................................................................... 8 测试代码: ................................................................................... 8 注意接口的使用: ............................................................................. 9 什么是IOC、DI ................................................................................ 9 编辑xml文件时,没有提示 ...................................................................... 9 注入类型(Injecting dependencies) .............................................................. 9

setter注入类型Setter Injection ......................................................... 10 构造方法Constructor Injection ........................................................... 10

第五课:IOC(DI)配置及应用 .................................................................................. 9

(一) (二) 四、 五、 六、 七、 八、

id、name .................................................................................... 11 简单属性的注入 .............................................................................. 12 Bean的作用范围scope ......................................................................... 12 集合注入 .................................................................................... 13 自动装配autowire ............................................................................ 13

byName .................................................................................. 14 byType .................................................................................. 15 注意 .................................................................................... 15 lazy-init/default-lazy-init ............................................................. 15 init-method destroy-method 不要和prototype一起用(了解) ............................... 15

(一) (二) (三) 九、

(一) (二) 一、 二、

生命周期 .................................................................................... 15

第六课:annotation方式Spring ............................................................................. 16

开始使用annotation配置Spring ............................................................... 16 @Autowired、@Qualifier ....................................................................... 17

@Autowired .............................................................................. 17 @Qualifier .............................................................................. 17 JSR-250 ................................................................................. 18 @Resource ............................................................................... 18

(一) (二) 三、

(一) (二) 四、 五、 六、 一、 二、 一、

@Resource(重要、推荐) ........................................................................ 18

@Componet ................................................................................... 18 @Scope、@PostConstruct、@PreDestroy .......................................................... 19 注解对应的jar包 ............................................................................ 20 AOP概念 ..................................................................................... 20 利用动态代理实现面向切面编程 ................................................................. 20 AOP配置annotation方式 ...................................................................... 22

搭建annotation开发环境 ................................................................. 22 aspectJ类库 ............................................................................ 22 AOP的annotation实例 ................................................................... 22

第七课:AOP(面向切面编程) ................................................................................. 20

第八课:Spring AOP配置选项 ................................................................................ 22

(一) (二) (三)

(四) (五) (六) (七) (八) 二、 三、 一、 二、 三、 一、

spring2.5 学习笔记 第3页 共46页

AspectJ的专业术语 ...................................................................... 23 织入点语法 .............................................................................. 24 Advice .................................................................................. 25 Pointcut ................................................................................ 26 annotatin方式的AOP实例 ................................................................ 26

AOP配置xml方式 ............................................................................. 27 AOP实现动态代理注意 ......................................................................... 28 Sping配置数据源: ........................................................................... 28 注入使用 .................................................................................... 29 dbcp.BasicDataSource ......................................................................... 30 Spring配置hibernate3的SessionFactory ....................................................... 30

xml形式的SessionFactory ................................................................ 30 annotation注解方式的SessionFactory ..................................................... 31 基本jar ................................................................................ 31 加入annotation功能的jar包 ............................................................. 31 搭建日志环境并配置显示DDL语句jar包 .................................................... 31 Annotation注解方式配置事务管理 .......................................................... 32 Spring事务选项 ......................................................................... 36 XML文件形式配置Spring事务管理 .......................................................... 37 HibernateTemplate ....................................................................... 38 HibernateDaoSupport ..................................................................... 39

第九课:DataSource ........................................................................................ 28

第十课 Spring整合Hiberante3 .............................................................................. 30

(一) (二) 二、

(一) (二) (三) 三、

(一) (二) (三) 四、

(一) (二) 一、 二、 三、 四、 一、 二、 一、 二、 三、 一、 二、 三、

引入hibernate所需要使用的jar ............................................................... 31

Spring整合hibernate3事务 ................................................................... 32

HibernateTemplate ........................................................................... 38

第十一课:Spring整合-SSH .................................................................................. 41

第一步:加入jar包(需要的jar包列表) ......................................................... 41 第二步: 首先整合Spring + Hibernate ......................................................... 42 第三步:再来整合Struts2 ..................................................................... 42 struts的读常量: ............................................................................ 43 DTO ......................................................................................... 43 VO .......................................................................................... 43 Jsp中访问Session时,Session已经关闭 ........................................................ 44 如果不配置事务,openSessionView出现异常 ..................................................... 44 中文乱码问题: .............................................................................. 45 Struts2 ..................................................................................... 46 Hibernate3.3.2 .............................................................................. 46 Spring ...................................................................................... 46

第十二课:DTO、VO ......................................................................................... 43

第十二课:SSH整合存在的问题 ............................................................................... 44

第十三课:SSH整合的jar包 ................................................................................. 46

spring2.5 学习笔记 第4页 共46页

第一课:面向抽象编程

原来什么类都是写死的,现在是先建立一个大的标准,然后再各个实体类来实现他们的功能,然后在调用的时候,使用这个标准调用,这样,你们那个来都可以被调用。

实例:

User实体类 public class User { private String username; private String password; public String getUsername() { return username; } public void setUsername(String username) {this.username = username;} public String getPassword() {return password; } public void setPassword(String password) { }} UserDao接口 this.password = password; public interface UserDao { }

UserDao的实现UserDaoImpl public void save(User u); public class UserDaoImpl implements UserDao { User管理类 public class UserService { //这里需要什么的实现,在new时,就new什么的实现,在调用方法时,会调用具体的实现类的方法 private UserDao userDao = new UserDaoImpl(); public UserDao getUserDao() { return userDao; } public void setUserDao(UserDao userDao) { this.userDao = userDao; } } public void add(User u){ userDao.save(u); }//这里可以调用任务实现了UserDao接口的save方法了。 @Override public void save(User u) { }} System.out.println(\); spring2.5 学习笔记 第5页 共46页

第二课:Jdom的基本使用

test.xml 8G 200 1580 10G 500 3000 实例类: public class Sample1 { public static void main(String[] args) throws Exception{ SAXBuilder sb=new SAXBuilder();//创建一个SAXBuilder对象 Document doc= sb.build(Sample1.class.getClassLoader().getResourceAsStream(\)); //构造文档对象 Element root=doc.getRootElement(); //获取根元素 List list=root.getChildren(\);//取名字为disk的所有元素 for(int i=0;i

因为Spring是使用xml配置文件来实现的,所以我们首先模拟一个xml的配置文件如下: beans.xml

spring2.5 学习笔记 第6页 共46页

实现的功能:当类初始化时, 一、 程序会根据此配置文件初始化文件所有的bean元素所代表的类,放入一个容器中(使用Map),然后在需要时,会根据ID值,取出这个对象; 1、 代码: public class ClassPathXmlApplicationContext implements BeanFactory { private Map beans = new HashMap(); public ClassPathXmlApplicationContext() throws Exception{ SAXBuilder sb=new SAXBuilder();//创建一个SAXBuilder对象 Document doc=sb.build(ClassPathXmlApplicationContext.class.getClassLoader().getResourceAsStream(\eans.xml\)); //构造文档对象 Element root=doc.getRootElement(); //获取根元素 //System.out.println(root.getName()); List list=root.getChildren(\);//取名字为disk的所有元素 for(int i=0;i beans = new HashMap(); public ClassPathXmlApplicationContext() throws Exception{ SAXBuilder sb=new SAXBuilder();//创建一个SAXBuilder对象 Document UserService service = new UserService(); //UserService service = (UserService)factory.getBean(\ UserDao userDao = (UserDao)factory.getBean(\);//此得只需要根据ID就可以取得Bean对象来使用 service.setUserDao(userDao); User u = new User(); service.add(u); return beans.get(name); public Object getBean(String name){ doc=sb.build(ClassPathXmlApplicationContext.class.getClassLoader().getResourceAsStream(\ns.xml\)); //构造文档对象

spring2.5 学习笔记 第7页 共46页

Element root=doc.getRootElement(); //获取根元素 List list=root.getChildren(\);//取名字为disk的所有元素 for(int i=0;i)element.getChildren(\)){ //获取property子元素中 属性为name的值(也就是需要注入的参数名称) String name = propertyElement.getAttributeValue(\); //获取property子元素中 属性为bean的值 (需要注入参数的类型),此处的bean值是已经在上面初始化好了的bean String bean = propertyElement.getAttributeValue(\); //因此此处获取指定ID的bean Object beanObject = beans.get(bean); //组成set方法名称:set + 第一个字母大写 + 其它的字母 String methodName = \ + name.substring(0,1).toUpperCase() + name.substring(1); System.out.println(\ + methodName); //获取bean的set方法,参数(方法名,参数:此参数的类型) Method m = o.getClass().getMethod(methodName, 的ID了。 beanObject.getClass().getInterfaces()[0]); //使用反映机制,执行method方法,从而实现注入功能 m.invoke(o, beanObject); } } } public Object getBean(String name){ return beans.get(name); } } 注意,以上有背景色的部分是实现自动装配(注入)的代码。 2、 测试 public void testAdd_3() throws Exception { } BeanFactory factory = new ClassPathXmlApplicationContext(); UserService service = (UserService)factory.getBean(\); //以下两行代码在实现注入功能后,将不再需要,因为程序在加载时,已经帮我自动注入这个参数了。 //UserDao userDao = (UserDao)factory.getBean(\ //service.setUserDao(userDao); User u = new User(); service.add(u);

BeanFactory接口代码: spring2.5 学习笔记 第8页 共46页

public interface BeanFactory { } public Object getBean(String name); 第四课:搭建sping的运行环境

一、 建立一个新的项目

a) b)

建立新的项目; 建立需要的bean类

二、 建立spring的配置文件

你可以在spring文件中复制代码 三、 引入spring的jar包

可以建立一个User Library

搭建spring环境基本的包:spring.jar和commons-logging.jar

四、 测试代码:

public void testAdd_3() throws Exception { } BeanFactory factory = new ClassPathXmlApplicationContext(\); UserService service = (UserService)factory.getBean(\); User u = new User(); service.add(u); 注意:这里使用的ClassPathXmlApplicationContext和BeanFactory是spring的,如下: import org.springframework.beans.factory.BeanFactory; import org.springframework.context.support.ClassPathXmlApplicationContext; spring2.5 学习笔记 第9页 共46页

五、 注意接口的使用:

ClassPathXmlApplicationContext类实现了ApplicationContext接口,而ApplicationContext接口又实现了BeanFactory接口,这样BeanFactory是根上的接口。一般建议使用ApplicationContext接口,因为: 1、BeanFactory:只是完成Bean工厂的基本功能,不能完成bean的生命周期 2、ApplicationContext:除了完成bean工厂的基本功能外,还完成的其它的附加功能(比如:bean的生命周期),也就是功能更强大 这样上面的代码就是 } ApplicationContext factory = new ClassPathXmlApplicationContext(\); UserService service = (UserService)factory.getBean(\); User u = new User(); service.add(u); public void testAdd_3() throws Exception { 第五课:IOC(DI)配置及应用

一、 什么是IOC、DI

IOC: Inversion of Control控制反转:原来类的一些成员属性(例如UserService中的userDao成员属性)是由当前类(UserService)自己控制,现在不是由当前类(UserService)自己控制,而是由容器(运行环境上下文、Spring)帮我们来控制。

还是一种说法:原来我们自己控制是控制实现,而现在Spring是利用接口来控制的。所以我们由原来控制实现转为springg现在来控制接口(向上反转)

作用:实例化具体的bean

动态装配bean

(本来是由我来控制的,现在我交给容器来控制。)

DI:Dependency Injection依赖注入:一些成员属性(例如UserService中的userDao成员属性) 依赖Spring容器来注入 好处:偶合性相对来降低了;另外,注入是使用配置文件来实现,这样修改来非常的方便.

DI与IOC相对来说 是一样的概念。

二、 编辑xml文件时,没有提示

1、 window – preferences – myeclipse – Files and Editing - xml – xml catalog 2、 add按钮

i. ii. iii. iv.

Location: D:\\share\\0900_Spring\\soft\\spring-framework-2.5.6\\dist\\resources\\spring-beans-2.5.xsd URI: Key:

file:///D:/share/0900_Spring/soft/spring-framework-2.5.6/dist/resources/spring-beans-2.5.xsd

Key Type: Schema Location

http://www.springframework.org/schema/beans/spring-beans-2.5.xsd

三、 注入类型(Injecting dependencies)

1、 setter(重要)

2、 构造方法(使用的非常少) 3、 接口注入(可以忘记)

(一) setter注入类型Setter Injection } spring配置文件如下: spring2.5 学习笔记 第10页 共46页

就是在bean中使用setXXX方法进行注入来 在bean类中,成员属性需要setXXX方法如下: private UserDao userDao = new UserDaoImpl(); public UserDao getUserDao() { } public void setUserDao(UserDao userDao) { } public void add(User u){ userDao.save(u);} this.userDao = userDao; return userDao; public class UserService { (二) 构造方法Constructor Injection 首先在bean类中需要有成员属性作为参数的构造方法 } 注意:背景较深的代码为构造方法,带有参数的构造方法 代码如下: private UserDao userDao = new UserDaoImpl(); public UserService(UserDao userDao) { } public UserDao getUserDao() {return userDao;} public void setUserDao(UserDao userDao) { this.userDao = userDao;} public void add(User u){ userDao.save(u);} super(); this.userDao = userDao; public class UserService { spring配置文件如下: 使用和其子标签进行构造方法注入 当构造方法注入时,构造方法中有多个参数时,可以使用以下两种方式注入: bean代码: public class ExampleBean { private int years; private String ultimateAnswer; public ExampleBean(int years, String ultimateAnswer) { this.years = years; this.ultimateAnswer = ultimateAnswer; } } 1、参数类型方式进行区分参数: xml配置文件: 注意:这样就是参数类型为int的注入7500000,而参数类型为java.lang.String的参数注入”42”,但这个方法不适合多个参数是相同的类型。 2、利用索引进行区分参数 xml配置文件 注意:index=0的注入到第一个参数,index=1的注入到第二个参数。 构造方法的注入不方便,所以我们需要使用setter注入方式。 四、 id、name

注xml配置文件中标签中的属性名称如下:

以上标签中的属性id与name作用是一样, 唯一的区别:id中不可以含有特殊字符,而name中可以有特殊字符 spring2.5 学习笔记 第12页 共46页

五、 简单属性的注入

当bean中存在简单属性时的注入方式: bean代码如下: public class UserDaoImpl implements UserDao { private int daoId; private String daoStatus; public int getDaoId() { return daoId; } public void setDaoId(int daoId) { this.daoId = daoId; } public String getDaoStatus() { return daoStatus; } public void setDaoStatus(String daoStatus) { this.daoStatus = daoStatus; } @Override public void save(User u) { System.out.println(\); } } xml配置文件如下: good 直接使用 value属性或是子标签来注入 六、 Bean的作用范围scope

在Spring配置文件中的标签可以指定bean的作用范围 利用标签中的scope属性来指定 scope值: 1、 singleton单例:每次取出的bean都是同一个bean。默认就是这个 2、 prototype原型:每次取的bean时,都会重新创建一个新的bean 3、 request 4、 session 5、 globalsession 实例: spring2.5 学习笔记 第13页 共46页

注意:只有spring与web框架结合时才会使用request/session/globalsession,但也非常少用,因为其它框架已经有功能非常强大的scope了(例如:struts的scope)

七、 集合注入

很少用,不重要,参考程序 administrator@example.org support@example.org development@example.org a list element followed by a reference an entry just some string a ref just some string 八、 自动装配autowire

含义:在bean注入时不需要我们来指定注入哪个具体的bean,而spring容器会根据我的使用autowire属性来确定自动装配功能。

autowire值:

1、 autodetect;

spring2.5 学习笔记 第14页 共46页

2、 byName:根据bean中成员属性的名称来自动装配 3、 byType:根据bean中成员属性的类型来自动装配。 4、 constaractor

5、 default:会根据标签中的default-autowire属性来进行自动装配的方式 6、 no(默认就是这个,需要手动指定注入那个bean)

(一) byName 根据bean中成员属性的名称来自动装配。 bean代码: UserDaoImpl类 public class UserDaoImpl implements UserDao { UserService类 public class UserService { spring的配置文件 测试代码: public void testAdd_4() throws Exception { } ApplicationContext factory = new ClassPathXmlApplicationContext(\); UserService service = (UserService)factory.getBean(\); System.out.println(service.getUserDao()); private UserDao userDao = new UserDaoImpl(); public UserDao getUserDao() { } public void setUserDao(UserDao userDao) { } public void add(User u){ }} userDao.save(u); this.userDao = userDao; return userDao; private int daoId; public int getDaoId() {return daoId;} public void setDaoId(int daoId) {this.daoId = daoId; } @Override public String toString(){ }} return \ + this.daoId; spring2.5 学习笔记 第15页 共46页

结果:daoId=1 说明:因为在配置文件中配置了两个UserDaoImpl(名称分别:userDao、userDao2)和一个UserService类。而在userService的bean中并没有进行注入配置。而是使用了autowire属性指定了byName值,这样结果是正确的,是因为spring看到autowire=byName后,会在配置文件中查找bean的id与userService成员属性名称一至,然后将其注入,这样就完成了根据名称自动装配功能。 (二) byType 根据类型自动装配:就是spring在初始化时,会在配置文件中查找的类型与userService成员属性的类型相比较,类型一致的将其注入,这样就完成了根据类型自动装配。

(三) 注意

1、 自动装配使用并不多;

2、 只有在使用anntation注解时会使用的。

3、 byType如果出现相同类型在两个以上,就会出现异常。

九、 生命周期

(一) lazy-init/default-lazy-init

(不重要) bean的何时初始化 lazy-init值:default:表示使用标签中的default-lazy-init值 例如: (二) init-method destroy-method 不要和prototype一起用(了解) init-method:用于标签中的属性,表示在初始化这个bean之前所需要的执行方法 destroy-method:用于标签中的属性,表示在这个bean销毁时所需要的执行方法。例如关闭连接池。 注意:此属性不要与scpoe=”prototype”一起使用,否则会出现其它的问题。 例如: true:表示context在初始化时,不会初始化这个bean,只有在使用时才会初始化 false:表示context在初始化时,就会初始化这个bean

spring2.5 学习笔记 第16页 共46页

destroy-method=\> userService类的代码 public class UserService { } 测试代码: public void init(){ System.out.println(\现在开始初始化UserService\); } private UserDao userDao = new UserDaoImpl(); public UserDao getUserDao() {return userDao; } public void setUserDao(UserDao userDao) {this.userDao = userDao;} public void add(User u){ userDao.save(u);} public void destroy(){System.out.println(\); } public void testAdd_4() throws Exception { } ClassPathXmlApplicationContext factory = new UserService service = (UserService)factory.getBean(\); System.out.println(service.getUserDao()); //因为在非webApplacationContext中不能自动destory,因为需要手动destory //而ApplicationContext没有实现destory方法,因此需要具体的实现类来destory factory.destroy(); ClassPathXmlApplicationContext(\); 第六课:annotation方式Spring

一、 开始使用annotation配置Spring

首先需要在spring的xml配置文件中加入下列红色加粗部分的代码。

这样当spring加载配置文件时,发现有标签后,会帮我加载以下四个类(用于处理annotation方式的配置):

1、AutowiredAnnotationBeanPostProcessor, 2、CommonAnnotationBeanPostProcessor, 3、PersistenceAnnotationBeanPostProcessor, 4、RequiredAnnotationBeanPostProcessor spring2.5 学习笔记 第17页 共46页

二、 @Autowired、@Qualifier

还是需要在xml文件中配置bean

(一) @Autowired

位置:可以放在成员属性前面,也可以放在getter或setter方法前面,但是建议放在setter方法前面 作用:表示该对应的成员属性可以完成自动配置功能(默认是根据byType的) 例如: xmp配置文件: 前缀部分见上面代码,以此略。。。 userService public class UserService { //表示该成员属性可以自动装配(默认根据类型byType) //annotation建议放在setter方法前面 @Autowired public void setUserDao(UserDao userDao) { } public void add(User u){ }} userDao.save(u); this.userDao = userDao; private UserDao userDao = new UserDaoImpl(); public UserDao getUserDao() {return userDao;} 说明:这样spring就可以帮我们完成自动装配功能(默认是根据byType) (二) @Qualifier 因为@Autowired默认是根据byType来自动装配注入的。当有多个相同类型的bean时,Spring就会出现异常,提示找到多个符合条件的bean,但是不知道选择哪个bean来注入。 这时我们需要另外一注解来告诉Spring用那个bean,这就是@Qualifier注解, @Qualifier使用value参数来指定注入那个bean 代码: public class UserService { } private UserDao userDao = new UserDaoImpl(); public UserDao getUserDao() {return userDao; } //表示该成员属性可以自动装配(默认根据类型byType) //当配置文件中有多个相同类型的bean时,需要使用@Qualifier注解来说明那个bean来自动装配 @Autowired public void setUserDao(@Qualifier(value=\ UserDao userDao) { } public void add(User u){ userDao.save(u);} this.userDao = userDao; spring2.5 学习笔记 第18页 共46页

三、 @Resource(重要、推荐)

还是需要在xml文件中配置bean

(一) JSR-250

JCP:Java Community Process是由多个厂家出人来构成的J2EE组织,主要是用于定Java的一些新的标准 而每一个标签都可以称之为一个JSR

而每一个新的JSR都会加一个数字是区别什么JSR,可以到官方网看看具体JSR定了哪些新的标准。

(二) @Resource 代码: import javax.annotation.Resource; public class UserService { } 说明:在这里引用了一个资源,这个资源的名称和这个setter方法后面的成员属性名称一致(userDao) 注意这个@Resource是J2EE的(import javax.annotation.Resource) @Resource默认是根据byName来的,如果没有找到相同的名称再根据byType,当然也可以指定bean的name如下: @Resource(name=\) public void setUserDao(UserDao userDao) { } 注意:一般使用@Resource而不会使用@Autowired

不足:如果没有源码,就无法使用annotation,只能使用xml

this.userDao = userDao; private UserDao userDao = new UserDaoImpl(); public UserDao getUserDao() { } return userDao; //在这里引用了一个资源,这个资源的名称和这个setter方法后面的成员属性名称一致(userDao) //注意这个@Resource是J2EE的(import javax.annotation.Resource) @Resource public void setUserDao(UserDao userDao) { } public void add(User u){userDao.save(u);} this.userDao = userDao; 四、 @Componet

以上使用@Autowired、@Resource注解时,还是需要在xml文件配置bean,这样就达不到完全使用annotation进行注解。因此现在引用@Component在那个bean前进行注解,表示那个类是需要的bean

有了@Componet注解,这样就不需要在xml文件中配置bean了。

注意:@Componet是Spring的注解(org.springframework.stereotype.Component;)

例如: 前缀部分见上面代码,以此略。。。 bean类中需要使用@Componet(或@Service、@Repository、@Controller)注解这个类是bean。

代码: spring2.5 学习笔记 第19页 共46页

import javax.annotation.Resource; import org.springframework.stereotype.Component; // @Componet注解默认bean的名称是类名首字母小写 // 也可以利用value属性指定bean的名称 @Component(value=\) public class UserService { private UserDao userDao = new UserDaoImpl(); public UserDao getUserDao() {return userDao;} //在这里引用了一个资源,这个资源的名称和这个setter方法后面的成员属性名称一致(userDao) //注意这个@Resource是J2EE的(import javax.annotation.Resource) @Resource public void setUserDao(UserDao userDao) {this.userDao = userDao;} public void add(User u){userDao.save(u);}} 注意:@Componet注解,默认bean的名称是类的首字母小写,当然也可以利用value属性指定bean名称(在annotation中属性为value可以不写,直接写值) 说明:当Spring在加载配置文件时,发现有 标签,并且后面的base-package属性指定了包名 ,就会在这个指定的包名下面搜索灰,看哪个类用@Componet进行了注解,如果有Spring就将其初始化到容器中,认为是一个bean 一般建议@Componet注解后面都指定名称。 五、 @Scope、@PostConstruct、@PreDestroy

@Scope对应于xml配置文件的scope属性 @PostConstruct对应于xml配置文件中的init-method属性 @PreDestroy对于应于xml配置文件中的destroy-method属性 例如如下: import javax.annotation.PostConstruct; import javax.annotation.PreDestroy; import javax.annotation.Resource; import org.springframework.context.annotation.Scope; import org.springframework.stereotype.Component; @Component(value=\) @Scope(\) public class UserService { @PostConstruct public void init(){System.out.println(\现在开始初始化UserService\);} private UserDao userDao = new UserDaoImpl(); public UserDao getUserDao() {return userDao;} @Resource public void setUserDao(UserDao userDao) {this.userDao = userDao;} public void add(User u){ userDao.save(u);} @PreDestroy public void destroy(){System.out.println(\); } spring2.5 学习笔记 第20页 共46页

六、 注解对应的jar包

1、@Autowired 2、@Qualifier 3、@Componet 4、@Resource 5、@Scope

6、@PostConstruct 7、@PreDestroy

org.springframework.beans.factory.annotation.Autowired; org.springframework.beans.factory.annotation.Qualifier; org.springframework.stereotype.Component; javax.annotation.Resource;

org.springframework.context.annotation.Scope; javax.annotation.PreDestroy; javax.annotation.PreDestroy;

第七课:AOP(面向切面编程)

一、 AOP概念

AOP:Aspect Oriented Programming(面向切面编程)

是对面向对象的思维方式的有国补充

二、 利用动态代理实现面向切面编程

场景:需要在执行方法之前加入一些日志。。。 可以使用以下三种方法

1、 继承 2、 组合

3、 动态代理(我们的实例) UserDao接口 public interface UserDao { } UserDaoImpl(UserDao接口的现实) public class UserDaoImpl implements UserDao { } UserService(业务层) public class UserService { } User(实体对象) private UserDao userDao = new UserDaoImpl(); public UserDao getUserDao() {return userDao;} public void setUserDao(UserDao userDao) {this.userDao = userDao;} public void add(User u){ userDao.save(u);} public void delete(User u){ userDao.delete(u);} @Override public void save(User u) {System.out.println(\);} @Override public void delete(User u) {System.out.println(\);} public void save(User u); public void delete(User u);

public class User { } Spring的配置文件 spring2.5 学习笔记 第21页 共46页

private String username; private String password; public String getUsername() {return username; } public void setUsername(String username) {this.username = username;} public String getPassword() {return password; } public void setPassword(String password) {this.password = password;}

spring2.5 学习笔记 第31页 共46页

(二) annotation注解方式的SessionFactory 再是在配置数据源时可以使用占位符(${})获取一些值 bean(org.springframework.beans.factory.config.PropertyPlaceholderConfigurer) classpath:jdbc.properties

spring2.5 学习笔记 第33页 共46页

说明:

1、 首先:如果想使用Spring管理事务,则首需要在配置文件中加入下列(上面红色加粗部分):

xmlns:tx=\ xsi:schemaLocation=”http://www.springframework.org/schema/tx com.wjt276.model.User com.wjt276.model.Log org.hibernate.dialect.MySQLDialect true true http://www.springframework.org/schema/tx/spring-tx-2.5.xsd\> 2、 其次:配置一个事务管理器的bean,这里使用的是Hibernate的事务管理HibernateTransactionManager,也可以使用

org.springframework.jdbc.datasource.DataSourceTransactionManager,,并且需要注入一个SessionFactory的bean,利用这个bean可以获取数据源配置等其它的数据库信息。但要求已经在这之前配置了一个SessionFactory的bean了。 3、 再次:需要在配置文件中告诉Spring,我们需要使用Spring来管理事务,并且要告诉它,使用哪个事务管理器(这里我们就使用

上面的刚则配置的txManager),

注意:这里我们是使用annotation注解方式配置事务管理,所以使用标签 4、 最后:就是对什么方法进行事务管理,只需要在这个方法上加上@Transactional。如下: @Transactional public void add(User u){

…… } spring2.5 学习笔记 第34页 共46页

这样,Spring就会对这个方法进行事务管理了。 5、 实例:

场景:当保存一个用户后,需要向数据库添加一条日志记录,说明已经添加一个用户了。需要使用Spring管理其事务,如果两者有一者发生异常,执都需要进行回滚。 1) 2)

Spring的配置文件同上; 代码

Log实体类 @Entity @Table(name=\) public class Log { } User实体类 @Entity public class User { } UserDao接口的实现 @Component(\) public class UserDaoImpl implements UserDao { LogDao接口的实现 @Component(\) private SessionFactory sessionFactory; public SessionFactory getSessionFactory() {return sessionFactory;} //这里的sessionFactory是使用AOP进行自动装配,切记这是AOP的功能 @Resource(name=\) public void setSessionFactory(SessionFactory sessionFactory) { } //在这里并没有事务的管理,常规这里应该有处理事务的代码,但是现在没有了,因为现在由Spring来管理了。 //我们关心只是业务逻辑了。 @Override public void save(User u) { }} Session session = null; this.sessionFactory = sessionFactory; private int id; private String name; ?? private int id; private String msg; ?? //记住一定需要使用getCurrentSession()来从上下文中获取Session这样Spring才可以管理事务。 session = sessionFactory.getCurrentSession();// session.save(u); System.out.println(\); spring2.5 学习笔记 第35页 共46页

public class LogDaoImpl implements LogDao { private SessionFactory sessionFactory; public SessionFactory getSessionFactory() {return sessionFactory;} //这里的sessionFactory是使用AOP进行自动装配,切记这是AOP的功能,注入的bean的Id是sessionFactory @Resource(name=\) public void setSessionFactory(SessionFactory sessionFactory) { } this.sessionFactory = sessionFactory; //在这里并没有事务的管理,常规这里应该有处理事务的代码,但是现在没有了,因为现在由Spring来管理了。

业务层代码 @Component(value=\) public class UserService { } 这样,只有这个方法中的所有代码没有异常,才会执行完,否则所有的事务将全部回滚

测试代码: public void testAdd_4() throws Exception { ApplicationContext factory = new ClassPathXmlApplicationContext(\); UserService service = (UserService)factory.getBean(\); //只需要在需要进行事务管理的方法上加上 @Transactional public void add(User u){ } userDao.save(u); Log log = new Log(); log.setMsg(u.getName() + \保存成功!\); logDao.save(log); @Transactional 就可以了,Spring就会对其进行事务管理 private LogDao logDao; public LogDao getLogDao() { return logDao;} @Resource(name=\) public void setLogDao(LogDao logDao) { this.logDao = logDao;} public UserDao getUserDao() { return userDao; } //注意这个@Resource是J2EE的(import javax.annotation.Resource) @Resource(name=\) public void setUserDao(UserDao userDao) { this.userDao = userDao; } private UserDao userDao = new UserDaoImpl(); //我们关心只是业务逻辑了。 @Override public void save(Log log) { }} Session session = null; //记住一定需要使用getCurrentSession()来从上下文中获取Session这样Spring才可以管理事务。 session = sessionFactory.getCurrentSession(); session.save(log); System.out.println(\); //利用Spring自动注入功能,将其注入

}

} spring2.5 学习笔记 第36页 共46页

User u = new User(); u.setName(\ + System.currentTimeMillis()); service.add(u); Annotation说明:

(二) Spring事务选项

默认的 @Transactional 设置如下:

? ? ? ? ?

事务传播设置是 PROPAGATION_REQUIRED 使用现有事物,没有则启动新事物 事务隔离级别是 ISOLATION_DEFAULT 事务是 读/写 false

事务超时默认是依赖于事务系统的,或者事务超时没有被支持。

任何 RuntimeException 将触发事务回滚,但是任何 checked Exception 将不触发事务回滚

首先需要在配置文件中,配置事务管理器→告诉Spring需要进行事务管理并指定某个事务管理器→在需要进行事务管理的方法上加上@Transactional就可以了。

@Transactional 注解的属性 属性 传播性propagation 隔离性isolation 只读性readOnly 超时timeout 类型 枚举型:Propagation 枚举型:Isolation 布尔型 int型(以秒为单位) 一组 Class 类的实例,必须是Throwable 的子类 一组 Class 类的名字,必须是Throwable的子类 可选的传播性设置 可选的隔离性级别(默认值:ISOLATION_DEFAULT) 读写型事务 vs. 只读型事务 事务超时 一组异常类,遇到时 必须 进行回滚。默认情况下checked exceptions不进行回滚,仅unchecked exceptions(即RuntimeException的子类)才进行事务回滚。 一组异常类名,遇到时 必须 进行回滚 描述 回滚异常类(rollbackFor) 回滚异常类名(rollbackForClassname) 一组 Class 类的实例,必不回滚异常类(noRollbackFor) 一组异常类,遇到时 必须不 回滚。 须是Throwable 的子类 不回滚异常类名一组 Class 类的名字,必一组异常类,遇到时 必须不 回滚 (noRollbackForClassname) 须是Throwable 的子类

1、 Propagation

key属性确定代理应该给哪个方法增加事务行为。这样的属性最重要的部份是传播行为。有以下选项可供使用:

PROPAGATION_REQUIRED--支持当前事务,如果当前没有事务,就新建一个事务。这是最常见的选择。 PROPAGATION_SUPPORTS--支持当前事务,如果当前没有事务,就以非事务方式执行。 PROPAGATION_MANDATORY--支持当前事务,如果当前没有事务,就抛出异常。 PROPAGATION_REQUIRES_NEW--新建事务,如果当前存在事务,把当前事务挂起。

PROPAGATION_NOT_SUPPORTED--以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。 PROPAGATION_NEVER--以非事务方式执行,如果当前存在事务,则抛出异常。 2、 Isolation Level(事务隔离等级):

1、Serializable:最严格的级别,事务串行执行,资源消耗最大;

spring2.5 学习笔记 第37页 共46页

2、REPEATABLE READ:保证了一个事务不会修改已经由另一个事务读取但未提交(回滚)的数据。避免了“脏读取”和“不可重复读取”的情况,但是带来了更多的性能损失。

3、READ COMMITTED:大多数主流数据库的默认事务等级,保证了一个事务不会读到另一个并行事务已修改但未提交的数据,避免了“脏读取”。该级别适用于大多数系统。

4、Read Uncommitted:保证了读取过程中不会读取到非法数据。

隔离级别在于处理多事务的并发问题。我们知道并行可以提高数据库的吞吐量和效率,但是并不是所有的并发事务都可以并发运行,这需要查看数据库教材的可串行化条件判断了。 我们首先说并发中可能发生的3中不讨人喜欢的事情

1: Dirty reads--读脏数据。也就是说,比如事务A的未提交(还依然缓存)的数据被事务B读走,如果事务A失败回滚,会导致事务B所读取的的数据是错误的。

2: non-repeatable reads--数据不可重复读。比如事务A中两处读取数据-total-的值。在第一读的时候,total是100,然后事务B就把total的数据改成200,事务A再读一次,结果就发现,total竟然就变成200了,造成事务A数据混乱。 3: phantom reads--幻象读数据,这个和non-repeatable reads相似,也是同一个事务中多次读不一致的问题。但是non-repeatable reads的不一致是因为他所要取的数据集被改变了(比如total的数据),但是phantom reads所要读的数据的不一致却不是他所要读的数据集改变,而是他的条件数据集改变。比如Select account.id where account.name=\第一次读去了6个符合条件的id,第二次读取的时候,由于事务b把一个帐号的名字由\改成\,结果取出来了7个数据。

Dirty reads non-repeatable reads phantom reads

Serializable 不会 不会 不会 REPEATABLE READ 不会 不会 会 READ COMMITTED 不会 会 会 Read Uncommitted 会 会 会

3、 readOnly

事务属性中的readOnly标志表示对应的事务应该被最优化为只读事务。这是一个最优化提示。在一些情况下,一些事务策略能够起到显著的最优化效果,例如在使用Object/Relational映射工具(如:Hibernate或TopLink)时避免dirty checking(试图“刷新”)。 4、 Timeout

在事务属性中还有定义“timeout”值的选项,指定事务超时为几秒。在JTA中,这将被简单地传递到J2EE服务器的事务协调程序,并据此得到相应的解释。

(三) XML文件形式配置Spring事务管理

注意:理论同annotation是一样,只是一个是使用annotation的注解方式,而另一个是使用xml配置文件形式,大多数使用xml配置文件方式的。方便

理解了annotation的事务管理,xml事务管理也就方便了,只是个配置问题, 步骤如下:

spring2.5 学习笔记 第38页 共46页

com.wjt276.service..*.*(..))\/>

当然了,配置文件中需要引入命名空间了: xmlns:tx=\ xsi:schemaLocation=”http://www.springframework.org/schema/tx a、首先需要定义切入点pointcut:说明哪些地方需要进行事务管理 b、再使用advisor说明在什么的pointcut下,使用什么的事务管理。就可以了。 http://www.springframework.org/schema/tx/spring-tx-2.5.xsd\>

四、 HibernateTemplate

当我们在多处使用相同的代码时,我们是否考虑对这些代码进行封装呢?这是当前的了。 这就需要使用一种设计模式:Template Method(模板模式) 我们来见一个hibernate中最常的事务代码,如下: public void save(User u) { } 注意到没有,这个代码中,如果在有更新session.update()/删除session.delete(),上面的事务管理都需要重写一次代码。重复的代码是非常的多。这时我们就需要对代码进行封装,也可以说使用模板,把重复的地方放入模板上,在需要使用时,只需要传入不同的地方就可以了。在hibernate中就有这样的模板那就是HibernateTemplate (一) HibernateTemplate org.springframework.orm.hibernate3.HibernateTemplate; HibernateTemplate是Hiberante的模板,因为一定需要SessionFactory等与数据库相关的信息了。 因为当前的HibernateTemplate没有setSessionFactory方法,因此其父类具有setSessionFactory方法,并且HibernateTemplate封装了Session的save、update等方法。使用如下: Session session = null; try { } session = sessionFactory.openSession(); session.beginTransaction(); session.save(u); //session.update(u); session.getTransaction().commit(); session.getTransaction().rollback(); e.printStackTrace(); session.close(); } catch (HibernateException e) { } finally { spring2.5 学习笔记 第39页 共46页

import org.springframework.orm.hibernate3.HibernateTemplate; @Component(\) public class UserDaoImpl implements UserDao { 因为HibernateTemplate需要交给Spring来管理,因为也需要配置bean,及注入sessionFactory (二) HibernateDaoSupport @Resource(name=\) public void setHibernateTemplate(HibernateTemplate hibernateTemplate) { } @Override public void save(User u) { }} hibernateTemplate.save(u); //这里可以直接save了,session已经被hibernateTemplate处理了。我们不需要关心它了。 //因为HibernateTemplate中已经注入了SessionFactory了,因为它自己会处理好session及其事务的。 System.out.println(\); this.hibernateTemplate = hibernateTemplate; private HibernateTemplate hibernateTemplate; public HibernateTemplate getHibernateTemplate() {return hibernateTemplate;} 这也是使用HibernateTemplate的方法之一,只是需要dao继承这个类, 实例: public class LogDaoImpl extends HibernateDaoSupport implements LogDao { } dao继承了HibernateDaoSupport类,而这个又拥有sessionFactory和hibernateTemplate的setXXX方法,只要我在初始化这个dao时,注入两个其中一个就可以了。但是历这两个setXX方法都为final的,因为不可以重写,这样就不能使用annotation的方式了,只能使用xml的方法了。如下: 但是问题又来了,如果dao有多个(甚至几个以上),这样就会有大量的xml配置文件,每个dao需要一个配置一个bean,并且在这个bean中需要注入一个sessionFactory或是hibernateTemplate,这样的工作量是非常的大,并且容易出错。 针对有大量的dao我们提供一个解决方案: 我们可以创建一个类,并且这个类来继承hibernateDaoSupport这个类,由于hibernateDaoSupport类的sessionFactory和hibernateTemplate的setXXX方法是final的,因此不能重写,但我们可以在这个类中注入一个sessionFactory或hibernateTemplate但是setXXX方法名,用其它的。然后让dao来继承这个类,这就dao就可以使用annotation方式注解了。代码如下: 父类 @Override public void save(Log log) { } //this.save(log); this.getHibernateTemplate().save(log); System.out.println(\); spring2.5 学习笔记 第40页 共46页

package com.wjt276.dao.impl; import javax.annotation.Resource; import org.springframework.orm.hibernate3.HibernateTemplate; import org.springframework.orm.hibernate3.support.HibernateDaoSupport; import org.springframework.stereotype.Component; @Component public class SuperDao extends HibernateDaoSupport { } 其它的dao继承这个就可以了 LogDaoImpl @Component public class LogDaoImpl extends SuperDao implements LogDao { } UserDaoImpl @Component(\) public class UserDaoImpl extends SuperDao implements UserDao { @Override public void save(User u) { }} this.getHibernateTemplate().save(u); //这里可以直接save了,session已经被hibernateTemplate处理了。我们不需要关心它了。 //因为HibernateTemplate中已经注入了SessionFactory了,因为它自己会处理好session及其事务的。 System.out.println(\); @Override public void save(Log log) { } this.getHibernateTemplate().save(log); //this.save(log); @Resource(name=\) public void setSuperHibernateTemplate(HibernateTemplate hibernateTemplate ){ } //在这里为父类HibernateDaoSuppport注入hibernateTemplate或是sessionFactory super.setHibernateTemplate(hibernateTemplate); System.out.println(\);

spring2.5 学习笔记 第41页 共46页

第十一课:Spring整合-SSH

Struts2.1.6 + Spring2.5.6 + Hibernate3.3.2

一、 第一步:加入jar包(需要的jar包列表)

jar包名称 antlr-2.7.6.jar aspectjrt aspectjweaver cglib-nodep-2.1_3.jar common-annotations.jar commons-collections-3.1.jar commons-fileupload-1.2.1.jar commons-io-1.3.2 commons-logging-1.1.1 dom4j-1.6.1.jar ejb3-persistence freemarker-2.3.13 hibernate3.jar hibernate-annotations hibernate-common-annotations javassist-3.9.0.GA.jar jta-1.1.jar junit4.5 mysql- ognl-2.6.11.jar slf4j-api-1.5.8.jar slf4j-nop-1.5.8.jar spring.jar struts2-core-2.1.6.jar xwork-2.1.2.jar commons-dbcp commons-pool.jar struts2-spring-plugin-2.1.6.jar 建议:

将这些所有的jar包保存到一个位置,使用的时候直接copy

所在位置 hibernate/lib/required spring/lib/aspectj .. spring/lib/cglib spring/lib/j2ee hibernate/lib/required struts/lib struts/lib 单独下载,删除1.0.4(struts/lib) hibernate/required hibernate-annotation/lib struts/lib hibernate hibernate-annotation/ hibernate-annotation/lib hiberante/lib/required .. struts/lib hibernate/lib/required hibernate/lib/required spring/dist struts/lib struts/lib spring/lib/jarkata-commons .. struts/lib 说明 解析HQL AOP AOP 代理,二进制增强 @Resource 集合框架 struts struts struts spring 解析xml @Entity struts hibernate hibernate transaction hibernate-log struts2 spring2.5 学习笔记 第42页 共46页

二、 第二步: 首先整合Spring + Hibernate

具体的方法,请见第十课

三、 第三步:再来整合Struts2

因为SSH时,是Struts2为主导,Struts2向Spring索要Action,Action是由Spring产生的。 因为Spring作为Struts2的一个插件加入到Struts2里的。

具体步骤: 1. 2. 3.

加入Struts2的配置文件:struts2.xml 修改web.xml加入 struts的filter struts2 org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter struts2 /* lter-class> 再加入spring的listener,这样的话,webapp一旦启动,spring容器就初始化了

因为webapp启动时Spring并不会自动启动,那当然就不能初始化bean了,因为需要在webapp启动就自动启动Spring容器,这样可以将bean交给Spring来管理。我们可以利用listener来完成

这就是需要使用Struts2 for spring的插件了,那当然就需要引入struts2 for spring plugin的jar包了

struts2-spring-plugin-2.1.8.1.jar

并加入Struts2-spring-plugin的配置文件,来告诉webapp启动来初始化spring容器

需要在web.xml加入监听器 am-value> org.springframework.web.context.ContextLoaderListener contextConfigLocation classpath*:beans.xml

4. 5.

规划struts的action和jsp展现 建立好action和jsp spring2.5 学习笔记 第43页 共46页

修改配置,由spring替代struts产生Action对象 注意:现在SSH整合后,action将不再是Spring管理,而是Struts-spring-plugin来管理。或是说Struts2来管理了。 因此:Action上不需要注解任务的,Struts启动后,将Action其初始化后放心Struts2的一个容器里,而其它的还是Spring来管理。Struts2初始化时,会自动根据Action中的setXXX方法全部自动注入,注入的bean是从Spring容器中提取的。

在Action中不管你有没有注解,Struts2都会自动帮你注入,并且使用名称的方式注入,如果您想指定注入名称,则可以在成员属性前面进行注解。 而Action这个bean的ID就是在Struts2.xml的配置文件中配置Action的name属性值就是了。注意了。 Struts2:Action Spring管理:dao/servce 6. 修改action配置 注意了:Actionr配置的name不能与Action中的成员属性名称发生冲突,因为Struts2自动注入成员属性的bean,而且是根据name来注入的。 四、 struts的读常量: 1. 2. 3. 4. 5.

struts-default.xml struts-plugin.xml struts.xml struts.properties web.xml

第十二课:DTO、VO

一、 DTO

Data Transfer Object 负责运送数据的(传输数据)

二、 VO

Value Object 值对象

可用于,from里与数据库不一致时。就可以使用了。然后再构建实体类

注意:实体对象是反映到数据库中,而值对象只是在使用数据时才用到。

spring2.5 学习笔记 第44页 共46页

第十二课:SSH整合存在的问题

一、 Jsp中访问Session时,Session已经关闭

由于hibernate的load的方法是返回一个代理,而这个代理只有在实际使用时,才会发出SQL语句(才会访问数据库),当对象在JSP中使用时,load方法的事务已经关闭,也就是说session已经关闭,这时jsp才开始使用这个代理对象,才开始正直访问数据库发出SQL语句,发现session已经关闭,所以访问不了。

解决法办:就是让session在JSP使用后,才关闭,

具体:添加一个过滤器,在访问前经过过滤器,这时开启事务opsession。然后等方法结束时(JSP已经处理完数据了),还是要经过滤过器,才时我们才关闭session,这样就OK了。

Spring已经帮我处理好了:我们只需要配置这个过滤器就可以了,需要在web.xml中配置这个过滤器: org.springframework.orm.hibernate3.support.OpenSessionInViewFilter openSessionInView org.springframework.orm.hibernate3.support.OpenSessionInViewFilter openSessionInView /* 注意:这相filter必需放在Struts2的filter前面。否则出现问题。 在OpenSessionViewFilter在初始化时,需要提供一个SessionFactory的bean,默认是搜索bean名称为sessionFactory,如果你在配置sessionFactory不是这个名称,那么你需要在配置这个filter时,需要提供一个参数及值。如下: org.springframework.orm.hibernate3.support.OpenSessionInViewFilter sessionFactoryBeanName sf r-class> openSessionInView openSessionInView /* 这样在JSP中访问session就没有问题了。 二、 如果不配置事务,openSessionView出现异常

如果在web.xml文件中配置了。openSessionInView选项,而在beans.xml没有配置事务。这样在对数据库进行写操作时,会提示错误,原因:

因为:如果spring没有配置事务,则openSessionInview会默认设置,事务为只读事务。不能进行写操作。 配置事务了。openSessionInView认为是读写。

spring2.5 学习笔记 第45页 共46页

三、 中文乱码问题:

1、 如果是Struts2.1.6或是之前的,则使用Strunts2的i18n设置是无效,因为我们需要通过过虑器来进行,我们可以自己定义一个过虑器,但Spring已经帮我定义好了这个过虑器了。我们直接取来使用就可以了。

需要为这个filter的encoding属性指定一个参数值(就是中文编码) encodingFilter org.springframework.web.filter.CharacterEncodingFilter encoding GBK encodingFilter /* 注意:这个filter需要放在web.xml的Struts2的filter前面。但是与openSessionInView没有前后关系。

2、 如果是Struts2.1.8这个Bug已经修正,我们只需要在Struts.xml文件中配置一个属性就可以了:如下:

LazyInitializationException OpenSessionInViewFilter 需要严格顺序问题

需要加到struts2的filter前面 知识点名称 IOC XML IOC Annotation IOC 注入方式(两种) 简单属性 集合注入 自动装配 生命周期 AOP概念 AOP配置 事务管理AOP(xml annotation) hibernateTemplate 架构 OpenSessionInView CharacterEncodingFilter TestContext SpringJDBCTemplate 介绍 工作重要程度 *** *** *** * * * * * *** *** *** *** *** * 面试重要程度 * * * *** ** *** ** 方法建议 练 练 练+背 查 查 查 练+背 练+理解+说 用到现学

spring2.5 学习笔记 第46页 共46页

第十三课:SSH整合的jar包

一、 Struts2

1、 建立Struts2的配置文件(struts.xml)

2、 lib目录中的除junit和spring-test之外的所有文件

1) 2) 3) 4) 5) 6) 7)

xwork-2.1.2.jar

freemarker-2.3.13.jar struts2-core-2.1.6.jar ognl-2.6.11.jar

commons-io-1.3.2.jar

commons-fileupload-1.2.1.jar commons-logging-1.1.jar

1. struts2-spring-plugin-2.1.8.1.jar

二、 Hibernate3.3.2

1、 hibernate3.jar 2、 /lib/required

1) 2) 3) 4) 5) 6)

javassist-3.9.0.GA.jar commons-collections-3.1.jar antlr-2.7.6.jar dom4j-1.6.1.jar slf4j-api-1.5.8.jar jta-1.1.jar

3、 Slf-nop jar

4、 引入mysql的JDBC驱动名 5、 hibernate-annotations.jar 6、 ejb3-persistence.jar

7、 hibernate-commons-annotations.jar

8、 搭建日志:我们使用slf接口,然后使用log4j的实现。

1) 2) 3) 4)

首先引入log4j的jar包(log4j-1.2.14.jar),

然后再引入slf4j实现LOG4J和适配器jar包(slf4j-log4j12-1.5.8.jar)

最后创建log4j的配置文件(log4j.properties),并加以修改,只要保留 log4j.logger.org.hibernate.tool.hbm2ddl=debug

三、 Spring

1、 spring.jar

2、 commons-logging.jar

3、 aspectjweaver.jar 4、 aspectjrt.jar

5、 cglib-nodep-2.1.3.jar 6、 commons-dbcp.jar 7、 commons-pool.jar

本文来源:https://www.bwwdw.com/article/gwgo.html

Top