chapter06 SSH整合
一、SSH:
Struts(表示层)+Spring(业务层)+Hibernate(持久层)
Struts:
Struts是一个表示层框架,主要作用是界面展示,接收请求,分发请求。
在MVC框架中,Struts属于VC层次,负责界面表现,负责MVC关系的分发。(View:沿用JSP,HTTP,Form,Tag,Resourse ;Controller:ActionServlet,struts-config.xml,Action)
Hibernate:
Hibernate是一个持久层框架,它只负责与关系数据库的操作。
Spring:
Spring是一个业务层框架,是一个整合的框架,能够很好地黏合表示层与持久层。
① Web分层架构中业务层为什么都选择Spring?
Service层需要处理业务逻辑和交叉业务逻辑,处理事务,日志,安全等,而这些与Spring的IoC,AOP等不谋而合。
② Web分层架构中,对于各层技术的采用应该遵循一个怎样的标准?
1、选择发展成熟的技术:
A、经过了项目实践证实可行性良好
B、文档完善
C、技术一直处于可持续发展更新
2、Web应用中对于技术的选择有赖于开发人员的技术掌握情况
二、Spring与Struts整合
前提:
必须在Web应用启动时,创建Spring的ApplicationContext实例(即加载spring容器)
方式:
1、采用ContextLoaderListener来创建ApplicationContext:
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>
/WEB-INF/spring-config/applicationContext.xml
</param-value>
</context-param>
<listener>
<listener-class>
org.springframework.web.context.ContextLoaderListener
</listener-class>
</listener>
此时的ApplicationContext是WebApplicationContext实例,它回去web容器的根目录去搜索配置文件,所以配置文件要放在WEB-INF下。如果不放在这个下面要借助一个虚拟协议Classpath
2、采用ContextLoaderPlugIn来创建ApplicationContext
<plug-in className="org.springframework.web.struts.ContextLoaderPlugIn">
<set-property property="contextConfigLocation" value="/WEB-INF/config/sale.xml" />
</plug-in>
或者:
通过listener装载spring应用上下文
集成方式:
方式一、通过Spring的ActionSupport类
ActionSupport类:
知道ApplicationContext的获得方式(因为ApplicationContext它的引用被获得之后会自动保持到ServletContext中)
步骤:
1、Action直接继承ActionSupport
2、使用ApplicationContext ctx = getWebApplicationContext();取得Spring上下文
3、取得相应Bean
注意:有可能需要替换commons-attributes-compiler.jar包。
优点:
简单
缺点:
耦合高
违反IOC
无法使用多方法的Action
方式二:通过Spring的DelegatingActionProxy类
步骤:
1、Action中,使用IOC获得服务(service对象)
2、配置struts-config.xml
<action path="/somepath" type="org.springframework.web.struts.DelegatingActionProxy"/>
3、在Spring配置文件中(让action归spring容器管)
<bean name="/somepath" class="SomeAction">这里不能用id属性,因为它不能用/开头
<property name="service"><ref bean=""/>
</bean>
注意,要用bean name命名。
/somepath:Action的path
优点:
不使用Spring api编写 Action
利用了IOC装配。
可以利用容器的scope="prototype"来保证每一个请求有一个单独的Action来处理,
避免struts中Action的线程安全问题。
缺点:
struts配置文件中,所有path都映射到同一个代理类
方式三:通过Spring的DelegatingRequestProcessor类(即通过替换struts控制器的方式)
步骤:
1、Action中,使用IOC获得服务
2、配置struts-config.xml
<controller processorClass="org.springframework.web.struts.DelegatingRequestProcessor" />
<action path="/somepath" type="SomeAction "/>
3、在Spring配置文件中
每一个路径对应一个bean
<bean name="/somepath" class="SomeAction">
<property name="service"><ref bean=""/>
</bean>
小结:
Spring与Struts整合方式只有两种:
(1)由Spring容器来管理Action(方式二,方式三)
(2)Action处于容器之外(方式一)
注意:
中文问题:
设置过滤器,设置页面编码,数据库编码
三、关于Spring与EJB
1、Spring与EJB3.0的对比
Spring与EJB3.0之间的关系是竞争关系。
① Spring是一个开源的框架,而EJB3.0是一个标准(标准意味着将得到广泛的支持以及良好的兼容性),并且,采用EJB3.0,项目的后期维护得到了保证。
② Spring是一个轻量级框架,EJB3.0是一个重量级框架(完整的容器,包含所有的服务)。
③ Spring的IoC,AOP集成了大量的开源框架,可扩展性良好。EJB3.0的可扩展性则完全依赖于新的容器。
④ Spring对事务支持不如EJB3.0成熟,Spring对集群的兼容也不够。
⑤ Spring与EJB3.0都是一个企业级开发框架,都支持声明式事务。
2、Spring的优势与劣势
Spring的优势:
① 简化了企业级开发(对企业级服务进行了进一步的封装)
② 采用Spring框架的程序意味着良好的分层结构设计,并保证是面向接口编程的
③ 用IoC,AOP容器,模块是可配置的,松耦合的,方便了后期维护
Spring的劣势:
① 配置复杂,不方便维护
② 容器大量使用反射等机制装配对象,影响性能,对于高并发的大型应用无能为力。