String,Struts,Hibernate集成

 
一、    Spring集成Hibernate

 先给出 Spring 的配置文件, 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 ="dataSource"
        class
="org.springframework.jdbc.datasource.DriverManagerDataSource" >
        
< property  name ="driverClassName" >
            
< value > com.microsoft.jdbc.sqlserver.SQLServerDriver </ value >
        
</ property >
        
< property  name ="url" >
            
< value > jdbc:microsoft:sqlserver://localhost:1433;database=bookstoressh </ value >
        
</ property >
        
< property  name ="username" >
            
< value > sa </ value >
        
</ property >
        
< property  name ="password" >
            
< value > 123456 </ value >
        
</ property >
    
</ bean >

    
< bean  id ="sessionFactory"
        class
="org.springframework.orm.hibernate3.LocalSessionFactoryBean" >
        
< property  name ="configLocation" >
            
< value > classpath:hibernate.cfg.xml </ value >
        
</ property >
        
< property  name ="dataSource" >
            
< ref  local ="dataSource" />
        
</ property >
</ bean >

在集成中主要是要配置 dataSource sessionFacotyr dataSource 主要是配置数据库的连接属性,而 sessionFactory 主要是用来管理 Hibernate 的配置,通过 classpath:hibernate.cfg.xml 直接装入 Hibernate 的配置文件,这样就仍然可以采用 Hibernate 自己的方式来配置 Hibernate

sessionFactory 有一个 dataSource 属性,需要注入一个 dataSource

实际上也可以在 Spring 的配置文件中来配置 Hibernate 如下:

 

< bean  id ="sessionFactory"
        class
="org.springframework.orm.hibernate3.LocalSessionFactoryBean" >
        
< property  name ="configLocation" >
            
< value > classpath:hibernate.cfg.xml </ value >
        
</ property >
        
< property  name ="dataSource" >
            
< ref  local ="dataSource" />
        
</ property >
        
< property  name ="mappingResources" >
            
< list >
                
< value > <!--  这里填写hibernate的映射文件路径  --> </ value >
            
</ list >
        
</ property >
        
< property  name ="hibernateProperties" >
            
< props >
            
<!--  配置Hibernate的方言  -->
                
< prop  key ="hibernate.dialect" >
                    org.hibernate.dialect.SQLServerDialect
                
</ prop >
                
<!--  输入由Hibernate生成的SQL语句,如果在hibernate.cfg.xml中也指定的话,会生成两条语句,在产品中最好关闭,即设为false  -->
                
< prop  key ="show_sql" > true </ prop >
            
</ props >
        
</ property >
</ bean >

Spring Hibernate 的集成比较简单,通过上面的配置,就已经完成了。

下面是 Spring Struts 的集成,这部分比较复杂。

一、    Spring 集成 Struts

Spring 集成 Struts 主要有两种上下文装载方式和三种整合方法:

u       两种上下文装载方式:

(1)    struts-config.xml 中通过插件的方式装载 Spring 上下文,如下:

 

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


这种方式在整合的时候,有时会产生 Action 的无效,即不能正常实例化一个 Action ,一个原因是版本的问题,另一个原因是引入了 Hibernate annotation 库,估计仍然是版的问题。

    (2) web.xml 文件中装载 Spring 上下文,如下:

如果不支持 Servlet2.4 ,则采用下面的配置:

 

< context-param >
    
< param-name > contextConfigLocation </ param-name >
    
< param-value > /WEB-INF/applicationContext.xml </ param-value >
</ context-param >
    
< servlet >
    
< servlet-name > SpringContextServlet </ servlet-name >
    
< servlet-class >
        org.springframework.web.context.ContextLoaderServlet
    
</ servlet-class >
    
< load-on-startup > 1 </ load-on-startup >
</ servlet >

< context-param >
    
< param-name > contextConfigLocation </ param-name >
    param-value>/WEB-INF/applicationContext.xml
</ param-value >
</ context-param >
<!--  这是Servlet2.4的规范,如果不支持Servlet2.4规范,则采用ContextLoaderServlet  -->
< listener >
    
< listener-class > org.springframework.web.context.ContextLoaderListener </ listener-class >
</ listener >

 

u        Spring 集成 Struts 的三种方式:

(1)     Struts 的每一个具体的 Action 直接继承 Spring ActionSupport ,例如:

 

public   class  LoginAction  extends  ActionSupport {
    
private  UserDAO getUserDAO() {
        
return  (UserDAO) getWebApplicationContext().getBean( " userDAO " );
    }

    
public  ActionForward execute(ActionMapping mapping, ActionForm form,
            HttpServletRequest request, HttpServletResponse response) {
        getUserDAO().save(User);
        
return   null ;
    }
}

 


这样的话,就可以使用 getWebApplicationContext().getBean() 方式来使用在 Spring 的配置的 Bean 了。但 使用这种方式的话,每一个 Action 都和 Spring 框架耦合在一起了,一般不采用。

 

  (2)   使用SpringDelegatingRequestProcessor 覆盖StrutsRequestProcess ,在Struts 的配置文件struts-config.xml 文件中加入如下内容:

   

< controller
    
processorClass ="org.springframework.web.struts.DelegatingRequestProcessor"   />

这样的话,就可以由SpringBean 的方式来管理StrutsAction 这种设计使 Struts 动作并不知道它正被 Spring 管理,并且使您能够利用 Spring 框架的所有优点。由于Struts 动作注意不到 Spring 的存在,所以不需要重写Struts 代码就可以使用其他控制反转容器来替换掉 SpringDelegatingRequestProcessor 方法的确比第一种方法好,但是仍然存在一些问题。如果使用一个不同的 RequestProcessor ,则需要手动整合 Spring DelegatingRequestProcessor

 

(3)  使用代理将StrutsAction 委托给Spring 管理

     先看一下在struts-config.xml 中的Action 的配置:

 

< action  attribute ="loginForm"  
             input
="/login.jsp"
             name
="loginForm"  path ="/login"  scope ="request"                    
             type
="org.springframework.web.struts.DelegatingActionProxy" >
            
< forward  name ="success"  path ="/success.jsp"   />
</ action >

通过type 属性指定为 org.springframework.web.struts.DelegatingActionProxy 将这个 Action 委托给 Spring 进行管理。 它注册 Spring 代理类的名称,而不是声明动作的类名。DelegatingActionProxy 类使用动作映射名称查找 Spring 环境中的动作。

下面看一下 Spring 的配置文件中的配置:

< bean  name ="/login"  
          class
="com.test.struts.action.LoginAction"

          singleton
="false"  autowire ="byType" >
</ bean >

Bean 的配置中,是通过name 属性而不是id 属性,因为id 属性在DTD 验证中的类型为ID ,而ID 类型,ID 类型必须以字母、下划线或冒号开头,不允许使用非法字符,而”/” 是非法字符。另外,name 属性的值是非常重要的,它一定要和在struts-config.xml 中配置的Actionpath 属性的值一致。 DelegatingActionProxy 会通过 path 属性的值在 Spring 的上下文环境中查找真正的 Action 。而 Bean class 属性则指定了真正实现 Struts Action 的具体类。这样就将 Struts Action 交给了 Spring 来管理。

 

 

 

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值