一、 SpringWeb MVC是什么
Spring Web MVC是一种基于Java的实现了Web MVC设计模式的请求驱动类型的轻量级Web框架
使用了MVC架构模式的思想,将web层进行职责解耦,基于请求驱动指的就是使用请求-响应模型
框架的目的就是帮助我们简化开发,Spring Web MVC也是要简化我们日常Web开发的。
二、 SpringWeb MVC能帮我们做什么
让我们能非常简单的设计出干净的Web层和薄薄的Web层
进行更简洁的Web层的开发
天生与Spring框架集成(如IoC容器、AOP等)
提供强大的约定大于配置的契约式编程支持
非常灵活的数据验证、格式化和数据绑定机制
支持Restful风格
三、 SpringWeb MVC处理请求的流程
1.spring mvc请所有的请求都提交给DispatcherServlet,它会委托应用系统的其他模块负责负责对请求进行真正的处理工作。
2.DispatcherServlet查询一个或多个HandlerMapping,找到处理请求的Controller.
3.DispatcherServlet请请求提交到目标Controller
4.Controller进行业务逻辑处理后,会返回一个ModelAndView
5.Dispathcher查询一个或多个ViewResolver视图解析器,找到ModelAndView对象指定的视图对象
6.视图对象负责渲染返回给客户端
四、 MVC设计思想
MVC即Model-View-Controller,把一个应用的输入、处理、输出流程按照Model、View、Controller的方式进行分离,这样一个应用被分成三个层——模型层、视图层、控制层。
视图(View)代表用户交互界面,对于Web应用来说,可以是HTML,也可能是jsp、XML和Applet等。一个应用可能有很多不同的视图,MVC设计模式对于视图的处理仅限于视图上数据的采集和处理,以及用户的请求,而不包括在视图上的业务流程的处理。业务流程的处理交予模型(Model)处理。
模型(Model):是业务的处理以及业务规则的制定。模型接受视图请求的数据,并返回最终的处理结果。业务模型的设计是MVC最主要的核心。MVC设计模式告诉我们,把应用的模型按一定的规则抽取出来,抽取的层次很重要,抽象与具体不能隔得太远,也不能太近。MVC并没有提供模型的设计方法,而只是组织管理这些模型,以便于模型的重构和提高重用性。
控制(Controller)可以理解为从用户接收请求, 将模型与视图匹配在一起,共同完成用户的请求。划分控制层的作用也很明显,它清楚地告诉你,它就是一个分发器,选择什么样的模型,选择什么样的视图,可以完成什么样的用户请求。控制层并不做任何的数据处理。
五、 Spring MVC 特点
清晰的角色划分:
控制器(controller)、验证器(validator)、 命令对象(command object)、表单对象(formobject)、模型对象(model object)、 Servlet分发器(DispatcherServlet)、处理器映射(handler mapping)、视图解析器(view resolver)等。每一个角色都可以由一个专门的对象来实现。
强大而直接的配置方式:
将框架类和应用程序类都能作为JavaBean配置,支持跨多个context的引用,例如,在web控制器中对业务对象和验证器(validator)的引用。
可适配、非侵入:
可以根据不同的应用场景,选择合适的控制器子类 (simple型、command型、form型、wizard型、multi-action型或者自定义),而不是从单一控制器 (比如Action/ActionForm)继承。
可重用的业务代码:
可以使用现有的业务对象作为命令或表单对象,而不需要去扩展某个特定框架的基类。
可定制的绑定(binding) 和验证(validation):
比如将类型不匹配作为应用级的验证错误, 这可以保存错误的值。再比如本地化的日期和数字绑定等等。在其他某些框架中,你只能使用字符串表单对象,需要手动解析它并转换到业务对象。
可定制的handlermapping和view resolution:
Spring提供从最简单的URL映射, 到复杂的、专用的定制策略。与某些webMVC框架强制开发人员使用单一特定技术相比,Spring显得更加灵活。
灵活的model转换:
在Springweb框架中,使用基于Map的 键/值对来达到轻易地与各种视图技术的集成。
可定制的本地化和主题(theme)解析:
支持在JSP中可选择地使用Spring标签库、支持JSTL、支持Velocity(不需要额外的中间层)等等。
简单而强大的JSP标签库(SpringTag Library):
支持包括诸如数据绑定和主题(theme) 之类的许多功能。
JSP表单标签库:
在Spring2.0中引入的表单标签库,使得在JSP中编写 表单更加容易。
Spring Bean的生命周期可以被限制在当前的HTTP Request或者HTTP Session。
六、 相关参数
DispatcherServlet
应用了“ Front Controller”模式 – 是所有 SpringMVC 请求的中枢。
继承了HttpServlet,是一个Servlet,由WebApplicationContext 加载
如果不作其它配置,会加载默认组件
HandlerMapping
将web请求映射到正确的处理器(handler)上 , 通常是一个 Controller
不需用自定义处理器映射 –已经内置了很多处理器映射策略
在处理器映射中通过配置拦截器(包括处理器执行前、执行后、或者执行前后运行拦截器)将使其功能更强大
BeanNameUrlHandlerMapping
把一个 URL 影射到一个和它名字相同的已注册的bean– 比如 /simple 将影射到一个名为“/simple”的bean。
可以给bean多个名字 (别名) 通过空格来分隔
必须有一个name属性– “/”在xml中不能定义id属性
在bean名字中可以使用通配符 (/simple*)
是默认的HandlerMapping,如果在上下文中没有找到处理器映射,DispatcherServlet会为你创建一个BeanNameUrlHandlerMapping,但不鼓励
Controller接口
负责处理请求
内部参数继承HttpServlet
• handleRequest(HttpServletRequest,HttpServletResponse)
返回一个ModelAndView对象
所有实现都是线程安全的
基本不用自己实现接口– 已经提供了很多实用的实现类
ModelAndView对象
封装了用来渲染页面的 model和view
Model 用 java.util.Map实现的
添加对象,可以不需用名字:
• addObject(String, Object) – 用显式名字添加
• addObject(Object) – 用默认名添加 (惯例优先)
View 用 String或View对象表示
类似 Struts的Action
• 自动作默认处理 (不用编码)
• 简单web处理
• 在web 层和service 层之间作相应的处理
– 参数处理
– 视图跳转
– 输入验证
AbstractController
提供了简单的操作
用来处理一个简单的请求
protected ModelAndViewhandleRequestInternal(
HttpServletRequest request,
HttpServletResponse response) {
String text = service.getText();
return new ModelAndView(
“simple”, “text”, text);
}
ThrowawayController
中文叫做一次性控制器,也就像一次性筷子那样用完即丢
并不在Spring的Controller继承架构中,而是一个独立的接口定义
当映射的不是一个model 对象时很有用
Bean的作用域必须是prototype,他们本身不是线程安全的
Command Controllers
提供了一种和数据对象交互的方式,并动态地将来自HttpServletRequest的参数绑定到指定的数据对象上。
功能和Struts中的ActionForm有点像,不过在Spring中,不需要实现任何接口来实现数据绑定
Command 可以是任何 POJO – 通常是一个 domain对象
提供的功能:
• 绑定用户类型
• 自动验证
• 自动创建command对象
AbstractCommandController – 提供绑定和验证
SimpleFormController – 除了提供绑定和验证, 还提供了工作流中的表单处理
• 对表单form处理很有用
• 具体细节后面介绍
AbstractWizardFormController – 适合涉及多个页面的表单form处理
其他 Controllers
ServletWrappingController and ServletForwardingController –为了Struts专门设计的,在spring拦截器里封装了Strutsservlet,作用相当于代理Struts的ActionServlet
ParameterizableViewController – 简单的返回一个指定的视图名称,不涉及客户端视图技术(从而避免了在Java代码中的硬编码)
UrlFilenameViewController –会检查URL,获取文件请求的文件名,并把它作为视图名加以使用。如:http://www.springframework.org/index.html对应的视图文件名是index
Interceptors
在请求前后添加其它功能
包括拦截器方法 – preHandle and postHandle
包括回调方法 – afterCompletetion
可以通过 HandlerMapping和一系列Controller关联上
实现 HandlerInterceptor或WebRequestInterceptor
Spring 提供的几个实现
• OvenXxxInViewInteceptor – 用于 ORM 架构JDO, JPAand Hibernate
• UserRoleAuthorizationInterceptor– 用于各种角色授权验证
其他有用的扩展: 自定义安全,caching, …
<beans>
<bean id=”handlerMapping”class=”org.springframework.web.servlet.handler.SimpleUrlHandlerMapping”>
<propertyname=”interceptors”> <list> <refbean=”officeHoursInterceptor”/> </list> </property>
<property name=”mappings”> <value>/*.form=editAccountFormController /*.view=editAccountFormController</value></property></bean>
<bean id=”officeHoursInterceptor”class=”samples.TimeBasedAccessInterceptor”> <propertyname=”openingTime” value=”9″/> <propertyname=”closingTime” value=”18″/></bean>
<beans>
package samples;
public classTimeBasedAccessInterceptor extends HandlerInterceptorAdapter
{ private int openingTime;
private int closingTime;
public voidsetOpeningTime(int openingTime)
{this.openingTime = openingTime; }
public voidsetClosingTime(int closingTime)
{ this.closingTime =closingTime; }
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception
{ Calendar cal =Calendar.getInstance();
int hour =cal.get(HOUR_OF_DAY);
if (openingTime <= hour< closingTime) { return true; }
else {response.sendRedirect(“http://host.com/outsideOfficeHours.html”);
return false; } } }
ViewResolver
从一个逻辑视图名映射到一个视图对象
可以排序, 所以能链在一起
对JSP用户, 通常实现
InternalResourceViewResolver:
<bean id=”internalResourceViewResolver” …
<propertyname=”prefix” value=”/WEB-INF/jsp/” />
<propertyname=”suffix” value=”.jsp” />
</bean>
其他 ViewResolver实现
VelocityViewResolver – 针对Velocity templates设计的
FreeMarkerViewResolver – 针对 FreeMarkertemplates设计的
ResourceBundleViewResolver
• 映射关系在一个 properties 文件
• 支持国际化
XmlViewResolver – 映射关系在XML文件
视图 View
支持的几种视图模板技术:
• InternalResourceView (JSP)
• JstlView (JSP + JSTL)
• VelocityView (Velocity)
• FreeMarkerView (FreeMarker)
• TilesView (Tiles)
• TilesJstlView (Tiles + JSTL)
还支持渲染下列视图
• Excel files
• PDF files
• XSLT results
• Jasper Reports
Spring MVC form处理
SimpleFormController提供了表单处理通用工作流程
• 提供了用户自定义标签,用来展示和处理常用的表单
• 默认, GET用于form展示 ,POST用于 form处理
通过一些Controller类实现表单展示处理
能处理完整的工作流– 这是亮点
注册 Command 类
SimpleFormControllers 关联一个 Commandclass
• 因为是紧耦合, 配置这个Controller class是可以的
public class PlayerFormController
extends SimpleFormController {
public PlayerFormController() {
setCommandClass(Player.class);
setCommandName(“player”);
}
Spring MVC 其它特性
其它Spring MVC 功能这里不再介绍了,但很优秀
• 处理多请求
• 支持自定义主体
• 支持国际化
• 方便 ServletContextListener 初始化 Log4J
• Spring MVC标签