SSH

来源:互联网 发布:t恤推荐 知乎 编辑:程序博客网 时间:2024/06/08 14:14

1. MVC与struts

1.1 MVC

MVC是一种设计模式,它要求应用程序的输入、处理和输出3者分离。使用MVC应用程序被分成3个核心部件:模型(Model)、视图(View)、控制器(Controller)。

(1)视图,是用户看到并与之交互的界面。可以是各种各样的,例如:JSP、HTML等,甚至文本字符也可以是;

(2)模型,表示数据和业务规则。它往往代表了一个应用程序的核心业务及其数据模型,由于应用于模型的代码只需写一次就可以被多个视图重用,所以把模型独立出来减少了代码的重用性;

(3)控制器,接收用户的输入并调用模型和视图去完成用户的需求。所以当点击Web页面中的超链接和发送HTML表单时,控制器本身不输出任何内容和做任何处理。它只是接收请求并决定调用哪个模型构建去处理请求,然后确定使用哪个视图来显示模型处理返回的数据。

1.2 struts

struts是基于MVC模式的框架,其中采用了Servlet技术和JSP来实现。struts中的Controller控制器部分是通过特殊的Servlet来实现的,即struts API中的ActionServlet实例。所有来自客户端的请求都统一由ActionServlet接收,再根据接收的请求参数和struts配置文件(struts-config.xml)将请求发送至合适的Action去处理。在Action中,调用相应的模型组件来完成应用的业务,并将执行的结果以ActionForward对象的形式返回给ActionServlet组件,再由ActionServlet将其显示给视图层。

struts控制器(Controller)由ActionServlet、Action和struts-config.xml组成;模型(Model)主要由ActionForm来实现(类似于javaBean),一般来说一个Action会配备一个ActionForm;视图(View)主要由JSP实现,JSP显示的数据可以来自ActionForm,也可以使Action保存在作用范围(request、session、application)的数据。

struts提供了4种Action,分别是Action、DispatchAction、LookupDispatchAcion和MappingDispatchAcion。(org.apache.struts.actions.***)

(1)Acion类,每一个动作就对应一个Action类,一般不提倡使用。

(2)DispatchAction类,需要从客户端提供一个特殊的参数,参数的值等于方法的名字。对于一般的表单提交性的动作,可以使用。

(3)LookupDispatchAcion类,需要实现getKeyMethodMap()方法。适用于一个表单有多个提交按钮的情况。

(4)MappingDispatchAcion类,尽管无需从需从客户端获取参数来决定调用哪个方法,但是需要在struts-config.xml中配置多个<action>标签。适用于客户端不方便传参,且动作不是太多的情况。

2. Hibernate

2.1 数据持久化

数据的持久化(把数据保存起来,并且还可以供程序获取这些数据的全部或某一部分)。持久化数据的途径:

(1)文本文件:把数据按照一定的格式,如键值对、以逗号相隔等形式,利用Java的文件系统I/O功能把数据进行保存和读取。适合数据量少和数据结构单一的情况(数据量太大,由于I/O的速度比内存操作的速度要慢的多,会造成很大的性能问题;数据结构太复杂,简单的符号相隔形式实在难以满足数据的存取功能)。

(2)对象的序列化:把实现了java.io.Serializable接口的类的实例对象在文件系统中,需要读取数据的时候,再通过反序列化机制把文件系统的数据又映射回内存中,还原原来的数据。可以满足结构复杂的数据存取,很难解决数据量大的性能问题,而且很难能完成大多数企业级程序所需要的数据检索功能。

(3)关系数据库。使用JDBC操作数据弊端:数据操作的代码量巨大;重复劳动的装填数据;面向对象的思想和关系模型之间的冲突。

2.2 ORM

ORM(Object Relational Mapping,对象关系映射)是一种为了解决面向对象和关系数据库之间的互不匹配的现象技术。对于应用程序开发者来说,ORM可以按照面向对象的思想来操作关系数据库中的数据。由于目前关系数据库是数据持久化的最佳和最普遍的解决方案,但是程序员更愿意使用面向对象的思想对待数据,而不是关系模型,ORM屏蔽了两者的差异,被大多程序员所接受。

Hibernate对JDBC进行了一种包装,提供了一套API来操作数据,重要接口:Session、SessionFactory、Configuration、Transaction、Query

Session是由SessionFactory来创建的,它代表的含义是数据源,通过指向某个数据库。SessionFactory由Configuration来创建,它代表的是Hibernate程序的数据源及相关属性的配置信息。如果需要使用事务,则通过Session来打开、提交和回滚事务。另外,如果需要比较复杂的查询功能,还会使用Query接口,它也是通过Session来获得。

Hibernate的实体存在状态:瞬时态(Transient)、持久态(Persistent)、托管态(Detached)。

(1)瞬时态:由new语句开辟内存空间的新java对象,如果没有变量对该对象进行引用,它将被java虚拟机回收。

(2)持久态:存在于Session中的实体对象就属于持久状态,处于该状态的对象在数据库中具有对应的记录,并拥有一个持久化标识。一般通过save()、saveOrUpdate()等方法转换而来。

(3)脱管态:当与某持久对象关联的Session被关闭后,持久化对象转变为脱管对象,虽然具有数据库识别值,但并不在Session中,即使实体数据发生变化也不能同步到数据库。可通过close()、evict()等方法转化来。

3. Spring

Spring是一个轻量级的Java EE容器,它也是一种从实际需求出发,着眼于轻便、灵巧、易于开发,易测试和易部署的轻量级开发框架。

3.1依赖注入 

依赖注入是Spring的ICO容器中的一个核心概念,它本质上是通过容器来管理对象数据的填充和对象之间的关联关系。依赖注入指的是组件之间的依赖关系由容器在运行时决定。控制权由对象本身转向容器;由容器根据配置文件去创建实例,并创建各个实例之间的依赖关系。它的设计思想在于将业务代码与程序本身的结构代码分开。容器尽量不要侵入到应用程序中去,应用程序本身可以依赖于抽象的接口,容器根据这些接口所需要的资源注入到应用程序中,也就是说应用程序不会主动向容器请求资源,容器会自动把这些对象给应用程序。

IOC容器的核心是Spring提供的Bean工厂(BeanFactory)。在Spring中,Bean工厂创建的各个实例称为Bean。Bean工厂负责读取Bean定义文件,管理对象的加载、生成,维护Bean对象与其他Bean对象的依赖关系,负责Bean的生命周期。(默认情况下,BeanFactory生产的Bean实例采用的是单例模式)

Spring的依赖注入可以有两种方式来完成:

(1)setter方法注入,使用<property>标签进行配置,为符合JavaBean规范的可写属性赋值,值的类型可以是String、int等数据类型,也可以使任意引用类型。

(2)构造方法注入,使用<constructor-arg>标签进行配置,根据下标位置来为变量赋值,类型也是可以任意的。

3.2 AOP

AOP是一种对OOP有益补充的编程技术,它可以解决OOP和过程化方法不能够很好解决的横切问题,例如事务、安全、日志等。简单来说,AOP就是一种功能比较复杂的拦截器。在代码真正达到目标以前,AOP可以对其进行拦截,提供一些通用的中间件的服务,例如机上事务服务、记录日志等。

Spring的声明式事务为普通java类封装事务控制,底层是用动态代理技术实现的。动态代理的一个重要特征是针对接口,所以DAO层对象要通过动态代理让Spring接管事务,就必须在DAO层对象前面抽象出一个接口。

Spring利用AOP机制来提供事务服务,事务管理器充当切面的作用。当某个目标对象的某些方法需要使用声明式事务服务的时候,首先需要创建TransactionManager的Bean,该Bean一般需要一个数据源,例如,Hibernate的SessionFactory;然后再为目标Bean加上这样的切面即可,并且配置好事务的属性(transactionAttributes)。

4. SSH 

整合SSH步骤:

(1)完成struts的配置,包括web.xml和struts-config.xml

(2)完成Hibernate的配置文件Hibernate.cfg.xml

(3)在web.xml为Spring配置应用程序上下文监听器

(4)用Spring提供的Controller替换Struts原有的controller(在struts-config.xml)

(5)用Spring提供的SessionFactoryBean来读取hibernate.cfg.xml,完成Spring对Hibernate的整合

(6)保存必须的jar文件到“WEB-INF/lib”文件夹中


0 0