`
javaeyetodj
  • 浏览: 432527 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

spring mvc --DispatcherServlet流程理解代码示例(转)

 
阅读更多

import java.util.List;

import java.util.Locale;

 

import javax.servlet.ServletException;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

 

import org.springframework.web.servlet.HandlerAdapter;

import org.springframework.web.servlet.HandlerExceptionResolver;

import org.springframework.web.servlet.HandlerExecutionChain;

import org.springframework.web.servlet.HandlerMapping;

import org.springframework.web.servlet.ModelAndView;

import org.springframework.web.servlet.View;

import org.springframework.web.servlet.ViewResolver;

 

public class DispatcherServletDemo {

    private List<HandlerMapping> handlerMappings = null;

    private List<HandlerAdapter> handlerAdapters = null;

    private List<HandlerExceptionResolver> handlerExceptionResolvers = null;

    private List<ViewResolver> viewResolvers = null;

 

    public void doService(HttpServletRequest request, HttpServletResponse response) throws Exception {

        ModelAndView modelAndView = null;

        Exception dispatchException = null;

        HandlerExecutionChain handlerChain = null;

 

        try {

            // get handlerChain that consisting of "handler object" and any "handler interceptors"

            handlerChain = getHandler(request);

            if (handlerChain == null) {

                response.sendError(HttpServletResponse.SC_NOT_FOUND);

                return;

            }

            // get handlerAdapter

            HandlerAdapter handlerAdapter = getHandlerAdapter(handlerChain);

            // insert "handler interceptors" preHandle method

            // call "handler object" by handlerAdapter

            modelAndView = handlerAdapter.handle(request, response, handlerChain.getHandler());

            // insert "handler interceptors" postHandle method

        } catch (Exception ex) {

            dispatchException = ex;

        }

        if (dispatchException != null) {

            modelAndView = processHandlerException(request, response, handlerChain.getHandler(), dispatchException);

        }

        if (modelAndView != null) {

            render(modelAndView, request, response);

        }

        // insert "handler interceptors" afterCompletion method

    }

 

    private HandlerExecutionChain getHandler(HttpServletRequest request) throws Exception {

        for (HandlerMapping handlerMapping : handlerMappings) {

            HandlerExecutionChain handler = handlerMapping.getHandler(request);

            if (handler != null) {

                return handler;

            }

        }

        return null;

    }

 

    private HandlerAdapter getHandlerAdapter(HandlerExecutionChain handlerChain) throws ServletException {

        for (HandlerAdapter handlerAdapter : handlerAdapters) {

            if (handlerAdapter.supports(handlerChain)) {

                return handlerAdapter;

            }

        }

        throw new ServletException("No adapter for handler");

    }

 

    private ModelAndView processHandlerException(HttpServletRequest request, HttpServletResponse response,

            Object handler, Exception dispatchException) throws Exception {

        ModelAndView exModelAndView = null;

        for (HandlerExceptionResolver handlerExceptionResolver : handlerExceptionResolvers) {

            exModelAndView = handlerExceptionResolver.resolveException(request, response, handler, dispatchException);

            if (exModelAndView != null) {

                break;

            }

        }

        if (exModelAndView != null) {

            return exModelAndView;

        }

        throw dispatchException;

    }

 

    private void render(ModelAndView modelAndView, HttpServletRequest request, HttpServletResponse response)

            throws Exception {

        Locale locale = null; // LocaleResolver

        View view = null;

        if (modelAndView.isReference()) {

            for (ViewResolver viewResolver : this.viewResolvers) {

                View v = viewResolver.resolveViewName(modelAndView.getViewName(), locale);

                if (v != null) {

                    view = v;

                    break;

                }

            }

            if (view == null) {

                throw new ServletException("Could not resolve view with the name");

            }

        } else {

            view = modelAndView.getView();

        }

        view.render(modelAndView.getModel(), request, response);

    }

}

分享到:
评论

相关推荐

    translation-spring-mvc-4-documentation, Spring MVC 4.2.4 RELEASE 中文文档完整翻译稿.zip

    这个翻译文档详细阐述了这些特性,并提供了丰富的示例代码,对于学习和掌握Spring MVC的开发人员来说,这是一个不可或缺的学习资料。 总之,Spring MVC 4.2.4的中文文档翻译稿涵盖了该版本的所有重要特性和使用技巧...

    spring-mvc-test-sample-master.zip_spring mvc_springmvc-test

    在"spring-mvc-test-sample-master.zip"这个压缩包中,我们很可能是得到了一个Spring MVC测试项目的源码示例,旨在帮助开发者更好地理解和应用Spring MVC。 首先,让我们深入理解Spring MVC的核心概念: 1. **...

    spring-mvc-官方中文文档

    1. **Spring MVC 概述**:Spring MVC 是基于 Spring 框架构建的,它遵循 MVC 设计模式,将业务逻辑、数据和用户界面分离,提高代码的可重用性和可测试性。Spring MVC 通过 DispatcherServlet 进行请求分发,并使用 ...

    spring-mvc-jsonview源代码

    通过深入研究“spring-mvc-jsonview”的源代码,我们可以更好地理解和利用这些特性,提升Web应用的性能和用户体验。同时,掌握这一技术对于任何想要在Spring MVC框架下构建交互式Web应用的开发者来说,都是至关重要...

    spring-spring mvc-mybaties整合dome

    6. **单元测试和集成测试**:编写测试用例以验证每个组件的正确性,包括MyBatis的SQL执行、Spring的依赖注入以及Spring MVC的请求处理流程。 在“school”这个文件夹中,可能包含了一个关于学校管理系统的示例,...

    Spring MVC-demo项目源码

    这个“Spring MVC-demo项目源码”是一个示例工程,旨在帮助开发者了解如何在实际项目中应用Spring MVC和Maven。 在Spring MVC中,核心概念包括DispatcherServlet、Controllers、Models、Views和ViewModels。...

    spring-mvc-demo.zip

    "spring-mvc-demo"项目提供了一个基础的Spring MVC示例,包括了Controller、Service、DAO层的实现,以及视图模板的配置。开发者可以通过该项目了解如何配置Spring MVC环境,编写Controller,处理请求,以及与数据库...

    spring mvc - 入门

    在开发过程中,我们可以使用诸如 Spring Tool Suite (STS) 这样的集成开发环境,提供 Spring MVC 的项目模板和代码自动补全功能,加快开发速度。此外,使用 Maven 或 Gradle 管理依赖,以及使用 Postman 进行 API ...

    spring-mvc-jquery.zip_jquery_mvc jquery_spring jquery_spring mvc

    本项目“spring-mvc-jquery.zip”是关于如何将Spring MVC 3.0框架与jQuery进行整合的一个示例,旨在帮助开发者理解这两者如何协同工作,提升Web应用的用户体验和后端数据处理效率。 首先,Spring MVC是Spring框架的...

    Spring-MVC-DispatcherServlet-Example:Maven项目

    在本项目中,`Spring-MVC-DispatcherServlet-Example`是一个使用Maven构建的示例项目,展示了如何利用Spring MVC来开发应用程序。 ### Maven项目结构 Maven是一个项目管理和集成工具,它通过定义项目对象模型(POM...

    Spring-MVC-step-by-step2.rar

    "Spring-MVC-step-by-step2.pdf"这份教程详细介绍了Spring MVC的每个步骤,包括环境搭建、Hello World示例、注解驱动开发、数据绑定、异常处理、国际化等,非常适合初学者和有一定基础的开发者学习。 六、源码分析 ...

    spring-mvc-mybatis

    综上所述,"spring-mvc-mybatis"项目是一个集成了Spring MVC和MyBatis的实用示例,它展示了如何高效地结合两者来构建Web应用。通过学习和实践这个项目,开发者能够掌握Spring MVC的请求处理机制、MyBatis的数据库...

    SPRING-MVC-MQ-CXF-REST_Demo

    1. Spring MVC配置:展示了如何设置DispatcherServlet、视图解析器以及Controller的定义。 2. ActiveMQ集成:包含配置文件和示例代码,展示如何创建消息生产者和消费者,以及如何处理消息队列中的数据。 3. CXF Web...

    spring-mvc-01.zip

    "spring-mvc-01.zip" 文件中可能包含一个简单的Spring MVC示例应用,包含Controller、Service、DAO、配置文件、视图模板等,帮助初学者通过实践来理解Spring MVC的工作原理。通过研究这些资源,你可以学习如何设置...

    spring-spring-mvc-mybatis整合例子

    - 配置Spring MVC:创建`servlet-context.xml`,配置DispatcherServlet,包括ViewResolver、HandlerMapping、Controller扫描等。 - 配置MyBatis:在`mybatis-config.xml`中设置数据源、事务管理器等,并定义Mapper...

    Spring MVC--6.RESTful SpringMVC CRUD

    在`springmvc_2`这个压缩包文件中,可能包含了相关的代码示例、配置文件或其他辅助材料,供学习者参考和实践。通过这些材料,你可以进一步了解如何将上述概念应用到实际项目中,实现完整的RESTful Spring MVC CRUD...

    spring_mvc-学习

    这个“spring_mvc-学习”文件很可能包含了Spring MVC的基础教程,可能有介绍每个概念的文档、代码示例,甚至可能有完整的项目实例,可以帮助你深入理解并熟练运用Spring MVC。学习过程中,建议结合实际操作,动手...

    Spring3MVC-REST-HelloWorld 实例简单代码

    Spring3MVC-REST-HelloWorld 是一个基础的示例,用于展示如何在Spring框架的MVC模块中实现RESTful Web服务。这个实例是初学者理解Spring MVC与REST结合使用的理想起点。REST(Representational State Transfer)是一...

    spring mvc官方示例

    这个"spring mvc官方示例"包含了基于注解的Spring MVC应用的演示,可以帮助我们深入理解如何在实际开发中使用Spring MVC。下面将详细阐述Spring MVC的核心概念和关键特性,以及基于注解的编程方式。 1. **Spring ...

Global site tag (gtag.js) - Google Analytics