SpringMVC学习(一)--基础入门
MVC模型
是一种架构型的模式,只是帮助将开发的结构组织的更加合理,使展示与模型分离、流程控制逻辑、业务逻辑调用与展示逻辑分离 。
如图所示:
MVC模式是以控制器为核心的开发,将应用强制性划分为3部分:Model模型,采用JavaBeans,用于封装业务逻辑和业务数据。 View视图,采用jsp+jstl实现的,用于实现业务数据的显示和收集客户动作,Controller控制器,采用Servlet实现的[servlet filter xxxListener],用于流程控制。
MVC框架需要实现的功能:
以Controller为核心完成对系统流程的控制管理、从请求中收集数据{request.getParamter—struts2提供了属性驱动、模型驱动和对象驱动}、对传入参数进行验证{Struts2提供两种方法: validate编程实现,validate校验框架(UserAction-login-validation.xml)}、根据请求调用相应业务逻辑完成数据处理【MVC模型并没有提供对应的实现】、将处理结果返回给视图【struts2的Action返回String——逻辑视图名,根据配置跳转具体的物理地址】、国际化支持【I18N国际化、L10N本地化】、针对不同视图技术提供不同的解析方案、针对jsp视图技术提供标签库、通过拦截器链实现面向方面编程完成系统级控制【AOP】、对文件的上传、下载等常用功能的封装。
MVC的优点:
- 可以为一个模型在运行时同时建立和使用多个视图
- 视图与控制器的可接插性,允许更换视图和控制器对象,而且可以根据需求动态的打开或关闭、甚至在运行期间进行对象替换
- 模型的可移植性。因为模型是独立于视图的,所以可以把一个模型独立地移植到新的平台工作。需要做的只是在新平台上对视图和控制器进行新的修改
MVC的不足之处:
- 增加了系统结构和实现的复杂性。对于简单的界面,严格遵循MVC,使模型、视图与控制器分离,会增加结构的复杂性,并可能产生过多的更新操作,降低运行效率
- 视图与控制器间的过于紧密的连接。视图与控制器是相互分离,但确实联系紧密的部件,视图没有控制器的存在,其应用是很有限的,反之亦然,这样就妨碍了他们的独立重用
- 视图对模型数据的低效率访问。依据模型操作接口的不同,视图可能需要多次调用才能获得足够的显示数据。对未变化数据的不必要的频繁访问,也将损害操作性能
- 目前,一般高级的界面工具或构造器不支持模式。改造这些工具以适应MVC需要和建立分离的部件的代价是很高的,从而造成MVC使用的困难
SpringMVC
spring Web MVC是一种基于Java的实现了Web MVC设计模式的请求驱动类型的轻量级Web框架,即使用了MVC架构模式的思想,将web层进行职责解耦,基于请求驱动指的就是使用请求-响应模型,框架的目的就是帮助我们简化开发,Spring Web MVC也是要简化我们日常Web开发的。
Struts2是非常优秀的MVC构架
- 优点:非常多比如良好的结构,拦截器的思想,丰富的功能
- 缺点:Struts2由于采用了值栈、OGNL表达式、struts2标签库等,会导致应用的性能下降,应避免使用这些功能
- 而Struts2的多层拦截器、多实例action性能都很好
Spring3 MVC的优点
- Spring3 MVC使用简单,学习成本低。学习难度小于Struts2,Struts2用不上的多余功能太多
- Spring3 MVC很容易就可以写出性能优秀的程序,Struts2要处处小心才可以写出性能优秀的程序
- Spring3 MVC的灵活是无法想像的,Spring框架的扩展性有口皆碑,Spring3 MVC当然也不会落后,不会因使用了MVC框架而感到有任何的限制
SpringMVC应用一般开发步骤:
- 配置web.xml,指定业务层对应的Spring配置文件,定义DispatcherServlet
- 编写处理请求的控制器。处理器
- 编写视图对象
-
配置Spring mvc的配置文件,使控制器,视图解析器等生效
SpringMVC框架的原理图:
- 整个过程始于客户端发出一个HTTP请求,Web应用服务器接收到这个请求,如果匹配DispatcherServlet的请求映射路径(web.xml下指定),Web容器将该请求转交给DispatcherServlet处理。
- DispatcherServlet接收到请求后,将根据请求信息(包括URL,HTTP方法等)及HandlerMapping的配置找到处理请求的处理器(Handler)。可将HandlerMapping看成是路由器,将Handler看成是目标主机。值得注意的是:Spring mvc中并没有定义一个Handler接口,实际上任何一个Object都可以成为请求的处理器。
- 当DispatcherServlet根据HandlerMapping得到对应当前请求的Handler后,通过HandlerAdapter的Handler进行封装,再以统一的适配器接口调用Handler。HandlerAdapter是Spring mvc的框架级接口,顾名思义HandlerAdapter是一个适配器,它用统一的接口对各种Handler方法进行调用。
- 处理器完成业务逻辑的处理后将返回一个ModelAndView给DsipatcherServlet,ModelAndView包含了试图逻辑名和模型数据信息。
- ModelAndView中包含的是“逻辑试图名”而非真正的视图对象,DispatcherServlet借由ViewResolver完成逻辑试图名到真是试图对象的解析工作。
- 当得到真实的视图对象view后DispatcherServlet就使用这个View对象对ModelAndView中的模型数据进行试图渲染。
- 最终客户端得到的相应消息,可能是一个普通的HTML页面,也可能是一个XML或JSON串,甚至是一张图片或一个PDF文档等不同的媒体形式
MVC 框架 :
Spring web MVC 框架提供了模型-视图-控制的体系结构和可以用来开发灵活、松散耦合的 web 应用程序的组件。MVC 模式导致了应用程序的不同方面(输入逻辑、业务逻辑和 UI 逻辑)的分离,同时提供了在这些元素之间的松散耦合。
- 模型封装了应用程序数据,并且通常它们由 POJO 组成。
- 视图主要用于呈现模型数据,并且通常它生成客户端的浏览器可以解释的 HTML 输出。
- 控制器主要用于处理用户请求,并且构建合适的模型并将其传递到视图呈现。
DispatcherServlet:
Spring Web 模型-视图-控制MVC框架是围绕 DispatcherServlet 设计的,DispatcherServlet 用来处理所有的 HTTP 请求和响应。Spring Web MVC DispatcherServlet 的请求处理的工作流程如下图所示:
下面是对应于 DispatcherServlet 传入 HTTP 请求的事件序列:
- 收到一个 HTTP 请求后,DispatcherServlet 根据 HandlerMapping 来选择并且调用适当的控制器。
- 控制器接受请求,并基于使用的 GET 或 POST 方法来调用适当的 service 方法。Service 方法将设置基于定义的业务逻辑的模型数据,并返回视图名称到 DispatcherServlet 中。
- DispatcherServlet 会从 ViewResolver 获取帮助,为请求检取定义视图。
- 一旦确定视图,DispatcherServlet 将把模型数据传递给视图,最后呈现在浏览器中。
上面所提到的所有组件,即 HandlerMapping、Controller 和 ViewResolver 是 WebApplicationContext 的一部分,而 WebApplicationContext 是带有一些对 web 应用程序必要的额外特性的 ApplicationContext 的扩展。