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);
}
}
相关推荐
这个翻译文档详细阐述了这些特性,并提供了丰富的示例代码,对于学习和掌握Spring MVC的开发人员来说,这是一个不可或缺的学习资料。 总之,Spring MVC 4.2.4的中文文档翻译稿涵盖了该版本的所有重要特性和使用技巧...
在"spring-mvc-test-sample-master.zip"这个压缩包中,我们很可能是得到了一个Spring MVC测试项目的源码示例,旨在帮助开发者更好地理解和应用Spring MVC。 首先,让我们深入理解Spring MVC的核心概念: 1. **...
1. **Spring MVC 概述**:Spring MVC 是基于 Spring 框架构建的,它遵循 MVC 设计模式,将业务逻辑、数据和用户界面分离,提高代码的可重用性和可测试性。Spring MVC 通过 DispatcherServlet 进行请求分发,并使用 ...
通过深入研究“spring-mvc-jsonview”的源代码,我们可以更好地理解和利用这些特性,提升Web应用的性能和用户体验。同时,掌握这一技术对于任何想要在Spring MVC框架下构建交互式Web应用的开发者来说,都是至关重要...
6. **单元测试和集成测试**:编写测试用例以验证每个组件的正确性,包括MyBatis的SQL执行、Spring的依赖注入以及Spring MVC的请求处理流程。 在“school”这个文件夹中,可能包含了一个关于学校管理系统的示例,...
这个“Spring MVC-demo项目源码”是一个示例工程,旨在帮助开发者了解如何在实际项目中应用Spring MVC和Maven。 在Spring MVC中,核心概念包括DispatcherServlet、Controllers、Models、Views和ViewModels。...
"spring-mvc-demo"项目提供了一个基础的Spring MVC示例,包括了Controller、Service、DAO层的实现,以及视图模板的配置。开发者可以通过该项目了解如何配置Spring MVC环境,编写Controller,处理请求,以及与数据库...
在开发过程中,我们可以使用诸如 Spring Tool Suite (STS) 这样的集成开发环境,提供 Spring MVC 的项目模板和代码自动补全功能,加快开发速度。此外,使用 Maven 或 Gradle 管理依赖,以及使用 Postman 进行 API ...
本项目“spring-mvc-jquery.zip”是关于如何将Spring MVC 3.0框架与jQuery进行整合的一个示例,旨在帮助开发者理解这两者如何协同工作,提升Web应用的用户体验和后端数据处理效率。 首先,Spring MVC是Spring框架的...
在本项目中,`Spring-MVC-DispatcherServlet-Example`是一个使用Maven构建的示例项目,展示了如何利用Spring MVC来开发应用程序。 ### Maven项目结构 Maven是一个项目管理和集成工具,它通过定义项目对象模型(POM...
"Spring-MVC-step-by-step2.pdf"这份教程详细介绍了Spring MVC的每个步骤,包括环境搭建、Hello World示例、注解驱动开发、数据绑定、异常处理、国际化等,非常适合初学者和有一定基础的开发者学习。 六、源码分析 ...
综上所述,"spring-mvc-mybatis"项目是一个集成了Spring MVC和MyBatis的实用示例,它展示了如何高效地结合两者来构建Web应用。通过学习和实践这个项目,开发者能够掌握Spring MVC的请求处理机制、MyBatis的数据库...
1. Spring MVC配置:展示了如何设置DispatcherServlet、视图解析器以及Controller的定义。 2. ActiveMQ集成:包含配置文件和示例代码,展示如何创建消息生产者和消费者,以及如何处理消息队列中的数据。 3. CXF Web...
"spring-mvc-01.zip" 文件中可能包含一个简单的Spring MVC示例应用,包含Controller、Service、DAO、配置文件、视图模板等,帮助初学者通过实践来理解Spring MVC的工作原理。通过研究这些资源,你可以学习如何设置...
- 配置Spring MVC:创建`servlet-context.xml`,配置DispatcherServlet,包括ViewResolver、HandlerMapping、Controller扫描等。 - 配置MyBatis:在`mybatis-config.xml`中设置数据源、事务管理器等,并定义Mapper...
在`springmvc_2`这个压缩包文件中,可能包含了相关的代码示例、配置文件或其他辅助材料,供学习者参考和实践。通过这些材料,你可以进一步了解如何将上述概念应用到实际项目中,实现完整的RESTful Spring MVC CRUD...
这个“spring_mvc-学习”文件很可能包含了Spring MVC的基础教程,可能有介绍每个概念的文档、代码示例,甚至可能有完整的项目实例,可以帮助你深入理解并熟练运用Spring MVC。学习过程中,建议结合实际操作,动手...
Spring3MVC-REST-HelloWorld 是一个基础的示例,用于展示如何在Spring框架的MVC模块中实现RESTful Web服务。这个实例是初学者理解Spring MVC与REST结合使用的理想起点。REST(Representational State Transfer)是一...
这个"spring mvc官方示例"包含了基于注解的Spring MVC应用的演示,可以帮助我们深入理解如何在实际开发中使用Spring MVC。下面将详细阐述Spring MVC的核心概念和关键特性,以及基于注解的编程方式。 1. **Spring ...