前段时间突然想用SpringMVC结合Ext做一个框架原型,整合后发现SpringMVC配合Ext简直天衣无缝,当然SpringMVC结合别的 UI框架应该也是天衣无缝的。SpringMVC比Struts2确实要强大很多,特别对于Ext框架JSON数据的完美支撑,开发起来相当舒服。 Spring3整合Hibernate4的时候可能有点问题,跟Spring2+Hibernate3有很大的区别,区别在于Hibernate4实现了 对事务的管理,所以Spring针对Hibernate4就没有提供HibernateDaoSupport这个类。

整合有个原则是分框架的整合,比如我们先整合Spring、在整合SpringMVC接着整合Hibernate

整合的第一步将Jar引入到工程里面来,引入之后更改配置项目配置。下面是项目的web.xml文件的详细信息:



    
    
        log4jConfigLocation    
        
            /WEB-INF/classes/com/avicit/resource/log4j/log4j.properties
        
    
    
        log4jRefreshInterval
        600000
    
    
        webAppRootKey
        fes.root
    
    
        org.springframework.web.util.Log4jConfigListener
    
    

    
    
        CharacterEncodingFilter
        org.springframework.web.filter.CharacterEncodingFilter
        
            encoding
            utf-8
        
        
            forceEncoding
            true
        
    

    
        CharacterEncodingFilter
        /*
    
    
    
    
        
    
        BackURLFilter
        com.avicit.framework.web.filter.BackURLFilter
    

    
        BackURLFilter
        /*
    
        
    
        
    
        contextConfigLocation
        classpath*:com/avicit/resource/spring/spring-base.xml
    

    
        
            org.springframework.web.context.ContextLoaderListener
        
    
    
        
    
        openSessionInVieFilter
        
            org.springframework.orm.hibernate4.support.OpenSessionInViewFilter
        
    
    
        openSessionInVieFilter
        spring
    

    
    
        HiddenHttpMethodFilter
        org.springframework.web.filter.HiddenHttpMethodFilter
    
    
        HiddenHttpMethodFilter
        spring
    


    
        spring-dispatcher
        org.springframework.web.servlet.DispatcherServlet
                 
               contextConfigLocation      
               classpath*:com/avicit/resource/spring/spring-dispather.xml
               
            
        1
    

    
        spring-dispatcher
        /
     
     
        
        500    
        /error.jsp?code=500  
       
     
         
         404    
         /error.jsp?code=404  
       
     
         
         405    
         /error.jsp?code=405  
       
     
         
         406    
         /error.jsp?code=406  
       
     
         
         415    
         /error.jsp?code=415  
      
     
         
         400    
         /error.jsp?code=400  
     

    
        /index
    

 
 其实Spring的配置跟以前没多大区别,关键就是设置Spring的启动监听器和Spring配置文件的地址,下面是spring-base.xml的内容:      




    
    
        
    

    
        
            
            	classpath*:com/avicit/resource/jdbc/jdbc.properties
            	classpath*:com/avicit/resource/hibernate/hibernate.properties
            
        
    

 
    
    
        
            
                
                classpath:com/avicit/resource/message/messages
            
        
        
        
    
    
    

 
 这一段配置也没有什么特别地方,加载jdbc.properties数据库配置和hiberate.properties配置文件、

设置扫描Annotation注册Bean的包,但是下面有段配置可能不是很熟悉:      


        
    

 
 这里设置了不扫描的Annotation的类型,这是因为org.springframework.stereotype.Controller是 SpringMVC的控制器的注解,使用这个注解注册的Bean在SpringMVC容器启动的时候已经实例化了,所以在Spring容器里面就不需要进 行实例化了。

在web.xml文件的配置中可以看到这么一段配置:


        spring-dispatcher
        org.springframework.web.servlet.DispatcherServlet
                 
               contextConfigLocation      
               
                   classpath*:com/avicit/resource/spring/spring-dispather.xml
               
           
        1
    

    
        spring-dispatcher
        /
    

 
 

这个就是SpringMVC的配置,配置SpringMVC的容器也可以说是调度器,下面看下spring-dispather.xml中的配置:

  
         
   
        
     
      
      
   
   
   
       
       
     
         
       
   
 
   
     
       
       
 
     
 
     
       
       
 
         
   
   
 
   
   
 
   
   
 
   
       
       
         
             
             
          
     
     
 
       
             
                 
                   
         
                   
                 
               
         
   
  

  
    
         
                
                        error              
            
      


 
 这一部分配置是依据官方来的文档来的,大家看看文档就可以明白这段配置,在这里就不赘述了。但是这里有很关键的一处配置是官方文档没有提到的,也是整合Hiberate4中关键的配置,如果没有配置Hibernate肯定跑不起来,这段配置:  

    

   
         
       

 

这里配置了扫描Controller,通过Controller注解注册的Bean是SpringMVC的控制器,但是为什么要排除Service注解 呢?这是因为通过Service注册的Bean是要进行事务处理的。要生成动态代理进行事务控制,所以如果不排除的话,Service注册的Bean是不 带事务处理的。所以在整合Hibernate的时候就会报没有事务的异常。

最后看Hibernate在Spring中如何配置,也就是spring-dao.xml:


 
         
        
            
            
            
            
            
        
        
            
          
       
     
         
              
              
                
                      
                  ${hibernate.dialect}        
                  ${hibernate.show_sql}        
                  true       
                  
                          ${hibernate.query.substitutions}        
                  
                          ${hibernate.default_batch_fetch_size}        
                  ${hibernate.max_fetch_depth}
                  
                          ${hibernate.generate_statistics}        
                  
                          ${hibernate.bytecode.use_reflection_optimizer}        
                  
                          ${hibernate.cache.use_second_level_cache}        
                  
                          ${hibernate.cache.use_query_cache}        
                  
                          ${hibernate.cache.region.factory_class}        
                  
                          ${net.sf.ehcache.configurationResourceName}        
                  
                          ${hibernate.cache.use_structured_entries}      
                      
            
         
       
        
            
         
       
         
         
         
         
           
             
         
           
             
             
             
             
             
             
             
             
             
             
             
             
             
             
             
             
           
         
         
       
           
           
           
            
        
  

 
 

Hibernate的配置跟Hibernate3没有很大的区别,唯一的区别就是所有的操作都必须开启事务。

Spring3+Hibernate4的框架整合差不多,后面会写如何实现SpringMVC整合Ext,那才是更有意思的部分。