让spring管理struts,spring管理hibernate

 

hibernate
org.accp.hibernate.po
org.accp.hibernate.dao
org.accp.well.delegate
    4. 导入日志配置文件src/log4j.properties
    5. 导入mysql.jar,不能拷贝到lib下,也找不到,这时要在buildPath中导入外部jar
    6. 如果报错:<url>这里不能有空格或回车符</url>

二、spring整合hibernate
    1. 查看applicationContext.xml有了变化,多了hibernate的配置
    2. 建立表的映射
       选择数据库视图,accp数据库
       生成users.hbm.xml与Users.java
       去掉catagory属性,否则会报错
       也在applicationContext.xml中增加了映射
    3. 整合hibernate有两种方式
    4. 第一种方式,继承
       org.springframework.orm.hibernate3.HibernateTemplate,该类是spring封装了操作 Hibernate的实现细节的类,用于代替Session的相关操作
      1)在dao包中写接口IDao,
        public interface IDao {
public void save(Users u);
public List getAll();
public boolean validate(Users u);
        }

        UserDao extends HibernateDaoSupport implements IDao
public class UserDao extends HibernateDaoSupport implements IDao{
    public void save(Users u){
      this.getHibernateTemplate().save(u);
    }
}
      2)在spring中配置UserDao,从哪取连接,property二择其一
         给继承了HibernateDaoSupport的对象我们注入一个sessionFactory 对象也可以,他会自动生成一个hibernateTemplate对象
<bean id="userdao" class="org.accp.hibernate.dao.UserDao">
    <property name="sessionFactory" ref="sessionFactory" />
    <!--<property name="hibernateTemplate" ref="hibernateTemplate"/>-->
</bean>
      3)测试
         导入mysql.jar,不能拷贝到lib下,也找不到,这时要在buildPath中导入外部jar
去掉users.hbm.xml中的catagory属性,否则会报错
  ////////////////////////////////////ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");
   IDao dele = (IDao)ac.getBean("userdao");
   Users u = new Users();
   u.setUid("userdao");
   u.setPwd("123");
   u.setVersion(2);
   dele.save(u);
     
    5. 第二种方式
      1) 新建一个类UserDao2,加一成员变量HibernateTemplate
          加一构造函数,注入sessionFactory
   加一setter方法,注入sessionFactory
      public class UserDao2 implements IDao{
private HibernateTemplate hibernateTemplate;
public UserDao2(HibernateTemplate hibernateTemplate) {
   this.hibernateTemplate = hibernateTemplate;
}
public void save(Users u){
   hibernateTemplate.save(u);
}
       }
     
      2) 改配置文件applicationContext.xml
<bean id="userdao2" class="org.accp.hibernate.dao.UserDao2">
    <constructor-arg>
      <ref bean="hibernateTemplate"/>
    </constructor-arg>
</bean>
<bean id="hibernateTemplate" class="org.springframework.orm.hibernate3.HibernateTemplate">
<property name="sessionFactory">
   <ref bean="sessionFactory"/>
</property>
</bean>

    6. HibernateDaoSupport与连接的管理
自动关闭连接会造成延迟加载初始化异常,此时可用OpenSessionInView模式解决。Spring提供Open Session In View来解决这个问题
Filter,在web.xml中配置
<filter>
    <filter-name>hibernateFilter</filter-name>
    <filter-class>org.springframework.orm.hibernate3.support.OpenSessionInViewFilter</filter-class>
</filter>  
<filter-mapping>
    <filter-name>hibernateFilter</filter-name>
    <url-pattern>*.do</url-pattern>
</filter-mapping>

加了这个配置,就要加监听器和初始文件的参数,否则报错
<context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>/WEB-INF/applicationContext.xml</param-value>
</context-param>
<listener>  
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
  
    7. spring整合hibernate事务
     Spring提供的事务管理可以分为两类:编程式的和声明式的。
     声明式的,其DAO必须要有接口,否则声明式事务就会报错。配置文件
<bean id="userdao" class="org.accp.hibernate.dao.UserDao">
    <property name="sessionFactory" ref="sessionFactory"></property>   
</bean>

<bean id="transactionManager"
         class="org.springframework.orm.hibernate3.HibernateTransactionManager">
         <property name="sessionFactory">
             <ref bean="sessionFactory"/>
         </property>
</bean>

     <bean id="proxyTemplate" class="org.springframework.transaction.interceptor.TransactionInterceptor">
   <property name="transactionManager">
    <ref bean="transactionManager"/>
   </property>
   <property name="transactionAttributes">
    <props>
     <prop key="save*">PROPAGATION_REQUIRED</prop>
     <prop key="query*">PROPAGATION_REQUIRED,readOnly</prop>
    </props>
   </property>
    </bean>

    <bean id="nameproxy" class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">
   <property name="beanNames">
     <list><value>userdao4</value></list>
   </property>
   <property name="interceptorNames">
          <list>
     <value>proxyTemplate</value>
          </list>
   </property>
    </bean>
不用事务,即使报错也始终能插入进去一条。用了事务,一报错则一条都不进去。
     配置完成前,将defaultAutoCommit设成false后,始终插入不进去。
     配置完成后,将使用声明式事务能插入进去了。

    8. sql提高,修改UserDao
// executeFind返回集合
public List query() {
   return this.getHibernateTemplate().executeFind(new HibernateCallback() {
    public Object doInHibernate(Session session) throws HibernateException,
      SQLException {
     return session.createQuery(
       "from " + cls.getName() + " as a order by a.uid desc").list();
    }
   });
}

// execute返回对象
public boolean validate(final Users u) {
   List ls = (List) this.getHibernateTemplate().execute(
     new HibernateCallback() {
      public Object doInHibernate(Session session)
        throws HibernateException, SQLException {
       Query qy = session
         .createQuery("from Users u where u.uid=:uid and u.pwd=:pwd");
       qy.setString("uid", u.getUid());
       qy.setString("pwd", u.getPwd());
       List li = qy.list();
       return li;
      }
     });
   return (ls.size() > 0);
}

三、spring整合struts
   1. 导入struts,选择struts1.2的jar包
      建立包:org.accp.struts
      copy到当前目录下
   2. 在struts-config.xml中新建login用例
      form/action/jsp,use case=login
   3. 加上跳转页面
      新增succ.jsp
      succ对应succ.jsp,fail对应login.jsp
   4. 引入IOC,在action中引入代理
      写代理UserDelegate,有保存、验证、查询所有的记录三个方法
public class UserDelegate {
//一定要是IDao而不是UserDao,因为有了事务,自动代理将截获后返回的是IDao
private IDao dao;
public void setDao(IDao dao) {
   this.dao = dao;
}
public boolean validate(String uid,String pwd){
   return dao.validate(uid, pwd);
}
public List getAll() {
   return dao.getAll();
}
public void save(Users u) {
   dao.save(u);
}
}
      修改LoginAction,注入UserDelegate
       private UserDelegate ud;
public void setUd(UserDelegate ud) {
   this.ud = ud;
}
      在action中写上登陆验证代码
   String uid = loginForm.getUid();
   String pwd = loginForm.getPwd();
   if(ld.validate(uid, pwd))
    return mapping.findForward("succ");
   return mapping.findForward("fail");
   5. 在struts中引入spring
      在struts-config.xml中注册,引入spring的插件,在message-resources标签后:
<plug-in className="org.springframework.web.struts.ContextLoaderPlugIn">
      <set-property property="contextConfigLocation" value="/WEB-INF/classes/applicationContext.xml"/>
</plug-in>
   6. 让spring管理struts的action,有三种方式,采用第一种方式
      1) 最简单的一种,改变其请求处理器:
      <controller processorClass="org.springframework.web.struts.DelegatingRequestProcessor" />
      2) 在struts的action中直接继承spring的一个ActionSupport
      3) 改action的配置中的type,换成spring的一个代理,这个每个action都要改,比较麻烦
         <type="org.springframework.web.struts.DelegatingActionProxy" >
   7. 在spring的applicationContext.xml中注册struts的action和代理
      其name(不能是id)对应于struts-config.xml中的path
       <bean name="/login" class="org.accp.struts.action.LoginAction">
    <property name="ud" ref="ud"></property>
</bean>
<bean id="ud" class="org.accp.well.delegate.UserDelegate">
    <property name="dao" ref="userdao"></property>
</bean>

四、部署运行
   1. 发布
   2. 如果导入spring时,没有选中web的jar包,则集成到struts会出错
   3. 测试一切正常
   3. 出现java.lang.NoClassDefFoundError:   
org/hibernate/cfg/HbmBinder$SecondPass 错误
这个应该是MyEclipse5GA中的hibernate3.1中的hibernate-annotations.jar 版本不对导致的。最简单的解决办法是把lib目录中的hibernate-annotations.jar文件删掉。要从部署文件中删除
   4. 将applicationContext.xml放到与web.xml平级目录
      修改struts-config.xml的配置,改<plug-in>路径
      再测试一切正常
   5. 将与struts的集成改成第一种方式
      改<action>标签的type
      加
      <controller processorClass="org.springframework.web.struts.DelegatingRequestProcessor" />
      再测试一切正常
   6. 看日志,session的开闭
[http-8080-Processor25] DEBUG org.springframework.orm.hibernate3.SessionFactoryUtils   - Opening Hibernate Session
...
[http-8080-Processor25] DEBUG org.hibernate.impl.SessionImpl   - closing session

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值