Your Ad Here
首页 | 编程语言 | 网站建设 | 游戏天堂 | 冲浪宝典 | 网络安全 | 操作系统 | 软件时空 | 硬件指南 | 病毒相关 | IT 认证
软讯网络 > 编程语言 > Java > Spring MVC framework深入分析之三(下)--执行过程
【标  题】:Spring MVC framework深入分析之三(下)--执行过程
【关键字】:Spring,MVC,framework,--
【来  源】:http://blog.csdn.net/fuliangliang/archive/2006/10/01/1314159.aspx

Spring MVC framework深入分析之三(下)--执行过程

Your Ad Here

OK.是不是写得很乱?我自己都觉得惭愧啦,没办法,只好让我们再回头分析一下我们碰到几个角色吧:


1HandlerMapping

HandlerMapping这个接口的定义非常简单

public interface HandlerMapping {

HandlerExecutionChain getHandler(HttpServletRequest request) throws Exception;

}

不就是根据requestURL path来取得相应的HandlerExecutionChain

例如:我的URL http://localhost:8080/blog/xiecc.htm

RequestURL的字符串一截,拿到了”/xiecc.htm”,再去每个HandlerMapping里一查(还记得初始化时我们已经将所有的HandlerMapping都从配置文件里注入进来了吧),假如我们在某个SimpleUrlHandlerMapping里找到了”/xiecc.htm”,我就立刻可以拿到它对应Controller和一组intercetpors了,拿过来组装一下就是一个HandlerExecutionChain啦。

下面是HandlerMapping的类图:

看上去有点麻烦,其实挺简单,具体的类我就不分析啦。它的核心是it’s all about HashMap

还记得我们在Spring MVC最常用的HandlerMappingSimpleUrlHandlerMapping我们在配置它的时候,最核心的结构就是HashMap,哈哈!东西都在HashMap里,只要通过URL分析找到HashMapkey,比如说”/xiecc.htm”,用个get方法不就啥都取到了。

Spring的配置文件里我们可以配置多个HandlerMapping,它会一个一个去找到的,直到找到跟URL匹配的那个Controller,要不然就返回null啦。

 

2HandlerExecutionChain

我前面说了HandlerExecutionChain就是一个Controller和一组interceptors。这是我们执行一个request最基本的单元啦。

不过现实情况会稍有些出入,HandlerExecutionChain实际上包括的一个Object和一组interceptor。这个ObjectAdaptor,它可以是ControllerAdaptor,也可以是其它类的Adaptor。但现实中我们一般用到的都是Controller,因此不详细分析啦,这里用了Adaptor后大大降低了代码的可读性,来换取与Controller非紧耦合的灵活性。至少我现在认为这样做不是太值。

 

3Controller

ControllerSpring MVC执行的核心单元,也是程序员需要自完成的重要部分。用过Spring MVC的人应该都对它非常熟悉啦。所以不做太具体的分析。以下是它的类图:

 

看一下类图就知道啦,这又是Template Method的典型应用。Controller最大的优势也正是利用Template Method,把Controller分解成不同功能的子类。想要把request里的东西populate到一个bean里吗?直接继承SimpleFormController就行啦。想要在Controller里写多个方法吗?用MultiActionController。这些Controller设计得面面俱到,但因为Controller的类层次太多,有的人会觉得烦。呵呵,随个人喜好啦。

不过最核心的是不管这些Controller如何千变万化,它们都实现了统一的Controller接口,这使DispatchAction调它时候根据不需要知道Controller的细节,嗯,the power of interface

Controller里的数据绑定也是一个值得研究的东西,挺好玩的,不过这次没空写啦。

 

4interceptor

Interceptor的接口定义如下:

public interface HandlerInterceptor {

boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)

throws Exception;

void postHandle(

HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView)

throws Exception;

void afterCompletion(

HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)

throws Exception;

}

具体的我就不展开分析啦,我们只要记住interceptor的三个hook point(在AOP里叫join point,哈哈):Controller执行前,Controller执行后,页面显示完成后。

 

5ViewResolver

ViewResolver是一个有趣的角色,它本身完成两个功能:一是完成了View与实际页面名称对应关系的配置,二是View的工厂(这可是标准的工厂模式啊,每个ViewResolver负责生产自己的View)。

以下是ViewResolver接口的定义:

public interface ViewResolver {

View resolveViewName(String viewName, Locale locale) throws Exception;

}

用过Spring MVC的人都配置过ViewResolver,因此这里不详细展开。

我将它对属性分成两类:一类是页面文件配置,包括prefix, suffix;另一类是作为view的工厂注入到View里的属性,如ContentType之类的。

以下是ViewResolver的类图:

 

6View

View是真正负责显示页面的地方。它的接口如下:

public interface View {

void render(Map model, HttpServletRequest request, HttpServletResponse response) throws Exception;

}

其实这是一个简单任务,给我一个HashMap,再给个页面URI,把这个页面显示出来还不是小Case。不过不同的View显示到页面上的区别还是挺大的,如果是JSP,我只要把HashMap里的东西填到request里,再交给RequestDispatcherforward一下就行了;如果是Velocity,那就把HashMap里的东西填到VeloticyContext里,再把模板生成的东西mergeresponsewriter里就完事了。当然还有pdfxlsView,我还没空研究它,哪天有兴趣了再看看吧,以下是View的类图:

 

写完这篇文章后,终于明白了什么叫做眼高手低。本来很希望写得抽象些,最后却发现我写的东西跟一般的流水帐式的源码分析其实区别不太大。呜呜,从具体到抽象很难,再把抽象的东西转化成具体更难,但只有经过这样的一层转换,我们的认识才能有很大的提高,我们的水平才能进步。

 
从jbuilder迁移到netbeans的经验:【上一篇】
Spring MVC framework深入分析之三(上)--执行过程:【下一篇】
【相关文章】
  • Java设计模式学习之一---策略模式
  • 实作的一个Property Class(1) -------- 使用示例
  • 计算机网络第4版[1.2]--网络硬件
  • 初学者玩的时钟程序--玩玩,我也是初学
  • struts+spring+hibernate开发中blob字段映射完全解决手册- -
  • 浅谈Spring + Hibernate在持久层的Session应用
  • 整合Struts 与Spring
  • 三个JAVA文件完成你的MVC应用
  • Mediar.Framework—业务的实现3 (控制UI控件的可视和可编辑属性、验证、以及一对一,一对多,多对多关系)
  • 品评Minix源码--2,kernel的头文件
  • 【随机文章】
  • 把ASP代码变成组件 加快ASP的速度
  • SQL参考手册
  • 耶律齐同声叫
  • php module 学习之(一) php module 初探
  • 找份.net/actionscript/数据库开发的工作
  • 搜索引擎优化 通向成功十步(二)
  • 初学者必看
  • DNS安装配置全过程【短小精悍】
  • Javascript实例教程(10) 随机显示图片
  • 在CEGUI当中使用layout文件(1)
  • 【相关评论】
    没有相关评论
    【发表评论】
    姓名:
    邮件:
    随机码*
    评论*
          
    |  首 页  |  版权声明  |  联系我们   |  网站地图  |
    CopyRight © 2004-2007 bbb软讯网络 All Rigths Reserved.