SSH 组建轻量级架构 (二) -- 构建步骤



Spring 整合托管 控制层、用户逻辑层及持久层    利用 Spring 整合托管各分层,能减少各框架间解耦所带来的开销,更好体现了 Spring的注入机制和面向切面编程带来的便利。

ps.虽然也可以通过
     static ApplicationContext ctx =  new ClassPathXmlApplicationContext("applicationContext.xml");
     EcAccountDAO dao = (EcAccountDAO)ctx.getBean("EcAccountDAO");
来单独注入,但是网站访问量大的时候,多个 ctx 实例会造成极大的开销,不推荐使用。

 

ContractedBlock.gif ExpandedBlockStart.gif Spring + Hibernate 持久层 applicationContext.xml
None.gif<?xml version="1.0" encoding="UTF-8"?>
None.gif
<beans xmlns="http://www.springframework.org/schema/beans" 
None.gif   xmlns:xsi
="http://www.w3.org/2001/XMLSchema-instance" 
None.gif   xmlns:aop
="http://www.springframework.org/schema/aop" 
None.gif   xmlns:tx
="http://www.springframework.org/schema/tx" 
None.gif   xsi:schemaLocation
=" 
None.gif       http://www.springframework.org/schema/beans 
None.gifhttp://www.springframework.org/schema/beans/spring-beans-2.0.xsd 
None.gif       http://www.springframework.org/schema/tx 
None.gifhttp://www.springframework.org/schema/tx/spring-tx-2.0.xsd 
None.gif       http://www.springframework.org/schema/aop 
None.gifhttp://www.springframework.org/schema/aop/spring-aop-2.0.xsd"
> 
None.gif
None.gif
None.gif
<!-- 支持事务标记的Bean定义 tx 标记要配合上面的 smlns:ts 和 xsi. 使用   -->
None.gif   
<!-- tx:annotation-driven 检查Bean是否支持事务,当检查到DAO类时的 @Transactional 标注,就自动加入事务管理功能。 -->
None.gif   
<!-- transaction-manager="transactionManager"   指明使用的是 transactionManager 这个 bean 中定义的事务管理器 -->
None.gif   
<!-- proxy-target-class="true",属性值指定 代理的DAO 是 接口 还是 类 ,true表示类,false或默认表示是接口 -->
None.gif   
<tx:annotation-driven transaction-manager="transactionManager" proxy-target-class="true"/>  
None.gif
None.gif
None.gif
None.gif
<!--     1、利用 MyEclipse 创建 SessionFactory 的向导   -->
None.gif    
<bean id="sessionFactory"
None.gif        class
="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
None.gif        
<property name="configLocation"
None.gif            value
="classpath:hibernate.cfg.xml">
None.gif        
</property>
None.gif    
</bean>
None.gif
None.gif
None.gif
<!--     2、生成基于 Spring Hibernate Template 的 DAO   -->
None.gif
<!-- 持久层Bean -->
None.gif   
<bean id="EcConsignmentDAO" class="springdao.EcConsignmentDAO">
None.gif       
<property name="sessionFactory">
None.gif           
<ref bean="sessionFactory" />
None.gif       
</property>
None.gif   
</bean>
None.gif   
<bean id="EcReckoningDAO" class="springdao.EcReckoningDAO">
None.gif       
<property name="sessionFactory">
None.gif           
<ref bean="sessionFactory" />
None.gif       
</property>
None.gif   
</bean>
None.gif
None.gif
None.gif
<!-- 声明一个 Hibernate 3 的 事务管理器供代理类自动管理事务用 --> 
None.gif   
<bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager"> 
None.gif      
<property name="sessionFactory"> 
None.gif         
<ref local="sessionFactory" /> 
None.gif      
</property> 
None.gif   
</bean>
None.gif   
None.gif
</beans>
ContractedBlock.gif ExpandedBlockStart.gif Spring + Hibernate xxxxDAO 类的注记
None.gif    import org.springframework.transaction.annotation.Transactional; 
None.gif 
None.gif    @Transactional 
ExpandedBlockStart.gifContractedBlock.gif    
public class EcReckoningDAO extends HibernateDaoSupport dot.gif
InBlock.gif     
InBlock.gif    dot.gifdot.gif..
InBlock.gif
InBlock.gif

 

ContractedBlock.gif ExpandedBlockStart.gif Spring + Biz 用户逻辑层 applicationContext.xml
None.gif<!-- 用户业务Bean -->
None.gif
<bean id="ecAccountBiz" class="biz.EcAccountBiz">
None.gif
None.gif    
<!-- 注入持久层Bean -->
None.gif    
<property name="ecAccountLevelDAO">
None.gif        
<ref local="EcAccountLevelDAO"/>
None.gif    
</property>
None.gif    
<property name="ecAccountDAO">
None.gif        
<ref local="EcAccountDAO"/>
None.gif    
</property>
None.gif    
<property name="ecAccountStatusDAO">
None.gif        
<ref local="EcAccountStatusDAO"/>
None.gif    
</property>
None.gif
</bean>
ContractedBlock.gif ExpandedBlockStart.gif 用户逻辑层 xxxxBiz类
ExpandedBlockStart.gifContractedBlock.gifpublic class EcAccountBiz dot.gif{    
ExpandedSubBlockStart.gifContractedSubBlock.gif    
/**//* 定义属性 */
InBlock.gif    
private EcAccountDAO ecAccountDAO;
InBlock.gif    
private EcAccountLevelDAO ecAccountLevelDAO;
InBlock.gif    
private EcAccountStatusDAO ecAccountStatusDAO;
InBlock.gif    
ExpandedSubBlockStart.gifContractedSubBlock.gif    
/**//* getXXX() and setXXX() */
InBlock.gif    dot.gifdot.gifdot.gifdot.gif
InBlock.gif
InBlock.gif    
ExpandedSubBlockStart.gifContractedSubBlock.gif    
/** *//**
InBlock.gif     * 根据 Id 获得等级信息
InBlock.gif     * 
@param levelId         等级ID
InBlock.gif     * 
@return        等级信息
ExpandedSubBlockEnd.gif     
*/

ExpandedSubBlockStart.gifContractedSubBlock.gif    
public EcAccountLevel getLevel(int levelId) dot.gif{     
InBlock.gif        List list 
= getEcAccountLevelDAO().findAll();
InBlock.gif        EcAccountLevel level 
= null;        
ExpandedSubBlockStart.gifContractedSubBlock.gif        
if (list.size() > 0dot.gif{
InBlock.gif            level 
= (EcAccountLevel)list.get(0);
ExpandedSubBlockEnd.gif        }

InBlock.gif        
InBlock.gif        
return level;
ExpandedSubBlockEnd.gif    }

InBlock.gif
InBlock.gif

 

ContractedBlock.gif ExpandedBlockStart.gif Spring + Struts Action控制层 struts-config.xml
None.gif  <action-mappings >
None.gif    
<action
None.gif      
attribute="regAccountForm"
None.gif      input
="/join/index.jsp"
None.gif      name
="regAccountForm"
None.gif      path
="/regAccount"
None.gif      scope
="request"
None.gif      type
="com.yourcompany.struts.action.RegAccountAction">
None.gif      
<forward
None.gif      
name="success"
None.gif      path
="/join/regsuccess.jsp"
None.gif      redirect
="true" />
None.gif      
<forward name="fail" path="/join/index22.jsp" />
None.gif    
</action>
None.gif
None.gif   dot.gifdot.gifdot.gifdot.gifdot.gifdot.gif.
None.gif
None.gif  
<!-- 以下写于配置文件尾 -->
None.gif
None.gif  
<!-- 加入了 Spring 的代理请求处理器(需要写在message-resources上方?) -->
None.gif  
<controller
None.gif        
processorClass="org.springframework.web.struts.DelegatingRequestProcessor" />
None.gif
None.gif  
<message-resources parameter="com.yourcompany.struts.ApplicationResources" /> 
None.gif  
None.gif  
<!-- 插件方式 是加载 Spring    -->
None.gif  
<plug-in className="org.springframework.web.struts.ContextLoaderPlugIn">
None.gif    
<set-property property="contextConfigLocation" value="/WEB-INF/classes/applicationContext.xml" />
None.gif  
</plug-in> 
None.gif
ContractedBlock.gif ExpandedBlockStart.gif Struts 控制层 xxxxAction类
ExpandedBlockStart.gifContractedBlock.gifpublic class RegAccountAction extends Action dot.gif{
InBlock.gif    
private EcAccountBiz ecAccountBiz;
InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif    
/** *//** property accessors */
ExpandedSubBlockStart.gifContractedSubBlock.gif    
public EcAccountBiz getEcAccountBiz() dot.gif{
InBlock.gif        
return ecAccountBiz;
ExpandedSubBlockEnd.gif    }

InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif    
public void setEcAccountBiz(EcAccountBiz ecAccountBiz) dot.gif{
InBlock.gif        
this.ecAccountBiz = ecAccountBiz;
ExpandedSubBlockEnd.gif    }

InBlock.gif
InBlock.gif
public ActionForward execute(ActionMapping mapping, ActionForm form,
ExpandedSubBlockStart.gifContractedSubBlock.gif            HttpServletRequest request, HttpServletResponse response) 
throws IOException dot.gif{
InBlock.gif    dot.gif..
InBlock.gif
InBlock.gif        EcAccountLevel level 
= getEcAccountBiz().getLevel(1);        
InBlock.gif        EcAccountStatus status 
= getEcAccountBiz().getStatus(1);
InBlock.gif    dot.gif..
InBlock.gif
InBlock.gif
ContractedBlock.gif ExpandedBlockStart.gif Spring 配置文件 applicationContext.xml
None.gif<!--  Struts Action 类 -->
None.gif
<bean name="/regAccount" 
None.gif    class
="com.yourcompany.struts.action.RegAccountAction">
None.gif    
None.gif    
<!-- 注入业务逻辑Bean -->
None.gif    
<property name="ecAccountBiz">
None.gif        
<ref local="ecAccountBiz"/>
None.gif    
</property>
None.gif
</bean>
None.gif

 




旧版的分割线

前言:        SSH 框架优点是: Struts 易于使用,用户群广。Spring 可以很容易实现AOP,并大大降低各框架间的耦合度。Hibernate 使用简单,并可以通过session得到Connection使用 JDBC 提高性能。
        缺点是: 需要编写大量的配置文件。 
        建议: 会用,并理解就好,不必特意的为追求框架而框架。 
        添加顺序: Struts --> Spring --> Hibernate
ps. 
        Spring 的开发大部分情况下就是编写 XML 配置文件来组织各种各样的 Bean和切面。将程序个部分 软连接 起来,通过使用注释或者 XML 配置文件方式,程序运行的时候 Spring 能够“按需”创建或者初始化所有的对象关系。(不要要重新编译程序,鼓励使用模块化的架构来维护应用)
            ++1、动态注入 Bean的值,号称不用编程赋值,用 XML 文件可以解决一切赋值语句。
ps2. 内容均来自 刘长炯 先生的《MyEclipse 6 Java 开发中文教程》一书,具体请访问 http://www.blogjava.net/beansoft/


 

Spring 整合 Hibernate        提供了调用类和事务管理功能,最实用的是支持自动事务管理功能(在方法前开始事务,在方法执行后提交,这就是 Spring 用 AOP 实现的自动事务代理功能)。
ps.我们需要做的是:
    1、利用 MyEclipse 创建 SessionFactory 的向导,
    2、以及在 Hibernate+Spring 反向工程的时候生成基于 Spring Hibernate Template 的 DAO,
    3、对生成的代码稍作修改(如自动提交事务问题),满足开发的需要即可。
大多数情况项目还不需要到精确控制事务 API。
ContractedBlock.gif ExpandedBlockStart.gif A、类的调用
None.gifSpring 配置文件 applicationContext.xml
None.gif
<!--     1、利用 MyEclipse 创建 SessionFactory 的向导   -->
None.gif    
<bean id="sessionFactory"
None.gif        class
="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
None.gif        
<property name="configLocation"
None.gif            value
="classpath:hibernate.cfg.xml">
None.gif        
</property>
None.gif    
</bean>
None.gif
None.gif
None.gif
<!--     2、生成基于 Spring Hibernate Template 的 DAO   -->
None.gif   
<bean id="EcConsignmentDAO" class="springdao.EcConsignmentDAO">
None.gif       
<property name="sessionFactory">
None.gif           
<ref bean="sessionFactory" />
None.gif       
</property>
None.gif   
</bean>
None.gif   
<bean id="EcReckoningDAO" class="springdao.EcReckoningDAO">
None.gif       
<property name="sessionFactory">
None.gif           
<ref bean="sessionFactory" />
None.gif       
</property>
None.gif   
</bean>
ContractedBlock.gif ExpandedBlockStart.gif B、用Spring 2.0 的 @Transactional 标注解决事务提交问题
None.gif    1、DAO 类加入标注,其开头部分的代码如下所示: 
None.gif
None.gif    import org.springframework.transaction.annotation.Transactional; 
None.gif 
None.gif    @Transactional 
None.gif    public class StudentDAO extends HibernateDaoSupport { 
None.gif    dot.gifdot.gif 
None.gif
None.gif    2、修改 Spring 配置文件 applicationContext.xml 
None.gif
None.gif
<?xml version="1.0" encoding="UTF-8"?>
None.gif
<beans xmlns="http://www.springframework.org/schema/beans" 
None.gif   xmlns:xsi
="http://www.w3.org/2001/XMLSchema-instance" 
None.gif   xmlns:aop
="http://www.springframework.org/schema/aop" 
None.gif   xmlns:tx
="http://www.springframework.org/schema/tx" 
None.gif   xsi:schemaLocation
=" 
None.gif       http://www.springframework.org/schema/beans 
None.gifhttp://www.springframework.org/schema/beans/spring-beans-2.0.xsd 
None.gif       http://www.springframework.org/schema/tx 
None.gifhttp://www.springframework.org/schema/tx/spring-tx-2.0.xsd 
None.gif       http://www.springframework.org/schema/aop 
None.gifhttp://www.springframework.org/schema/aop/spring-aop-2.0.xsd"
> 
None.gif
None.gif
None.gif
<!-- 支持事务标记的Bean定义 tx 标记要配合上面的 smlns:ts 和 xsi. 使用   -->
None.gif   
<!-- tx:annotation-driven 检查Bean是否支持事务,当检查到DAO类时的 @Transactional 标注,就自动加入事务管理功能。 -->
None.gif   
<!-- transaction-manager="transactionManager"   指明使用的是 transactionManager 这个 bean 中定义的事务管理器 -->
None.gif   
<!-- proxy-target-class="true",属性值指定 代理的DAO 是 接口 还是 类 ,true表示类,false或默认表示是接口 -->
None.gif   
<tx:annotation-driven transaction-manager="transactionManager" proxy-target-class="true"/>  
None.gif
None.gifdot.gif..
None.gif
None.gif
<!-- 声明一个 Hibernate 3 的 事务管理器供代理类自动管理事务用 --> 
None.gif   
<bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager"> 
None.gif      
<property name="sessionFactory"> 
None.gif         
<ref local="sessionFactory" /> 
None.gif      
</property> 
None.gif   
</bean>
None.gif   
None.gif
</beans>
ContractedBlock.gif ExpandedBlockStart.gif C、测试类
ExpandedBlockStart.gifContractedBlock.gifpublic static void main(String[] args) dot.gif
InBlock.gif      ApplicationContext ctx 
=  new ClassPathXmlApplicationContext("applicationContext.xml"); 
InBlock.gif 
InBlock.gif      StudentDAO dao 
= (StudentDAO)ctx.getBean("StudentDAO"); 
InBlock.gif       
InBlock.gif      Student user  
= new Student(); 
InBlock.gif      user.setPassword(
"密码"); 
InBlock.gif      user.setUsername(
"spring 2 标注事务代理测试"); 
InBlock.gif      user.setAge(
200); 
InBlock.gif       
InBlock.gif      dao.save(user); 
InBlock.gif
InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif
/**//*    //原始 Hibernate ,需要手动加入事务功能,并控制会话的开关
InBlock.gif      StudentDAO dao = new StudentDAO(); 
InBlock.gif      Transaction tran = dao.getSession().beginTransaction(); 
InBlock.gif
InBlock.gif      Student bean = new Student(); 
InBlock.gif      bean.setUsername("张三"); 
InBlock.gif      bean.setPassword("1234"); 
InBlock.gif      bean.setAge(100); 
InBlock.gif
InBlock.gif      dao.save(bean); 
InBlock.gif      tran.commit(); 
InBlock.gif      dao.getSession().close(); 
ExpandedSubBlockEnd.gif
*/

InBlock.gif
ExpandedBlockEnd.gif}

None.gif
None.gif    最简单的事务处理办法,可以最大化的利用 JDK 
5 的标注功能并大大减少编码的难度。 



Spring 整合 Struts    通过修改配置文件实现在 Spring 管理下的 strutsAction。
    具体整合步骤: (薄膜,接口?)
    1、Struts 配置文件(插件或者其他形式) 载入Spring配置文件
    2、Struts 配置文件中每个Action 引用 Spring 总实现类 DelegatingActionProxy
    3、Spring配置文件中配置被替换的 StuctsBean
ContractedBlock.gif ExpandedBlockStart.gif A、Struts 配置文件(struts-config.xml) 插件形式载入Spring配置文件
None.gif在 XML 文件尾加入:
None.gif    
<plug-in className="org.springframework.web.struts.ContextLoaderPlugIn">
None.gif    
<set-property property="contextConfigLocation" value="/WEB-INF/classes/applicationContext.xml" />
None.gif    
</plug-in>
ContractedBlock.gif ExpandedBlockStart.gif B、Struts 配置文件(struts-config.xml)里 Action 的 Type 用Spring 接口替换
None.gif    <action 
None.gif    
path="/getGallery" 
None.gif    type
="org.springframework.web.struts.DelegatingActionProxy">
None.gif      
<forward name="returnGallery" path="/my/gallery.jsp" />
None.gif    
</action>
ContractedBlock.gif ExpandedBlockStart.gif C、Spring 配置文件中配置被替换的 StrutsBean   
None.gif    通过对 Struts.action.path 和 Spring.bean.name 的 name 进行匹配, 实现软接口和AOP的准备
None.gif    
<bean 
None.gif    
name="/getGallery" 
None.gif    class
="com.yourcompany.struts.action.GetGalleryAction">
None.gif    
</bean>

转载于:https://www.cnblogs.com/kiant71/archive/2008/09/06/1752073.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值