Spring+MyBatis企业应⽤实战(1)
第⼀章 Java EE 应⽤
JavaEE应⽤的分层模型
(1)Domain Object(领域对象)层:POJO(Plain Old Java Object)组成,包含了各⾃所需实现的业务逻辑⽅法。
(2)DAO(Data Access Object,数据访问对象)层:DAO组件组成,这些DAO实现了对数据库的创建、查询、更新和删除(CRUD)等原⼦操作。
(3)Service(业务逻辑)层:业务逻辑对象组成,这些对象实现了系统所需要的业务逻辑⽅法。
(4)Controller(控制器)层:控制器组成,这些控制器⽤于拦截⽤户请求,并调⽤业务逻辑组件的⽅法,处理请求,根据结果向不同的表现层组件转发。
(5)View(表现)层:Jsp页⾯、Velocity页⾯、pdf⽂档视图组件组成,负责搜集⽤户请求,并显⽰处理结果。
为了应⽤以后的扩展性,各层的JavaEE组件之间以松耦合的⽅式耦合,不以硬编码⽅式耦合。上⾯组件的实现依赖下⾯组件的功能,下⾯组件⽀持上⾯组件的实现。
第⼆章 SpringMVC简介
1、传统 Model1 和 Model2
Model1模式:1)整个 Web 应⽤⼏乎全部由 JSP 页⾯组成。JSP页⾯接收处理客户请求,对请求处理后直接做出响应。少量的JavaBean 来处理数据库连接、数据库访问等操作。2)实现简单,适⽤于快速开发⼩规模项⽬。3)局限性明显:JSP 页⾯⾝兼 View 和Controller两种⾓⾊,将控制逻辑和表现逻辑混杂在⼀起,导致代码的重⽤性⾮常低,应⽤难以扩展和维护。
Model2模式:1)基于MVC架构的设计模式。Servlet作为前端控制器,接收客户请求。Servlet中只包含控制逻辑和简单的前端处理;然后调⽤ JavaBean 来完成实际的逻辑处理;最后,将其转发到响应的 JSP 页⾯来显⽰处理逻辑。具体实现⽅式如下图:
在Model2模型下,Model由JavaBean充当,View由JSP页⾯充当,Controller由Servlet充当。Model2具有组件化的特点,适⽤于⼤规模应⽤的开发,但增加了应⽤开发的复杂程度。
2、MVC思想及其优势
MVC是所有⾯向对象程序设计语⾔都应该遵守的规范,并⾮Java语⾔所特有的设计思想,也不是Web应⽤所特有的思想。MVC思想将⼀个应⽤分成三个基本部分:Model(模型)、View(视图)、和Controller(控制器),这三个部分以最少的耦合协同⼯作,提⾼应⽤的扩展性和维护性。MVC思想类似于观察者模式,但其与观察者模式存在少许差别:观察者模式下,观察者和被观察者可以是两个互
相对等的对象;但在MVC中,被观察者往往只是单纯的数据体,⽽观察者则是单纯的视图页⾯。(引起差别的主要原因是:Web应⽤是⼀种 请求/响应模式下的应⽤,如果⽤户不对应⽤发出请求,视图将⽆法主动更新⾃⼰。)
MVC有如下特点:1)多个视图可以定义⼀个模型。按MVC设计模式,⼀个模型对应多个视图,可以减少代码的复制及代码的维护量,易于维护。2)模型返回的数据与显⽰逻辑分离。模型数据可以应⽤任何的显⽰技术,JSP页⾯/Velocity模板/直接产⽣。3)应⽤被分隔为三层,降低各层之间的耦合,提供了应⽤的可扩展性。4)控制层的概念也很有效,由于它把不同的模型和不同的视图组合在⼀起,完成不同的请求。因此,控制层可以说包含了⽤户请求权限的概念。5)MVC更符合软件⼯程化管理的精神。不同的层各司其职,每⼀层的组件具有相同的特征,有利于通过⼯程化和⼯具化的⽅法产⽣管理程序代码。
Web模式下的MVC:对于⼀个普通的应⽤程序,可以将视图注册给模型,当模型数据发⽣改变时,及时通知视图页⾯发送改变;⽽对于Web应⽤,即使使多个JSP页⾯注册给⼀个模型,但当模型发⽣变化时,模型也⽆法主动给JSP页⾯发送消息(因为Web应⽤都是基于 请求/响应 模式的),只有当⽤户请求浏览该页⾯时,控制器才负责调⽤模型数据来更新JSP页⾯。遵循了MVC模式的JavaWeb的运⾏流程图:
3、SpringMVC的特点
1)SpringMVC强⼤的灵活性、⾮侵⼊性、可配置性。
2)SpringMVC提供前端控制器DispatcherServlet,开发者⽆需额外开发控制器对象。
3)SpringMVC分⼯明确,包括控制器、验证器、命令对象、模型对象、处理程序映射、视图解析器...,每⼀个功能实现由⼀个专门的对象负责完成。
4)SpringMVC⾃动绑定⽤户输⼊,正确转换数据类型。例如,SpringMVC能⾃动解析字符串,并将其设置为模型的int或float类型的属性。
5)SpringMVC使⽤⼀个名称/值的Map对象实现更加灵活的模型数据传输。
6)SpringMVC内置了常见的校验器,可以校验⽤户的输⼊,如果校验不通过,则重定向回输⼊表单。输⼊校验是可选的,并且⽀持编程⽅式及声明⽅式。
7)SpringMVC⽀持国际化,⽀持根据⽤户区域显⽰多国语⾔,并且国际化的配置⾮常简单。
8)SpringMVC⽀持多种视图技术,最常见的有JSP技术以及其他技术,包括Velocity和FreeMarker。
9)Spring提供了⼀个简单⽽强⼤的JSP标签库,⽀持数据绑定功能,使得编写JSP页⾯更加容易。
4、详解DispatcherServlet
org.springframework.web.servlet.DispatcherServlet
protected void initStrategies(ApplicationContext context) {
//初始化⽂件上传解析器
this.initMultipartResolver(context);
//初始化本地化解析器
this.initLocaleResolver(context);
//初始化主题解析器
this.initThemeResolver(context);
//初始化处理器映射器,,将请求映射到处理器
this.initHandlerMappings(context);
//初始化处理器适配器
this.initHandlerAdapters(context);
//初始化处理器异常解析器,如果执⾏过程中遇到异常,将交给HandlerExceptionResolver来解析
this.initHandlerExceptionResolvers(context);
//初始化请求到视图名称解析器
this.initRequestToViewNameTranslator(context);
//初始化视图解析器,通过 ViewResolver 解析逻辑视图名到具体视图实现
this.initViewResolvers(context);
//初始化 flash 映射管理器
this.initFlashMapManager(context);
}
initStrategies ⽅法在WebApplicationContext初始化后⾃动执⾏,⾃动扫描上下⽂的Bean,根据名称或类型匹配的机制查⾃定义的组件,如果没有到则会装配⼀套Spring的默认组件。在org.springframework.web.servlet路径下有⼀个DispatcherServlet.properties 配置⽂件,该⽂件指定了DispatcherServlet所使⽤的默认组件。
5、SpringMVC执⾏的流程
问:Controller并未接收到⽤户请求,它怎么能够处理⽤户的请求呢?这要看MVC框架的底层机制:前端Servlet接收到请求后,通常会对⽤户请求进⾏简单预处理,例如解析、封装参数等,然后通过反射来创建Controller实例,并调⽤Controller的指定⽅法(实现Controller 接⼝的是handleRequest⽅法,⽽使⽤基于注解的控制器可以是任意⽅法)来处理⽤户请求。
问:当Servlet拦截⽤户请求后,它如何知道创建哪个Controller接⼝的实例呢?有两种解决⽅案:⼀是利⽤xml配置⽂件,例如在xml配置⽂件中描述hello请求对应使⽤HelloController类。这就可以让MVC框架知道创建哪个Controller接⼝的实例。⼆是利⽤注解,例如使⽤注解Controller描述⼀个类,并使⽤注解@RequestMapping(value="/hello")描述hello请求对应的⽅法。这样也可以让MVC框架知道创建哪个Controller接⼝的实例并调⽤哪个⽅法处理请求。
所以说,在SpringMVC框架中,控制器实际上由两部分组成:DispatcherServlet(拦截所有⽤户请求和处理请求)和Controller(处理实际的业务控制)。
完整流程:
①⽤户向服务器发送请求,请求被Spring的前端控制器DispatcherServlet截获。
②DispatcherServlet对请求URL(统⼀资源定位符)进⾏解析,得到URI(请求资源标识符)。然后根据该URI,调⽤HandlerMapping 获得该Handler配置的所有相关对象,包括Handler对象以及Handler对象对应的,这些对象会被封装到⼀个HandlerExecutionChain对象当中返回。
③DispatcherServlet根据获得的Handler,选择⼀个合适的HandlerAdapter。HandlerAdapter的设计符合⾯向对象中的单⼀职责原则,代码架构清晰,便于维护,最重要的是,代码可复⽤性⾼。HandlerAdapter会被⽤于处理多种Handler,调⽤Handler实际处理请求的⽅法,例如hello⽅法。
④根据请求中的模型数据,开始执⾏Handler(Controller)。在填充Handler的⼊参过程中,根据配置,Spring将帮你做⼀些额外的⼯作(消息转换、数据转换、数据格式化、数据验证)。
⑤Handler执⾏完成后,向DispatcherServlet返回⼀个ModelAndView对象,ModelAndView对象中应该包含视图名或视图名和模型。springmvc常用标签
⑥根据返回的ModelAndView对象,选择⼀个合适的ViewResolver(视图解析器)返回给DispatcherServlet。
⑦ViewResolver结合Model和View来渲染视图。
⑧将视图渲染结果返回给客户端。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论