谈谈对MVC的理解
MVC是Module-View-Controller的简称,即模型-视图-控制器。这种设计模式强制性将应用拆分成输入、处理、输出三个部分。
视图:视图是用户看到并与之交互的界面。用于向用户显示数据、处理用户的输入,没有业务逻辑。
模型:模型表示业务处理和业务逻辑,相当于JavaBean。一个模型能为多个视图提供数据,提高了程序的重用性。
控制器:控制器接受用户的请求,并调用相应的模型进行处理,然后根据处理的结果调用相应的视图进行显示。
MVC处理过程:首先控制器接受用户的请求,调用相应模型处理后,将得到的结果显示在对应的视图给用户。
SSH框架
ssh即struts、spring、hibernate。
struts:表示层,主要用于请求流程的控制,有着丰富的taglib。
spring:业务层,spring的控制反转能起到解耦合的作用。
hibernate:持久层,主要用于数据持久化,封装了JDBC的基本操作,还提供了一个易用、高效的对象关系映射框架。
struts
struts是采用javaServlet/javaserver pages技术,开发web应用程序的开源framework。采用struts能开发出基于MVC设计模式的应用架构。struts主要有如下功能:
一、包含一个controller Servlet,能将用户请求发送到相应的action对象。
二、jsp自由tag库,并和controller Servlet中提供关联支持,帮助开发人员创建交互式表单应用。
三、提供了一系列实用对象:xml处理、通过java reflection APIs自动处理javabean属性、国际化的提示和消息。
struts1和struts2区别: http://blog.csdn.net/bjyfb/article/details/8679523
国际化
配置国际化支持,在struts-config.xml文件中加入如下配置:
message-resources parameter=”MessageResources”
最好提供国际化资源文件(MessageResources.properties),将该文件放到src下
采用taglib引入
<%@ taglib uri=”http://struts.apache.org/tags-bean” prefix=”bean”%>
<%@ taglib uri=”http://struts.apache.org/tags-logic” prefix=”logic” %>
流程:
(1)web应用启动时加载ActionServlet,ActionServlet从struts-config.xml文件中读取配置信息存放到各种配置对象。
(2)接收到一个客户端请求时,校验和用户请求匹配的ActionMap实例,若不存在,返回请求路径无效。
(3)若ActionForm不存在,创建一个ActionForm对象并将表单数据保存到对象中。
(4)根据配置决定是否要进行表单验证,若需要验证则调用ActionForm的validate()方法。
(5)若validate()方法返回一个null或者不为ActionMessage和ActionError的对象,说明表单验证成功。
(6)ActionServlet根据ActionMapping的映射信息找到对应的Action实例,若不存在则创建一个新的实例后执行excute()方法。
(7)Action的excute()方法返回一个ActionForward对象,ActionServlet把请求返回给ActionForward对象指向的jsp组件。
(8)ActionForward指向jsp组件生成动态页面返回给客户。
优点:
(1) 实现MVC模式,结构清晰,使开发者只关注业务逻辑的实现.
(2)有丰富的tag可以用 ,Struts的标记库(Taglib),如能灵活动用,则能大大提高开发效率
(3) 页面导航使系统的脉络更加清晰。通过一个配置文件,即可把握整个系统各部分之间的联系,这对于后期的维护有着莫大的好处。尤其是当另一批开发者接手这个项目时,这种优势体现得更加明显。
(4)提供Exception处理机制 .
(5) 数据库链接池管理
(6) 支持I18N
缺点:
(1) 转到展示层时,需要配置forward,如果有十个展示层的jsp,需要配置十次struts,而且还不包括有时候目录、文件变更,需要重新修改forward,注意,每次修改配置之后,要求重新部署整个项目,而tomcate这样的服务器,还必须重新启动服务器
(2) Struts 的Action必需是thread-safe方式,它仅仅允许一个实例去处理所有的请求。所以action用到的所有的资源都必需统一同步,这个就引起了线程安全的问题。
(3) 测试不方便. Struts的每个Action都同Web层耦合在一起,这样它的测试依赖于Web容器,单元测试也很难实现。不过有一个Junit的扩展工具Struts TestCase可以实现它的单元测试。
(4) 类型的转换. Struts的FormBean把所有的数据都作为String类型,它可以使用工具Commons-Beanutils进行类型转化。但它的转化都是在Class级别,而且转化的类型是不可配置的。类型转化时的错误信息返回给用户也是非常困难的。
(5) 对Servlet的依赖性过强. Struts处理Action时必需要依赖ServletRequest 和ServletResponse,所有它摆脱不了Servlet容器。
(6)前端表达式语言方面.Struts集成了JSTL,所以它主要使用JSTL的表达式语言来获取数据。可是JSTL的表达式语言在Collection和索引属性方面处理显得很弱。
(7) 对Action执行的控制困难. Struts创建一个Action,如果想控制它的执行顺序将会非常困难。甚至你要重新去写Servlet来实现你的这个功能需求。
(8) 对Action 执行前和后的处理. Struts处理Action的时候是基于class的hierarchies,很难在action处理前和后进行操作。
(9) 对事件支持不够. 在struts中,实际是一个表单Form对应一个Action类(或DispatchAction),换一句话说:在Struts中实际是一个表单只能 对应一个事件,struts这种事件方式称为application event,application event和component event相比是一种粗粒度的事件。
hibernate
hibernate是一个轻量级的持久层开源框架,它是连接java应用程序和关系数据库的中间件,负责java对象和关系数据之间的映射。
hibernate内部对jdbc api进行了封装,负责java对象的持久化。因为hibernate封装了所有数据访问细节,所以业务逻辑层可以专注于业务逻辑。
它是一种优秀的ORM映射工具,提供了完善的对象-关系映射服务,开发过程不依赖容器,灵活性非常强大,能够无缝集成到任何java系统中。
hibernate优点:
1. 封装了jdbc,简化了很多重复性代码。
2. 简化了DAO层编码工作,使开发更对象化了。
3. 移植性好,支持各种数据库,如果换个数据库只要在配置文件中变换配置就可以了,不用改变hibernate代码。
4. 支持透明持久化,因为hibernate操作的是纯粹的(pojo)java类,没有实现任何接口,没有侵入性。所以说它是一个轻量级框架。
hibernate优化:
1. 使用双向一对多关联,不使用单向一对多
2. 灵活使用单向一对多关联
3. 不用一对一,用多对一取代
4. 配置对象缓存,不使用集合缓存
5. 一对多集合使用Bag,多对多集合使用Set
6. 继承类使用显式多态
7. 表字段要少,表关联不要怕多,有二级缓存
spring
Spring是一个轻量级的容器,非侵入性的框架.最重要的核心概念是IOC,并提供AOP概念的实现方式,提供对持久层,事务的支持,对当前流行的一些框架(Struts,Hibernate,MVC),Sping也提供了与它们的相整合的方案。
注解:
@Service用于标注业务层组件,
@Controller用于标注控制层组件(如struts中的action),
@Repository用于标注数据访问组件,即DAO组件,
@Component泛指组件,当组件不好归类的时候,我们可以使用这个注解进行标注。
优点:
1. 降低了组件之间的耦合性,实现了软件各层之间的解耦。
2. 可以使用容易提供的众多服务,如事务管理、消息服务等。
3. 容器提供单例模式支持。
4. 容器提供了AOP技术,很容易实现如权限拦截,运行监控等。
5. 容器提供了众多辅助类,能快速开发。
6. spring对于主流的框架提供支持,如struts、hibernate。
7. spring属于低侵入式设计,代码污染极低。
8. 独立于各种应用服务器。
9. spring的DI机制降低了业务对象替换的复杂性。
10. spring的高度开放性,并不强制完全依赖spring,开发者可以使用spring的部分或全部。
AOP里面重要的几个名词概念解释
切面(Aspect): 一个关注点的模块化,这个关注点可能会横切多个对象。事务管理是J2EE应用中一个关于横切关注点的很好的例子。 在Spring AOP中,切面可以使用通用类(基于模式的风格) 或者在普通类中以 @Aspect 注解(@AspectJ风格)来实现。
连接点(Joinpoint): 在程序执行过程中某个特定的点,比如某方法调用的时候或者处理异常的时候。 在Spring AOP中,一个连接点 总是 代表一个方法的执行。 通过声明一个org.aspectj.lang.JoinPoint类型的参数可以使通知(Advice)的主体部分获得连接点信息。
通知(Advice): 在切面的某个特定的连接点(Joinpoint)上执行的动作。通知有各种类型,其中包括“around”、“before”和“after”等通知。 通知的类型将在后面部分进行讨论。许多AOP框架,包括Spring,都是以拦截器做通知模型, 并维护一个以连接点为中心的拦截器链。
切入点(Pointcut): 匹配连接点(Joinpoint)的断言。通知和一个切入点表达式关联,并在满足这个切入点的连接点上运行(例如,当执行某个特定名称的方法时)。 切入点表达式如何和连接点匹配是AOP的核心:Spring缺省使用AspectJ切入点语法。
引入(Introduction): (也被称为内部类型声明(inter-type declaration))。声明额外的方法或者某个类型的字段。 Spring允许引入新的接口(以及一个对应的实现)到任何被代理的对象。 例如,你可以使用一个引入来使bean实现 IsModified 接口,以便简化缓存机制。
目标对象(Target Object): 被一个或者多个切面(aspect)所通知(advise)的对象。也有人把它叫做 被通知(advised) 对象。 既然Spring AOP是通过运行时代理实现的,这个对象永远是一个 被代理(proxied) 对象。
AOP代理(AOP Proxy): AOP框架创建的对象,用来实现切面契约(aspect contract)(包括通知方法执行等功能)。 在Spring中,AOP代理可以是JDK动态代理或者CGLIB代理。 注意:Spring 2.0最新引入的基于模式(schema-based)风格和@AspectJ注解风格的切面声明,对于使用这些风格的用户来说,代理的创建是透明的。
织入(Weaving): 把切面(aspect)连接到其它的应用程序类型或者对象上,并创建一个被通知(advised)的对象。 这些可以在编译时(例如使用AspectJ编译器),类加载时和运行时完成。 Spring和其他纯Java AOP框架一样,在运行时完成织入。
通知的类型:
前置通知(Before advice): 在某连接点(join point)之前执行的通知,但这个通知不能阻止连接点前的执行(除非它抛出一个异常)。
返回后通知(After returning advice): 在某连接点(join point)正常完成后执行的通知:例如,一个方法没有抛出任何异常,正常返回。
抛出异常后通知(After throwing advice): 在方法抛出异常退出时执行的通知。
后通知(After (finally) advice): 当某连接点退出的时候执行的通知(不论是正常返回还是异常退出)。
环绕通知(Around Advice): 包围一个连接点(join point)的通知,如方法调用。这是最强大的一种通知类型。 环绕通知可以在方法调用前后完成自定义的行为。它也会选择是否继续执行连接点或直接返回它们自己的返回值或抛出异常来结束执行。
环绕通知是最常用的一种通知类型。大部分基于拦截的AOP框架,例如Nanning和JBoss4,都只提供环绕通知。
切入点(pointcut)和连接点(join point)匹配的概念是AOP的关键,这使得AOP不同于其它仅仅提供拦截功能的旧技术。 切入点使得定位通知(advice)可独立于OO层次。 例如,一个提供声明式事务管理的around通知可以被应用到一组横跨多个对象中的方法上(例如服务层的所有业务操作)。