悟生慧

 

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&amp;characterEncoding=UTF-8"/> 注意:&在xml中转义&amp
<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>


 

posted on 2011-07-12 22:03  悟生慧  阅读(2419)  评论(0编辑  收藏  举报

导航