快速业务通道

Spring源代码解析(四):Spring MVC - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-18
可以指定顺序,直到找到第一个,然后返回。先找到一个 handlerMapping,然 后通过这个handlerMapping返回一个执行链,里面包含了最终的Handler和我们定义的一 连串的 Interceptor。具体的我们可以参考上面的SimpleUrlHandlerMapping的代码分析 知道getHandler是怎样得到一个 HandlerExecutionChain的。

得到HandlerExecutionChain以后,我们通过HandlerAdapter对这个Handler的合法性 进行判断:

代码

protected HandlerAdapter getHandlerAdapter(Object handler) throws ServletException {    Iterator it = this.handlerAdapters.iterator();    while (it.hasNext()) {      //同样对持有的所有adapter进行匹配      HandlerAdapter ha = (HandlerAdapter) it.next();      if (ha.supports(handler)) {        return ha;      }    }    ........ }

Spring源代码解析(四):Spring MVC(7)

时间:2011-03-29 javaeye jiwenke

通过判断,我们知道这个handler是不是一个Controller接口的实现,比如对于具体的 HandlerAdapter - SimpleControllerHandlerAdapter:

代码

public class SimpleControllerHandlerAdapter implements HandlerAdapter {    public boolean supports(Object handler) {      return (handler instanceof Controller);    }    ....... }

简单的判断一下handler是不是实现了Controller接口。这也体现了一种对配置文件进 行验证的机制。

让我们再回到DispatcherServlet看到代码:

代码

mv = ha.handle(processedRequest, response, mappedHandler.getHandler());

这个就是对handle的具体调用!相当于Command模式里的Command.execute();理所当然 的返回一个ModelAndView,下面就是一个对View进行处理的过程:

代码

if (mv != null && !mv.wasCleared()) {    render(mv, processedRequest, response); }

调用的是render方法:

代码

protected void render(ModelAndView mv, HttpServletRequest request, HttpServletResponse response)      throws Exception {response.setLocale(locale);    View view = null;    //这里把默认的视图放到ModelAndView中去。    if (!mv.hasView()) {      mv.setViewName(getDefaultViewName(request));    }    if (mv.isReference()) {      // 这里对视图名字进行解析      view = resolveViewName(mv.getViewName(), mv.getModelInternal(), locale, request);    .......    }    else {      // 有可能在ModelAndView里已经直接包含了View对象,那我们就直接使用。      view = mv.getView();    ........    }    //得到具体的View对象以后,我们用它来生成视图。    view.render(mv.getModelInternal(), request, response); }

Spring源代码解析(四):Spring MVC(8)

时间:2011-03-29 javaeye jiwenke

从整个过程我们看到先在ModelAndView中寻找视图的逻辑名,如果找不到那就使用缺 省的视图,如果能够找到视图的名字,那就对他进行解析得到实际的需要使用的视图对象 。还有一种可能就是在ModelAndView中已经包含了实际的视图对象,这个视图对象是可以 直接使用的。

不管怎样,得到一个视图对象以后,通过调用视图对象的render来完成数据的显示过 程,我们可以看看具体的JstlView是怎样实现的,我们在JstlView的抽象父类 AbstractView中找到render方法:

代码

public void render(Map model, HttpServletRequest request, HttpServletResponse response) throws Exception {    ......    // 这里把所有的相关信息都

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号