Part V. The Web
文档的这一部分介绍了Spring框架对展现层的支持(尤其是基于web的展现层)
Spring拥有自己的web框架——Spring Web MVC。在前两章中会有介绍。
剩下的章节则用来介绍Spring和其它web技术的集成,比方Struts和JSF(这里仅仅提两个)。
本节以对Spring MVC portlet框架的介绍结尾。
第十五章——Web MVC框架(Web MVC framework)
第十六章——视图技术(View technologie)
第十七章——与其它web框架集成(Integrating withother web frameworks)
第十八章——Portlet MVC框架(Portlet MVC Framework)
15.WebMVC 框架
15.1 介绍Spring Web MVC框架
Spring Web MVC框架环绕一个分发器(DispatcherServlet)来设计,它的作用是将请求(request)分发到相应的处理器(handler),这还须要依赖可配置的处理器映射(handlermappings)。视图解析(view resolution)。本地化和主题解析(local andtheme resolution)和上传文件支持。
默认的handler依赖于@Controller和@RequestMapping注解来提供灵活的处理方法。而在Spring3.0中,@Controller机制还同意你通过@PathVariable注解和另外一些功能来创建RESTful风格的站点和应用。
“开放扩展(Open for extension)”
在Spring Web MVC和Spring中,一个关键的设计准则就是“开放扩展。关闭改动”原则。
在Spring Web MVC核心类中的某些方法会被标记为final。作为一个开发者。你无法重写这些方法来满足你的需求。
这并非任意而为的。而必需要有界定准则。
对于这个原则的一个解释,你能够看看Seth Ladd等写的Expert Spring Web MVC and Web Flow。尤其是看“A Look AtDesign”这一章,在第一版的117页。或者你也能够看
1. Bob Martin, The Open-Closed Principle (PDF)
在使用Spring MVC的时候你无法为final方法加入advice。比如,你无法为AbstractController.setSynchronizeOnSession()加入advice。能够參考“UnderstandingAOP proxies”这一节来获得很多其它关于AOP代理的信息和无法为final方法加入advice的原因。
在Spring Web MVC中你可以使用不论什么对象来充当命令对象或是表单对象。
所以你不须要去实现一个框架相关的接口或者基类。Spring的数据绑定高度灵活。比如,它将类型不匹配当做是校验错误(validationerrors),从而可以被应用程序处理,而不是直接的系统错误。因此你无需将业务对象的属性当做strings来复制去处理无效的提交,或是转换那些字符串属性。
而通常更好的做法是直接将參数绑定到你的业务对象上去。
Spring的视图解析也格外的灵活。Controller的实现甚至能够直接向response流里写数据。通常一个ModelAndView对象包括一个视图名(view name)和一个模型Map(model Map)。model Map中包括含了beannames和其相应的对象,比方命令对象或是表单对象。
视图名称解析能够通过bean names。properties文件或是你自己的ViewResolver实现来配置。
The model以Map接口为基础。这同意视图技术全然抽象化。你能够直接集成JSP,Velocity或是其它页面渲染技术。
由于model Map能够非常easy地被转换成合适的格式,比方一个JSP requestattributes或者是Velocity的模板model。
Spring MVC的特点
Spring Web 流程
Spring Web Flow(SWF)的目标是成为最好的web应用页面流管理的解决方式。
SWF能够融入现有的框架。比方Spring MVC。Struts和JSF,在servlet和protlet环境中都能够。假设你有一个业务流程。这个业务流程会从会话模式而不是单纯的请求模式得到优点。那么SWF就可能是解决方式。
SWF能够让你去捕获逻辑页面流作为“自包括”的模块。
在不同的场景能够复用,这样就有利于创建web应用模块化,能够通过受约束的导航引导用户驱动业务流程。
若须要了解很多其它关于SWF的信息,能够去Spring Web Flow website看看.
Spring的web模块包含非常多仅仅有web才支持的特点:
清晰的角色分离。每种角色——控制器(controller),校验器(validator)。命令对象(commandobject)。表单对象(form object)。模型对象(modelobject),分发器(DispatcherServlet),处理器映射(handler mapping)。页面解析器(viewresolver)等等——都能够通过特定的对象来实现。
强大且简洁的配置。
Powerfuland straightforward configuration of both framework and application classes asJavaBeans. This configuration capability includes easy referencing acrosscontexts, such as from web controllers to business objects and validators.这段翻译不好~~
适应性。非侵入性和灵活性。
依据给定的场景,用一些參数注解(比方@RequestParam,@RequestHeader。@PathVariable等)来定义你须要的控制器方法。
重用业务代码,无需反复。直接使用现有的业务对象来充当命令对象或表单对象。而不是让他们继承一个特定的框架基类。
可自己定义的绑定和校验。类型不匹配作为应用级别的校验错误,从而实现本地化的日期。数字和其它一些值的绑定,并不仅仅是基于字符串的表单对象的绑定。
当中后者还须要进行手动的类型转换去转换成一个业务对象。
可自己定义的处理器映射和视图解析。处理器映射和视图解析策略从简单的基于URL的配置到复杂的、为特定目的而生的解析策略。Spring比那些托管技术的web MVC框架更灵活。
灵活的模型转换。
模型可与一个key/value的map互相转换。从而支持与不论什么试图技术集成
可定义的本地化和主题解析。
支持带或不带Spring标签库的JSPs。支持JSTL。支持Velocity且不须要额外的桥接。
Spring标签库是一个简单却强大的JSP标签库,它提供了对数据绑定和主题的支持。
在标记代码方面。自己定义的标签同意最大化的灵活性。想要找到很多其它关于标签库描写叙述符号的信息。能够看附录F,spring.tld
在Spring2.0中。有一个JSP表单标签库,使在JSP中制作表单更加便捷。
想要找到很多其它关于标签库描写叙述符号的信息,能够看附录G。spring-form.tld
Beans的生命周期范围是当前HTTP请求或HTTPSession。
这是WebApplicationContext容器的特点,而不是Spring MVC的特点。仅仅是SpringMVC使用了WebApplicationContext。这些bean的作用范围在“Request,session。andglobal session scopes”这一章有介绍。
其它MVC实现的可插拔性
Spring MVC的实现可能对于一些项目来说并非最合适的。很多团队期望利用现有的投资来提高技术和工具。比方Struts框架中包括了大量的知识量和使用经验。假设你能够忍受Struts体系结构的缺陷,那么它能够作为你web层的还有一个选择。对于其它MVC框架也是一样的。
假设你不想使用Spring的web MVC,可是可是想要使用Spring提供的其它解决方式,你能够将你选择的web MVC框架集成到Spring上来,这将会很easy。
你仅仅须要通过ContextLoaderListener来启动一个Spring的根应用上下文。然后从集成的Struts或WebWork的控制中通过ServletContext属性来訪问它(或Spring自己的帮助方法)。
No"plug-ins" are involved, so no dedicated integration is necessary。
从web层的角度来看。你仅仅是将Spring作为一个库来使用。并将根应用上下文对象作为切入点。
即使不使用Spring的WEB MVC,你注冊了的beans和Spring的services也会变得触手可及。Spring并不与Struts或WebWork竞争,它仅仅是提供那些单纯的web MVC框架不提供的功能,比方bean的配置,数据訪问以及事务处理。因此你能够使用Spring中间层 和/或 数据訪问层来丰富你的应用。即使你仅仅是想结合JDBC或Hibernate来使用抽象事务管理。
Spring官方文档翻译——15.1 介绍Spring Web MVC框架的更多相关文章
-
Spring官方文档翻译——15.4 处理器映射(Handler mappings)
15.4 处理器映射(Handler mappings) 注:以下将handler翻译成处理器 在Spring早先的版本号中,用户还须要在web应用上下文中定义处理器映射来配置请求(requests) ...
-
Spring官方文档翻译(1~6章)
Spring官方文档翻译(1~6章) 转载至 http://blog.csdn.net/tangtong1/article/details/51326887 Spring官方文档.参考中文文档 一.S ...
-
Spring 4 官方文档学习 Web MVC 框架
1.介绍Spring Web MVC 框架 Spring Web MVC 框架是围绕DispatcherServlet设计的,所谓DispatcherServlet就是将请求分发到handler,需要 ...
-
Spring 4 官方文档学习(十一)Web MVC 框架
介绍Spring Web MVC 框架 Spring Web MVC的特性 其他MVC实现的可插拔性 DispatcherServlet 在WebApplicationContext中的特殊的bean ...
-
Spring Web MVC框架简介
Web MVC framework框架 Spring Web MVC框架简介 Spring MVC的核心是`DispatcherServlet`,该类作用非常多,分发请求处理,配置处理器映射,处理视图 ...
-
Spring 4 官方文档学习(十一)Web MVC 框架之配置Spring MVC
内容列表: 启用MVC Java config 或 MVC XML namespace 修改已提供的配置 类型转换和格式化 校验 拦截器 内容协商 View Controllers View Reso ...
-
12.Spring——Web MVC框架
1.Spring Web MVC 框架 2.Spring MVC Hello World 例子 1.Spring Web MVC 框架 Spring web MVC 框架提供了模型-视 ...
-
Spring 4 官方文档学习(十一)Web MVC 框架之themes
http://docs.spring.io/spring/docs/current/spring-framework-reference/html/mvc.html#mvc-themeresolver ...
-
Spring 4 官方文档学习(十一)Web MVC 框架之resolving views 解析视图
接前面的Spring 4 官方文档学习(十一)Web MVC 框架,那篇太长,故另起一篇. 针对web应用的所有的MVC框架,都会提供一种呈现views的方式.Spring提供了view resolv ...
随机推荐
-
使用hexo在github上写blog
使用hexo在github上写blog 安装nodejs http://nodejs.org/ 安装hexo npm install -g hexo 创建bolg文件夹 安装完成后在自己的工作目录创建 ...
-
<;a href=&#39;?out=login&#39;>;是什么意思
<a href='?out=login'>退出</a>前面加上问号?就是GET方式传递out=login是要传递的数据点这个链接就可以执行 接下来通过$_GET["o ...
-
[Sciter系列] MFC下的Sciter&ndash;5.Sciter中GUI线程研究
[Sciter系列] MFC下的Sciter–5.Sciter中GUI线程研究,目前MFC存在问题,win32没问题. 本系列文章的目的就是一步步构建出一个功能可用,接口基本完善的基于MFC框架的Sc ...
-
【转】Linux 标准目录结构
初学Linux,首先需要弄清Linux 标准目录结构 / root --- 启动Linux时使用的一些核心文件.如操作系统内核.引导程序Grub等. home --- 存储普通用户的个人文件 ftp ...
-
10、手把手教你Extjs5(十)自定义模块的设计
从这一节开始我们来设计并完成一个自定义模块.我们先来确定一个独立的模块的所能定义的一些模块信息.以下信息只是我自己在开发过程中想到或用到的,希望有新的想法的或者有建议的跟贴回复. 一个独立模块包含以下 ...
-
PHP处理上传文件
HTML中使用type = 'file'类型的表单可以向服务器上传文件: 上传文件的表单必须在form中定义enctyp = 'multipart/form-data': HTML代码如下: < ...
-
无需脑图 无需思维导图 看Word大纲视图
大纲视图可以帮助我们大纲视图可帮助您管理文档的结构和标题,就像现在的脑图,经过我的使用后,可以说Word的分级功能非常强大,只恨当时理解的不够,误会了Word. 当我们决定写一个文档的时候,第一步 ...
-
js forEach跳出循环
假设当我们只需知道某个数组有没有某个属性,如果找到了直接跳出循环,省略掉剩下的循环步骤是较优化的操作,但是for中是可以利用break跳出循环,但break在forEach中无效,那么forEach能 ...
-
java 8 日期函数
1.Timestamp(long)转成日期 Timestamp timestamp = new Timestamp(System.currentTimeMillis()); LocalDate ...
-
用react + redux + router写一个todo
概述 最近学习redux,打算用redux + router写了一个todo.记录下来,供以后开发时参考,相信对其他人也有用. 注意: 我只实现了Footer组件的router,其它组件的实现方法是类 ...