Spring2.5+Hibernate3.3的集成
框架集成
先整合Spring2.5+Hibernate3.3
hibernate核心安装包下的(下载路径:http://www.hibernate.org/)点击 "hibernate Core"右边的Downloads
hibernate3.jar
lib\bvtecode\colib\hibernate-cglib-repack-2.1_3.jar
lib\required\*.jar
hibernate 注解安装包下的(下载路径:www.hibernate.org,点击"Hibernate Annotations"右边的"Downloads")
hibernate-annotations.jar
lib\ejb3-persistence.jar hibernate-commons-annotations.jar
Hibernate针对JPA的实现包(下载路径:www.hibernate.org,点击"Hibernate Entitvmanaoer"右边的"DownLoads")
hibernate-entitymanager.jar
lib\test\log4j.jar、slf4j-log4j12.jar
Spring安装包下的
dist\spring.jar
lib\c3p0\c3p0-0.9.1.2.jar lib\aspecti\aspectjweaver.jar、aspectjrt.jar、lib\colib\cglib-nodep-2.1_3.jar
\lib\j2ee\common-annotations.jar lib\log4j-1.2.15.jar
lib\jakarta-commons\commons-logging.jar
新建WEB项目
拷贝 hibernate的jar包 Spring的jar包 到WEB-INF的lib下MySql的数据库驱动类也要拷贝进
提供spring配置文件 新建New-->XML文件 通常取名beans.xml
拷贝spring的配置模板在例子、参考手册上拷贝
配置和hibernate集成 bean交给spring管理之外 还可以扫描加注解方式来做
<bean></bean>
/***扫描加注解****/
<context:component-scan base-package="cn.itcast"/>代表要扫描的包 会扫描包下的类包括子包下
把Hibernate集成到Spring
<sessionFactory>单例模式?因为这个对象的创建过程很耗线程
hibernate的事务管理也要交给spring管理
/***数据源***/
<bean id="dataSource" class="com.mchange.v2.c3po.ComboPooledDataSource" destroy-method="close">
<property name="driverClass" value="org.gjt.mm.mysql.Driver">
<property name="jdbcUrl" value="jdbc:mysql://localhost:3306/itcast?useUnicode=true&characterEncoding=UTF-8"/> 注意:&在xml中转义&
<property name="user" value="root"/>
<property name="password" value="123456"/>
<!--初始化是获取的连接数,取值应在minPoolSize与maxPoolSize之间 Default:3-->
<property name="initialPoolSize" value="1"/>
<!--连接池中保留的最小连接数。Default:15-->
<property name="minPoolSize" value="1"/>
<!--连接池中保留的最大连接数。Default:15-->
<property name="maxPoolSize" value="300"/>
<!--最大空闲时间,60秒内未使用则连接被丢弃。若为0则不丢弃。Default:0-->
<property name="maxIdleTime" value="60"/>
<!--当连接池中的连接耗尽的时候c3po一次同时获取的连接-->
<property name="acquireIncrement" value="5"/>
<!--每60秒检查所有连接池中的空闲连接 Default:0-->
<property name="idleConnectionTestPeriod" value="60"/>
</bean>
/***数据源配置***/
集成SessionFactory
<bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"> 接管hibernate事务管理
<property name="dataSource" ref="dataSource"/> /***数据源***/
<property name="mappingResources">
<list>
<value>cn/itcast/bean/Employee.hbm.xml</value> /****hibernate的映射文件***/ 需要制定
</list>
</property>
<property name="hibernateProperties">
<value>
hibernate.dialect=org.hibernate.dialect.MySql5Dialect /***方言MySQL***/
hibernate.hbm2ddl.auto=update /***映射文件生成表结构***/
hibernate.show_sql=false
hibernate.format_sql=false
</value>
</property>
</bean>
第三步使用Spring容器管理事务服务:
/***底层需要Session.begins...开始事务***/
<bean id="txtManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory"/> 需要SessionFactory获取Session所以要注入
</bean>
Spring的配置声明哪几种方式: 有两种
1:基于注解的方式 纯Action方式注解
2:xml的方式 配置那些类需要事务
采用注解定义事务比xml灵活一些,采用注解会带来高度耦合
采用基于注解的方式
<!--使用基于注解方式配置事务-->
<tx:annotation-driven Transaction-manager="txManager"/> 这个属性事务管理器注入进去 仅起到标注配置的作用有解析类
提出简单的业务需求:
实现员工的列表/添加功能
首先设置员工的实体
public class Empolyee{
private String username;
private String password;
paivate Gender gender=Gender.Man
//生成Get和Set方法
配置实体的映射数据 有两种方式:一种xml配置方式 另一种是注解方式
xml的好处 不会带有很强的侵入性 注解方式的缺点是带有很强的侵入性优点是开发速度快效率快
新添加属性还是要修改源代码和xml文件
使用原始的xml文件配置映射数据
}
public enum Gender{
MAN,
WOMEN;
}
Employee.hbm.xml
配置模板拷贝
<hibernate-mapping package="cn.itcast.bean">
<class name="Employee" table=""> 实体类 对应的表
<id name="username" length="20"/>
<property name="password" length="20" not-null="true"/>
<property name="gender" not-null="true" length="5"> 枚举类型
<type name="org.hibernate.type.EnumType">
<param name="enumClass">cn.itcast.bean.Gender</param>
<!--12为java.sql.Types.VARCHAR常量值,即保存枚举的字面值到数据库。如果不指定type参数,保存枚举的索引值(从0开始)到数据库-->
</param name="type">12</param> 要映射的数据类型 默认不提供参数会映射Int类型到数据库
</type>
</property>
</class>
</hibernate-mapping>
如何校验这段配置是否成功~
@Service @Transactional
@Resource SessionFactory factory;
==============================================
struts2-core-2.x.x.jar:Struts框架的核心类库
Xwork-core-2.x.x.jar :XWork类库,Sturts2在其上构建
ognl-2.6.x.jar对象导航语言,Struts2框架通过其读写对象的属性
commons-fileupload-1.2.x.jar文件上传组件,2.1.6版本后需要加入此文件
web.xml
<!--指定spring的配置文件,默认从WEB根目录寻找配置文件,我们可以通过spring提供的classPath:前缀指定从类路径下寻找-->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:beans.xml</param-value>
</context-param>
<!--对Spring容器进行实例化-->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<filter>
<filter-name>struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuterFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
struts.xml
<struts>
<constant name="struts.objectFactory" value="spring"/> 使用spring的Bean工厂的名称
<package name="employee" namespace="/employee" extends="struts-default">
<action name="list" class="cn.itcast.action.Employee"> 从spring中获取action bean的名称
</action>
</package>
</struts>
创建Action
package cn.itcast.action;
import org.springframework.stereotype.Controller;
@Controller 注解 表示交给Spring管理
public class EmployeeAction {
@Resource EmployeeService employeeService; //注解把业务beng注进来
public String execute(){
ActionContext.getContext().put("employee",employeeService.list());
return "list";
}
}
迭代展示页面
<body>
ONGL:
<br/>
<s:iterator value="#request.employee">
<s:property value="username"/>,<s:property value="password"/>,<s:property value="gender"/>
</s:iterator>
<br/>
/***加入JSTL的jar包 <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>***/
JSTL/EL:
<c:forEach items="${employees}" var="employee">
${employee.username},${employee.password},${employee.gender},
</c:forEach>
</body>
添加页面
<s:form name="manage_add" namespace="/employee" method="post">
用户名:<s:textfield name="employee.username"></s:textfield>复合类型采用的方式
</s:form>
先创建Action
package cn.itcast.action;
import org.springframework.stereotype.Controller;
@Controller 交给Spring管理 @Scope("prototype")修改为这种类型每次请求Spring都会创建Action否则是单例模式会被其它访问所修改
public class EmployeeManageAction{
@Resource EmployeeServiec employeeService; //注入业务Bean
public String addUI(){
return "add";//返回视图
}
public String add(){
employeeService.save(employee);
ActionContext.getContext().put("message","保存成功");
return "message";
}
}
struts.xml配置在定义个Action
<package>
<action name="message_*" class="employeeManagerAction" method="{1}">
<result name="add">/WEB-INF/page/employeeAdd.jsp</result>
<result name="message">/WEB-INF/page/message.jsp</result>
</action>
</package>