说明:此系列文章为博主原创翻译,转载请注明:http://blog.csdn.net/hugh282003/article/details/19031455
Spring MVC以DispatcherServlet为核心,通过DispatcherServlet转发客户端请求交由控制器处理,框架提供了可配置的控制器映射管理,视图解析管理,地区、时区和主题解析管理以及对文件上传的支持等。
对客户端请求的处理,默认是交由基于@Controller和@RequestMapping注解的控制器来处理,在这个控制器里提供了一系列灵活的对不同请求的处理方法。通过@Controller注解这种控制器实现机制,Spring MVC也可以实现具有RESTful风格的应用,这是通过@PathVariable注解以及框架的其他特征来提供的。
在Spring MVC中,任何对象都可作为命令或表单对象来使用,无需去实现框架指定的接口或继承一个父类。框架的数据绑定机制是非常灵活的,比如,框架把数据类型不匹配当作校验错误而不是系统错误来处理,这样程序就可以利用这种校验错误来做一些工作。通过这样一种处理机制,我们无需为了处理客户端的无效请求参数或是对参数的字符串化而在业务对象和表单对象之间进行复制工作。框架可以直接在请求参数和业务对象之间进行数据绑定。
Spring MVC的视图解析机制也是异常灵活的。控制器不只是可以提供数据modelMap和选择视图名称,也可以直接写数据到响应流从而完成整个请求处理。通过文件扩展名或请求头的内容类型(content type)约定,或是bean的名称,properties文件甚至是自定义的ViewResolver实现类,框架对视图名称的解析是高度可配置的。框架的模型部分是一个Map接口,实现了对视图的完全抽象。视图层可以直接集成诸如JSP、Velocity和Freemarker等模板展示技术,或是直接使用XML、JSON、Atom以及其他类型的内容显示技术。模型层的Map会被转换成合适的类型,比如JSP的请求参数或Velocity的模板参数等。
1.1 Spring MVC 4的主要特性:
1、清晰的角色分离。框架的每个角色,如控制器、校验器、命令对象、表单对象、模型对象、DispatcherServlet、控制器映射器、视图解析器等等,都是通过一个专门的对象来负责的。
2、框架的处理类和应用的业务类都可以作为JavaBean来配置。这种可配置性使得跨上下文引用更加简单,例如从控制器到业务对象和校验器之间的引用。
3、适应性、非侵入性和灵活性。控制器的方法签名定义是非常灵活的,根据不同场景可以使用诸如@RequestParam、@RequestHeader和@PathVariable等方法参数注解。
4、可重用的业务逻辑,无需复制。已有的业务对象就可直接作为命令或表单对象使用,而无需再复制一份以继承某一个框架的基类。
5、数据绑定和校验处理可自定义实现。数据类型的不匹配是作为应用程序级别的校验错误来处理,在校验的结果里保存了不合法的值、本地化的日期以及数字的绑定等等信息,而不用把表单对象的属性全部作为字符串,然后再手工解析和转换成业务对象的相应属性。
6、可自定义的控制器映射器和视图解析器。控制器映射和视图解析机制包括简单的基于URL的配置到复杂的特定的解析策略。在这一点,Spring比其他使用了某一特殊技术的Web MVC框架要灵活得多。
7、灵活的模型传输。模型传输以键值对的Map进行,支持与任何视图技术的集成。
8、可自定义的地区、时区和主题解析机制,支持使用或不使用Spring标签库的JSP,JSTL以及与Velocity的无缝集成等等。
9、简单且强大的JSP标签库(也称为Spring标签库),提供了对诸多特性的支持,比如数据绑定和主题等。在标记语言方面,可自定义的标签提供了极大的灵活性。关于标签描述符的更多信息,请参考spring.tld文件。
10、Spring 2.0引入的JSP表单标签库使得编写JSP页面的表单更加简单。关于表单标签描述符的更多信息,请参考spring-form.tld文件。
11、Bean的生命周期范围为当前的HTTP请求或会话。这一点并非是Spring MVC框架本身特有的一个特性,更确切地说是Spring MVC框架使用的WebApplicationContext容器所属的特性。关于Bean的生命周期范围的详细描述将会在后面的章节说明。
1.2 与其他MVC实现的可集成性
对于某些项目来说,采用非Spring MVC的实现可能更加合适,比如Struts和JSF,这两个框架在已有的项目中使用的比较广泛。如果不想使用Spring的Web MVC框架,但是想使用Spring的其他解决方案,则可以轻松地把你选择的MVC框架与Spring进行集成。比如与Struts的集成,则可以这样做:通过Spring的ContextLoaderListener启动Spring应用程序上下文(root application context),然后在Struts的Action类中就可以通过ServletContext属性或Spring提供的工具类来获取到ApplicationContext或WebApplicationContext。不需要借助插件,因此也就不需要进行专门的集成处理。因此,我们可以把Spring当作一个库来使用,只是把应用程序上下文(root application context)的实例来作为使用Spring框架的入口点。
你可以不依赖Spring Web MVC而自由地使用注册的Bean和Spring的服务。Spring框架解决了很多专门的Web MVC框架没有解决的问题,比如Bean的配置、数据访问、事务处理等。因此,在你的应用里,Spring可以被用来作为中间层或数据访问层,甚至你只是想使用其中的一个特性,比如对JDBC或Hibernate的事务抽象机制。