`

深入整体分析Spring MVC framework(教程)

阅读更多
在当今(的)MVC framework里,,似乎Webwork2逐渐成为主流,, Webwork2+SpringFramework(的)组合变(得)越来越流行..这似乎意味着Spring自带(的)MVC framework远比Webwork2差,,所以大家纷纷用Webwork2来代替..确实,,Spring(的)MVC framework不算是整个Spring(的)核心部件,,但它们(的)威力却超过了很多人(的)想象..很多人包括xiecc认为 Spring(的)MVC framework是非常优秀(的),,甚至比Webwork2更优秀..

下面列举一下 Spring(的)MVC framework在设计时做出(的)一些重要(的)决定,,并将之和相关(的)MVC framework如Webwork2或struts进行对比:

一、Spring(的)整个MVC配置是基于IOC容器(的)

与 struts或webwork2相比,,这是一个ms有点奇怪(的)决定,,看一下Spring MVC(的)配置文件,,最先看到(的)不是action或者form,,而是一些有着特定名字(的)bean,,Bean下面(的)配置是一些简单或有点复杂(的)属性..我们们看到(的)是机器更容易(的)数据结构,,而不是人更容易理解(的)元素..

但是这恰恰是 Spring(的)MVC强大(的)根源!因为它们(的)配置就是Spring(的)核心IOC容器(的)配置,,这意味着所有IOC容器(的)威力都可以在这里展现,,我们们可以为所欲为(地)对Spring MVC进行扩展和增强,,我们们可以完成在其它们MVC framwork中很多难以想象(的)任务..想扩展新(的)URL映射方式吗?要换一个themeResolver或LocalReolver(的)实现吗?想在页面中显示新类型(的)View(比如说RDF,,呵呵,,一个小秘密:xiecc是研究语义网(的),,虽然成天不务正业,,不写论文,,只写八卦)?甚至想直接在Controller里定义AOP吗?这些对Spring(的)MVC来说都是小菜一碟..

我们没有仔细研究过 Webwork2(的)扩展机制,,我们知道通过Webwork2(的)interceptor机制,,可以进行很多(的)扩展,,甚至有一个简单简单 (的)IOC容器..但不管它们有多强大,,提供了多少扩展点..它们(的)威力都很难和真正(的)IOC容器相比..而struts(的)plugin 功能则是出名(的)滥,,虽然它们也提供了plugin机制..

Spring采用IOC配置(的)另一个原因是使 Spring(的)MVC与Spring(的)IOC容器(的)整合变(得)非常(的)容易..Spring提供了与struts与 webwork2(的)整合,,但是这样整合都需要在进行间接(的)包装,,感觉总不是很自然..而且还会导致一个概念多个配置,,webwork2就需要在Spring里配置bean,,再配置自己(的)xwork文件..想象一下吧,,我们们(的)bean直接就是一个controller,,直接可以完成MVC(的)所有任务,,这是多少爽(的)感觉..

Rod Johnson采用IOC容器来实现(的)另一个原因是这会减少好多开发工作量..看一下urlMapping吧,,它们提供(的)property本身就是一个HashMap,,只有配置完成,,我们们(的)bean里(的)数据就自然存在了,,哈哈,,好爽吧..不用象struts那样解析XML,, 再把它们(的)内容一项一项(地)读到HashMap里..

虽然这样(的)配置会有点怪异,,但假如我们们对Spring(的)IOC 容器非常熟悉(的)话,,会发现它们非常(的)亲切,,也非常(的)简单..

最后是一个简单(的)小秘密,,Spring怎么知道某个 bean(的)配置就是urlMapping?另一个bean(的)配置就是viewResolver?其实很简单,,把所有(的)bean全部读到内存里,,然后通过bean(的)名字或类型去找就行了..通过名字去找就是简单(的)getBean技巧,,通过类型去找则使用了 BeanFactoryUtils.beansOfTypeIncludingAncestors(的)静态技巧..

二、Spring 提供了明确(的)Model,, View概念和相应(的)数据结构

在Spring里有一个有趣(的)数据类型叫做 ModelAndView,,它们只是简单(地)把要显示(的)数据和显示(的)结果封装在一个类里..但是它们却提供了明确(的)MVC概念,,尤其是 model概念(的)强化,,使程序(的)逻辑变(得)更清晰了..

记(得)以前在Struts里写程序里(的)时候,,为了显示数据经常自己把东西放到HttpSession或HttpServletRequest里(或set到form里,,虽然不太有用),,这造成了model概念(的)模糊,,而且也导致了struts与JSP页面(的)紧耦合..假如我们们要替换成Veloctiy,,就(得)另外加一个plugin,,因为在velocity里数据是不需要不放到request里(的)..

Webwork2里强调(的)是与Web framework解耦和它们(的)command模式(的)简单性,,因此在它们(的)action里只有简单(的)get或set技巧,,假如返回数据,,也只是简单(地)返回一个String.当然这样(的)实现有它们(的)好处,,但是它们淡化了model和view(的)概念..Rod Johnson认为Webwork2里(的)Action同时包含了Action和Model(的)职责,,这样一个类(的)职责太多,,不是一个很好 (的)设计..当然Jason Carreira不太认同这种观点,,因为Action里(的)model对象完成可以delege给其它们对象..但不管怎样,,这种争论(的)根源在于Webwork2里淡化了model,, view甚至web(的)概念..仁者见仁,,智者见智,,最后(的)结果还是看个人喜欢好吧..

三、 Spring(的)Controller是Singleton(的),,或者是线程不安全(的)

和Struts一样,,Spring(的)Controller是Singleton(的),,这意味着每个request过来,,系统都会用原有(的)instance 去处理,,这样导致了两个结果:我们们不用每次创建Controller,,减少了对象创建和垃圾收集(的)时间;由于只有一个 Controller(的)instance,,当多个线程调用它们(的)时候,,它们里面(的)instance变量不是线程安全(的)..

这也是Webwork2吹嘘(的)(地)方,,它们(的)每个Action都是线程安全(的)..因为每过来一个request,,它们就创建一个 Action对象..由于现代JDK垃圾收集功能(的)效率已经不成问题,,所以这种创建完一个对象就扔掉(的)模式也(得)到了好多人(的)认可..Rod Johnson甚至以此为例证明J2EE提供(的)object pool功能是没多大价值(的)..

但是当人们在吹嘘线程安全怎么怎么重要(的)时候,,我们想请问有多少人在多少情况下需要考虑线程安全?Rod Johnson在分析EJB(的)时候也提出过其它们问题,,并不是没有了EJB(的)线程安全魔法,,世界就会灭亡(的),,大多数情况下,,我们们根本不需要考虑线程安全(的)问题,,也不考虑object pool.因为我们们大多数情况下不需要保持instance状态..

至少我们写了那么多(的)struts Action,,写了那么多(的)Spring Controller,,几乎没有碰到需要在instance变量保持状态(的)问题..当然也许是我们写(的)代码不够多,,Struts(的)设计者 Craig R. McClanahan曾经说当时他们设计struts时有两个条件不成熟:当时没有测试驱动开发(的)概念;当时JVM(的)垃圾收集性能太次..假如现在重新设计(的)话,,他们也会采用每个request生成一个新对象(的)设计技巧,,这样可以解决掉线程安全(的)问题了..

四、 Spring不象Webwork2或tapestry那样去隐藏Servlet相关(的)元素如HttpServletRequest或 HttpServletResponse

这又是一个重要(的)设计决定..在Webwork2里我们们没有 HttpServletRequest或者HttpServletResponse,,只有getter,, setter或ActionContext里数据,,这样(的)结果导致一个干净(的)Action,,一个与Web完全无关(的)Action,,一个可以在任何环境下独立运行(的)bean.那么Webwork2(的)这样一个基于Command模式(的)Action究竟给我们们带来了什么?我们想主要有两点:

1、它们使我们们(的)Action可以非常容易(地)被测试..

2、用户可以在Action里添加业务逻辑,,并被其它们类重用..

然而仔细跟Spring比较一下,,我们们就会发现这两点功能所带来(的)好处其实并不象我们们想象 (的)那么显著..Spring(的)Controller类也可以非常轻松被测试,,看一下spring-mock下面(的)包吧,,它们提供 (的)MockHttpServletRequest,, MockHttpServletResponse还有其它们一些类让测试Controller变(得)异常轻松..再看一下Action里(的)业务逻辑吧,,Jason Carreira曾经说我们们可以尽情(地)在Webwork2(的)Action里加业务逻辑,,因为Action是不依赖于Web(的)..但是有多少人真正往Action里加业务逻辑(的)?大多数人都会业务逻辑delegate给另一个Service类或Manager类..因为我们们很清楚,, 往Action里加业务逻辑会使整个体系(的)分层架构变(得)不清晰,,不管怎样,,Web层就是Web层,,业务层就是业务层,,两者(的)逻辑混在一起总会带来问题(的)..而且往Action里加业务逻辑会使用这个Action类变(得)庞大,,Webwork2(的)Action是每个 request都创建实例(的),,尽管带来(的)性能影响不太大,,但并不表示每次都要把业务逻辑再new出来,,业务逻辑在大多数(的)情况下应该是单例(的)..

不把request和response展现给用户当然还会带来功能上(的)损失,,也许一般(的)场合,,用用 webwork2提供(的)接口已经足够了,,但有时我们们必须要知道request和response才能发挥出更大(的)威力..比如我们以前(的) 一个项目里有一个通过递归动态生成(的)树状结构(的)页面,,在jsp页面上显示递归是痛苦或不可能(的),,因此我们用response直接 write出页面,,这在spring里很easy,,但在webwork里可能比较难了(偶不敢肯定,,偶研究(得)不够深,,也许高手是有办法 (的))..

五、Spring提供了不错但不够充分(的)interceptor机制

回头看一下struts,,它们在架构里甚至没有给我们们提供hook point(的)机会,,我们们没有任何机会加入自己(的)interceptor.我们们只能通过重载 struts(的)RequestProcessor类来进行一点有限(的)扩展..

到了Webwork2,,似乎 interceptor一下子成了整个Framework(的)核心,,除了Action(的)核心部件,,其它们所有(的)东西都是 interceptor.它们(的)超强(的)interceptor功能使们扩展整个架构变(得)非常方便..有人称这种interceptor为 AOP,,Jason Carreira则自豪(地)宣称这个叫做pragamtic AOP.我们不认同这是AOP,,它们只是简单(的)interceptor机制..但不管如何,,它们(的)interceptor确实有强大(的)功能..

Spring也提供了它们(的)interceptor机制,,它们(的)HandlerInterceptor三个 interceptor技巧:peHandle,, postHandle,, afterCompletion.分别对应Controller执行前,,Controller执行后和page render之后..虽然大多数情况下已经够用,,但是从功能上来说显然它们没有Webwork2强大..从AOP(的)角度来看,,它们没有提供 around interceptor,,而只有before与after interceptor.这意味着我们们无法在interceptor前后保持状态,,最简单(的)情况假如我们们要计算一个Contr12下一页
分享到:
评论

相关推荐

    Spring MVC framework 深入分析

    在当今的MVC framework里,似乎Webwork2逐渐成为主流, Webwork2+SpringFramework的组合变得越来越流行。这似乎意味着Spring自带的MVC framework远比Webwork2差,所以大家纷纷用Webwork2来代替。确实,Spring的MVC ...

    Spring mvc 教程

    ### Spring MVC 教程知识点详解 #### Spring Web MVC 框架简介 Spring Web MVC 是 Spring Framework 的一个重要组成部分,主要用于构建基于 Java 的 Web 应用程序。它提供了一个灵活且强大的 MVC 实现,使得开发者...

    精通Spring MVC 4

    Spring MVC属于SpringFrameWork的后续产品,已经融合在Spring Web Flow里面。Spring 框架提供了构建 Web 应用程序的全功能 MVC 模块。Spring MVC4是当前zuixin的版本,在众多特性上有了进一步的提升。, 在精通Spring...

    Spring MVC jar包

    而`spring-framework-2.5.6-with-docs.zip`可能包含了Spring 2.5.6的源码和文档,帮助开发者了解Spring MVC的内部实现和最佳实践。 总之,这个压缩包提供了开发基于Spring MVC和Hibernate的Java Web应用所需要的...

    spring3.0 MVC中文教程

    ### Spring 3.0 MVC中文教程知识点概览 #### 一、Spring 3.0 MVC框架简介 **Spring 3.0 MVC** 是Spring框架的一部分,专注于构建Web应用程序。相较于之前的版本,Spring 3.0引入了许多新特性,使得开发者能够更加...

    spring3.0 mvc中文实例教程

    【Spring3.0 MVC框架简介】 Spring3.0 MVC是Spring框架的重要组成部分,专注于构建高性能、健壮...通过这些教程,开发者可以全面了解和掌握Spring 3.0 MVC框架,从而在实际项目中灵活运用,构建出高效、可靠的Web应用。

    springmvc深入解析.pdf

    Spring MVC深入解析 Spring MVC是一个基于模型-视图-控制器(MVC)模式的Web应用程序框架,是Spring Framework的一部分。它提供了一个灵活的方式来构建Web应用程序,使得开发者可以轻松地创建复杂的Web应用程序。 ...

    spring mvc jar包

    3. `org.springframework.web.servlet-3.0.2.RELEASE.jar`:这是 Spring MVC 的核心模块,提供了控制器(Controller)、模型视图(ModelAndView)以及调度器Servlet(DispatcherServlet)等关键组件。...

    spring mvc简单的例子和教程

    在本教程中,我们将深入探讨Spring MVC的基本概念、配置、以及如何创建一个简单的示例。 首先,Spring MVC的核心概念包括DispatcherServlet、Controller、Model、View和ViewResolver。DispatcherServlet是Spring ...

    spring mvc框架依赖全面jar

    Spring MVC 是一个基于 Java 的轻量级Web应用框架,它为构建模型-视图-控制器(MVC)架构的应用程序提供了强大的支持。在本压缩包中包含了一系列与Spring MVC相关的jar文件,这些文件是构建和运行Spring MVC项目所...

    Spring MVC使用Demo

    这个"Spring MVC使用Demo"提供了实践操作,帮助开发者深入理解Spring MVC的开发环境配置、注解的使用以及工作原理。 首先,Spring MVC的设计模式基于Model-View-Controller(MVC),它将应用程序的业务逻辑、数据和...

    spring mvc 教程

    ### Spring MVC 教程知识点详解 #### Spring Web Flow 2.0 技术要点与实践应用 **一、Spring Web Flow 2.0 概览** - **Spring Web Flow** 是Spring框架的一个子项目,专注于解决多请求之间的交互问题,即用户与...

    spring mvc 自学教程

    【Spring MVC 自学教程】 Spring MVC 是一个基于 Model-View-Controller(MVC)设计模式的轻量级 Web 开发框架。它使开发者能够轻松地将业务逻辑、数据处理和用户界面分离,从而提高代码的可维护性和复用性。 **...

    Spring MVC源码深度剖析开源架构源码2021.pdf

    ***.mvcframework.servlet.LgDispatcherServlet <param-name>contextConfigLocation <param-value>springmvc.properties <servlet-name>lgoumvc <url-pattern>/* ``` 以上配置显示了如何在web.xml...

    Spring MVC是Spring Framework的一部分

    **Spring MVC 概述** Spring MVC 是 Spring Framework 的一个核心模块,主要负责处理 Web 应用中的模型-视图-控制器(Model...通过深入理解并熟练掌握 Spring MVC,开发者能够更好地构建高效、可维护的 Web 应用程序。

    Spring MVC学习指南

    在深入探讨 Spring MVC 之前,我们先简要回顾一下 MVC 设计模式的关键流程: 1. **收集页面输入参数**:Web 页面通过 HTML 表单收集用户的输入。 2. **调度逻辑处理**:控制器接收到请求后,根据请求内容调度相应的...

    spring-framework-master

    通过阅读和分析"spring-framework-master",开发者可以深入理解Spring的工作机制,提升自己的编程技巧,同时也可以根据需求自定义扩展,使Spring更好地服务于项目需求。这不仅对于Java开发者,对于所有希望深入学习...

    Spring MVC 简单Demo

    下面,我们将深入探讨Spring MVC的核心概念、工作原理以及如何创建一个简单的示例。 1. **Spring MVC 概述** Spring MVC是Spring框架的一部分,用于处理HTTP请求和响应。它采用Model-View-Controller(MVC)设计...

    spring mvc用到的jar包 spring-framework-3.1.1

    spring mvc用到的jar包 spring-framework-3.1.1.RELEASE-with-docs.zip和jstl-1.1.2.jar和standard-1.1.2.jar和commons.logging-1.1.1.jar;

Global site tag (gtag.js) - Google Analytics