论坛首页 Java企业应用论坛

ssh 三者集合的思想

浏览 12173 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2007-11-21  

一、首先应该明白,在SSH中,spring做了两次集成,第一次是与struts做了集成,第二次是与hibernate集成。

二、下面来谈第一次集成,与struts集成,通过修改struts-config.xml 中的action type 为 org.springframework.web.struts.DelegatingActionProxy,将action的控制转到spring 容器,当转到spring容器, spring会在spring的配置文件中找与action 的path属性同名的bean从而执行相应的类的操作.

  1.  <action  
  2.      attribute="loginForm"  
  3.      input="login.jsp"  
  4.      name="loginForm"  
  5.      path="/login"  
  6.      scope="request"  
  7.      type="org.springframework.web.struts.DelegatingActionProxy" >  
  8.   
  9. <bean name="/login" class="com.ssh.action.LoginAction" singleton="false">  
  10. <property name="dao">  
  11. <ref bean="UsersDAOImp"/>  
  12. property>  
  13. bean>  
xml 代码

 三、第二次集成,与hibernate集成, DAO 继承了org.springframework.orm.hibernate3.support.HibernateDaoSupport类,所以可以简单的利用sping提供的一些功能。 HibnernateDaoSupport实现了HibernateTemplate与SessionFactory的关联。HibernateTemplate(用HibnernateDaoSupport里的getHibernateTemplate()可以获得)对Hibernate Session进行了封装,可省去获得Session实例、事务启动与提交/回滚以及异常处理等一系列步骤,所以非常简单。

java 代码
  1. public class UsersDAOImp extends HibernateDaoSupport implements UserDao {   
  2.   
  3.     private static final Log log = LogFactory.getLog(UsersDAOImp.class);   
  4.   
  5.     protected void initDao() {   
  6.         //do nothing   
  7.     }   
  8.        
  9.   /* (non-Javadoc)  
  10.  * @see com.ssh.dao.impl.aa#save(com.ssh.entity.Users)  
  11.  */  
  12. public void save(Users transientInstance) {   
  13.         log.debug("saving Users instance");   
  14.         try {   
  15.             getHibernateTemplate().save(transientInstance);   
  16.             log.debug("save successful");   
  17.         } catch (RuntimeException re) {   
  18.             log.error("save failed", re);   
  19.             throw re;   
  20.         }   
  21.     }   
  22.        
  23.     /* (non-Javadoc)  
  24.      * @see com.ssh.dao.impl.aa#delete(com.ssh.entity.Users)  
  25.      */  
  26.     public void delete(Users persistentInstance) {   
  27.         log.debug("deleting Users instance");   
  28.         try {   
  29.             getHibernateTemplate().delete(persistentInstance);   
  30.             log.debug("delete successful");   
  31.         } catch (RuntimeException re) {   
  32.             log.error("delete failed", re);   
  33.             throw re;   
  34.         }   
  35.     }   
  36.        
  37.     /* (non-Javadoc)  
  38.      * @see com.ssh.dao.impl.aa#findById(java.lang.Integer)  
  39.      */  
  40.     public Users findById( java.lang.Integer id) {   
  41.         log.debug("getting Users instance with id: " + id);   
  42.         try {   
  43.             Users instance = (Users) getHibernateTemplate()   
  44.                     .get("com.ssh.entity.Users", id);   
  45.             return instance;   
  46.         } catch (RuntimeException re) {   
  47.             log.error("get failed", re);   
  48.             throw re;   
  49.         }   
  50.     }   
  51.        
  52.        
  53.     /* (non-Javadoc)  
  54.      * @see com.ssh.dao.impl.aa#findByExample(com.ssh.entity.Users)  
  55.      */  
  56.     public List findByExample(Users instance) {   
  57.         log.debug("finding Users instance by example");   
  58.           
  59.         try {   
  60.             List results = getHibernateTemplate().findByExample(instance);   
  61.             log.debug("find by example successful, result size: " + results.size());   
  62.             return results;   
  63.         } catch (RuntimeException re) {   
  64.             log.error("find by example failed", re);   
  65.             throw re;   
  66.         }   
  67.     }       
  68.        
  69.     /* (non-Javadoc)  
  70.      * @see com.ssh.dao.impl.aa#findByProperty(java.lang.String, java.lang.Object)  
  71.      */  
  72.     public List findByProperty(String propertyName, Object value) {   
  73.       log.debug("finding Users instance with property: " + propertyName   
  74.             + ", value: " + value);   
  75.       try {   
  76.          String queryString = "from Users as model where model."    
  77.                                 + propertyName + "= ?";   
  78.          return getHibernateTemplate().find(queryString, value);   
  79.       } catch (RuntimeException re) {   
  80.          log.error("find by property name failed", re);   
  81.          throw re;   
  82.       }   
  83.     }  
<property name="dao">
</property>

代码不全。

四、当然,你得首先把spring环境搭起来,通过在struts-config.xml
增加 
xml 代码

<plug-in classname="org.springframework.web.struts.ContextLoaderPlugIn"></plug-in>

  1. <plug-in className="org.springframework.web.struts.ContextLoaderPlugIn">  
  2.     <set-property property="contextConfigLocation"    
  3.             value="/WEB-INF/applicationContext.xml" />  
  4. plug-in>  


         

 


 

   发表时间:2007-11-22  
Spring 提供的方法集成并不好,如果使用Spring的ActionSupport替换的struts的Action造成spring代码的入侵,如果把action注册为spring bean,问题是你不得不多维护一个配置文件。。。另外可以使用spring工具类从web层取得ApplicationContext, 再按需要取得bean(用一个大的ServiceFacade类管理所有的service),只要几行代码就可以实现,同时也很容易切换到其它框架上(假如你不使用spring),我比较喜欢这种方式。
Spring提供的Hibernate集成,我最不喜欢的是为什么提供一个hibernate.cfg.xml文件,还需要配置其它的东西。我希望的一个配置sessionFactory时指定一个Hibernate配置文件就完了。这样才叫松散耦合。
0 请登录后投票
   发表时间:2007-11-22  
hantsy 写道
Spring 提供的方法集成并不好,如果使用Spring的ActionSupport替换的struts的Action造成spring代码的入侵,如果把action注册为spring bean,问题是你不得不多维护一个配置文件。。。另外可以使用spring工具类从web层取得ApplicationContext, 再按需要取得bean(用一个大的ServiceFacade类管理所有的service),只要几行代码就可以实现,同时也很容易切换到其它框架上(假如你不使用spring),我比较喜欢这种方式。
Spring提供的Hibernate集成,我最不喜欢的是为什么提供一个hibernate.cfg.xml文件,还需要配置其它的东西。我希望的一个配置sessionFactory时指定一个Hibernate配置文件就完了。这样才叫松散耦合。

不需要hibernate.cfg.xml
0 请登录后投票
   发表时间:2007-11-22  

[quote="hantsy"]我最不喜欢的是为什么提供一个hibernate.cfg.xml文件,还需要配置其它的东西。我希望的一个配置sessionFactory时指定一个Hibernate配置文件就完了。这样才叫松散耦合。[/quote]

使用hibernate.cfg.xml才叫松耦合吧

0 请登录后投票
   发表时间:2007-11-22  
是的,我的意思是只提供一个hibernate配置文件就好了,。。按照现在的Spring的hibernate集成方法,实际上是配置上的入侵。。。这不符合它的松散耦合理念。
0 请登录后投票
   发表时间:2007-11-22  
spring-hibernate的整合是可以只提供hibernate本身的配置文件的,你只要告诉spring此文件的path即可;与struts也是一样,通过autowire只要在struts.xml中声明使用相应的processor,即可完全的避免侵入
0 请登录后投票
   发表时间:2007-11-22  
hibernate.cfg.xm写法照原样
只需把applicationContext.xml改为
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">

<beans>
<bean id="sessionFactory"
		class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
		<property name="configLocation">
			<value>/WEB-INF/hibernate.cfg.xml</value>
		</property>
	</bean>
	<bean name="/login" class="com.yourcompany.struts.action.LoginAction" singleton="false">   
<property name="dao">   
<ref bean="UsersDAOImp"/>   
</property>   
</bean>  
</beans>

这样就可以不再重复配置
1 请登录后投票
   发表时间:2007-11-22  
请问drliujia :与struts也是一样,通过autowire只要在struts.xml中声明使用相应的processor,即可完全的避免侵入。具体应该怎么做啊?谢谢
0 请登录后投票
   发表时间:2007-11-23  
之前我也比较倾向于使用Struts管理spring,这样可以在dao层做事务处理,不过整合的过程比较复杂,使用楼主的ssh整合方法较简单,最近有个项目,我在struts中添加
<controller>
<set-property property="processorClass"
value="org.springframework.web.struts.DelegatingRequestProcessor" />
</controller>
从而省略在action中配置相同的type属性,可是启动服务器时报错,不知什么原因……
0 请登录后投票
   发表时间:2007-11-23  
http://static.springframework.org/spring/docs/2.5.x/api/org/springframework/web/struts/AutowiringRequestProcessor.html
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics