`
huanglz19871030
  • 浏览: 242099 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

spring mvc 学习笔记

阅读更多

一、与struts的不同

1.Spring的整个MVC配置是基于IOC容器:

通过容器对javabean进行管理,创建对象和销毁对象,管理它的生命周期。通过IOC容器,打破了传统意义上必须使用new创建对象的说法.
使用beanfactory得到类的实例。只要在配置文件中注册javabean类。通过类的名称即可得到类的对象。

2.引如了一个新的数据类型:ModelAndView 对象.

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

3.SpringControllerSingleton的,或者是线程不安全的

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

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

4 Spring不象Webwork2tapestry那样去隐藏Servlet相关的元素如HttpServletRequestHttpServletResponse

5 Spring提供了不错但不够充分的interceptor机制

strutsRequestProcessor类来进行一点有限的扩展。

到了Webwork2,似乎interceptor一下子成了整个Framework的核心,除了Action的核心部件,其它所有的东西都是interceptor

Spring也提供了它的interceptor机制,它的HandlerInterceptor三个interceptor方法:peHandle, postHandle, afterCompletion。分别对应Controller执行前,Controller执行后和page render之后

6 Spring提供了MultiActionController

使它可以在一个类里包含多个Action ,这个设计和strutsDispatchAction有点类似。

7、 Spring提供了更多的选择方式

Spring里提供了好多不同的Controller类和ViewResolver

8、 Springtag

尽管Springtag数量上少得可怜,但它却是精心设计的。

二.处理过程
其实每个MVC framework的执行过程都是大同小异的,

当个request过来时,它都通过一个Servlet来响应request
再根据request的路径名和配置将这个request dispatch给一个Controller执行,
最后将之返回配置文件里对应的页面。在Spring MVC里,
这个Servlet的名字叫DispatchServlet

处理流程:

1.客户发出请求request,DispatchServletSpring 的前端控制器)负责统一分发请求到Spring控制器。
2.
统一分发之前,需要借助于handlermapping对象定位到具体的Spring控制器。
3.Spring
控制器处理DispatchServlet分发过来的的请求,执行业务逻辑或调用业务逻辑组件。
4.
一旦控制器处理完客户请求,则返回一个ModelAndView 对象给DispatchServlet前端控制器.,ModelAndView 对象包含模型和视图信息。

5DispatchServlet询问视图解析器,查找相应视图。

6.由某具体视图为用户显示页面。

.找到控制器

BeanNameUrlHandlerMapping-根据控制器名称将控制器映射到URL,适合比较简单的应用。

SimpleUrlHandlerMapping-用上下文配置文件中定义的属性集合将控制器映射到URL,比较常用。

CommonsPathMapHandlerMapping-使用 控制器代码中的元数据将控制器映射到URL

使用多种映射器需配置order属性定义优先级。

四、找到视图

InternalResourceViewResolver-将视图名解析为一个模板文件(如jspVelocity模板)渲染视图对象,

BeanNameViewResolver-将视图名解析为一个DispatcherServlet应用上下文中的视图Bean

ResourceBundleViewResolver-将视图名解析为ResourceBundle中的视图对象

XMLViewResolver-从一个XML文件中解析视图Bean,这个文件是从DispatcherServlet应用上下文中分离出来的,适合Bean视图有很多的情况。

同样,使用多种视图解析器也要用order属性定义优先级。

附控制器类图

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics