1、第第 六六 章章 Spring 与表现层集成与表现层集成第1页,共21页。回顾qSpring是如何集成业务逻辑层的?q通过接口实现类的方式解耦业务层与其它层,主要是用到了控制反转(依赖注入)的办法q通过AOP的方法,分离事务、日志等切面操作,让业务逻辑更为清晰qSpring是如何集成持久层的?q通过模板技术,让具体的持久层实现无须考虑如何获得连接,关闭连接(或指session)等繁琐操作,使程序员专心处理数据CURD操作q如果使用了hibernate等持久层框架,DAO就不重要了2第2页,共21页。表现层集成qSpring可以与多种表现层技术实现集成,其实与表现层集成以我的理解就是业务逻辑如何
2、被调用业务逻辑如何被调用的问题,可以分以下几个方面q与某种Web框架相集成,如Struts,DWR等q与某种java桌面应用程序相集成,如Swing来调用业务逻辑q与某种其它语言的应用程序集成,如.net的程序3第3页,共21页。与Struts集成q Spring与Struts集成有两种方式:q 使用Struts调用Spring。优点是直接了当,容易理解,缺点是无法使用Spring的依赖注入A.使用Spring来管理Struts中的Action。优点是可以为Action注入业务逻辑实现4第4页,共21页。与Struts集成q 方法A.使用Struts调用Springq 步骤:q 添加Sprin
3、g提供的 ContextLoaderListener和contextConfigLocation属性以指明Spring配置文件的位置,其原理是使用了Listener Servlet在Web工程加载的时候载入了ApplicationContext,并将其放入Servlet Context中q 使用Spring提供的 WebApplicationContextUtils从ServletContext中获取 ApplicationContextq 利用ApplicationContext获取业务逻辑Bean1.使用业务逻辑Bean5第5页,共21页。与Struts集成q如果认为以上步骤3中的方式不够
4、简便,可以选择将你的Action继承自Spring提供的 XXXActionSupport 基类6第6页,共21页。与Struts集成q 方法B.使用Spring来管理Struts中的Actionq 步骤:q 添加Spring提供的 ContextLoaderListener和contextConfigLocation属性q 为所有Action添加类型为业务逻辑接口的属性和相应的Set方法,为注入做准备7第7页,共21页。与Struts集成q 为struts-config.xml添加一个插件管理Struts Actions的配置文件管理原有Beans的配置文件8第8页,共21页。与Struts
5、集成q 配置针对struts action的配置文件,默认路径放在WEB-INF下,默认名称为action-servlet.xmlbean 需要配置name属性,值为Action的路径和以前一样的方式注入业务逻辑bean9第9页,共21页。与Struts集成q 为struts-config.xml配置,注意也可以选择第六步的方式10第10页,共21页。与Struts集成q 将struts-config.xml中所有所有action的定义进行修改,注意也可以选择第五步的方式替换11第11页,共21页。与Struts集成q最终简化办法,在方法B.的第2步后,在struts-config.xml中添
6、加:使用spring 2.0中的新特性,自动“织入”Action所需的业务逻辑Bean默认方式是根据业务逻辑Bean的类型织入的12第12页,共21页。小结qSpring和Struts的集成方式就是这些了,没有想象中的复杂,严格按照步骤做一定不会错q但话说回来,集成web应用程序中的难点不在于此,而是在于事务及事务及Session的管理的管理13第13页,共21页。SSH中结合难点q事务何时开始,何时结束qSession何时打开,何时关闭14第14页,共21页。典型的两种做法q 一个request对应多个事务,每个事务用到一个session,也就是我们现在的做法q 一个request对应多个事
7、务,但只用到一个session,这种做法在以前的课程里也讲过,叫做session per request模式,也可以称之为Open Session In View15第15页,共21页。A.做法的流程分析q客户端发送请求,经过Action来调用业务逻辑方法A与业务逻辑方法Bq方法A开启Session_A,开始事务A,执行之(中间若有拦截器、Advice等,则根据事务属性可能开启新的事务和连接,下同)q方法A执行成功,事务A提交,Session_A关闭q方法B开启Session_B,开始事务B,执行之q方法B执行成功,事务B提交,Session_B关闭q最后返回响应16第16页,共21页。B.做
8、法的流程分析q 客户端发送请求,经过Action来调用业务逻辑方法A与业务逻辑方法Bq 开启Session_A,q 方法A开始事务A,执行之(中间若有拦截器、Advice等,则根据事务属性可能开启新的事务或加入当前事务,下同)q 方法A执行成功,事务A提交q 方法B开始事务B,执行之q 方法B执行成功,事务B提交q 返回响应q 最后Session_A关闭17第17页,共21页。B.做法的优势qB.做法的优势在于有效地利用了Hibernate的一级缓存(因为没有重复打开关闭Session)q但B.的做法仅能在持久层使用 Hibernate或JPA(另外一种几乎和Hibernate完全一样的持久层
9、技术)的情况下使用18第18页,共21页。Spring如何实现做法B.q一种做法是使用Spring提供的filter,其原理是使用过滤器Servlet在请求来时打开Session,在响应后关闭SessionOpenSessionInViewFilterorg.springframework.orm.hibernate3.support.OpenSessionInViewFilterOpenSessionInViewFilter*.do19第19页,共21页。与DWR整合q相当简单,整合仅仅涉及到远程Bean的生成方式,原来是每次new一个,现在是使用Spring的Bean工厂产生注意它的去向20第20页,共21页。ACCP V4.0演讲完毕,谢谢观看!第21页,共21页。