`

springMVC学习一

阅读更多
springMVC架构




核心代码 DispatcherServlet代码
//前端控制器分派方法
protected void doDispatch(HttpServletRequest request, HttpServletResponse response) throws Exception {
		HttpServletRequest processedRequest = request;
		HandlerExecutionChain mappedHandler = null;
		int interceptorIndex = -1;

		try {
			ModelAndView mv;
			boolean errorView = false;

			try {
                   //检查是否是请求是否是multipart(如文件上传),如果是将通过MultipartResolver解析
				processedRequest = checkMultipart(request);
                   //步骤2、请求到处理器(页面控制器)的映射,通过HandlerMapping进行映射
				mappedHandler = getHandler(processedRequest, false);
				if (mappedHandler == null || mappedHandler.getHandler() == null) {
					noHandlerFound(processedRequest, response);
					return;
				}
                   //步骤3、处理器适配,即将我们的处理器包装成相应的适配器(从而支持多种类型的处理器)
				HandlerAdapter ha = getHandlerAdapter(mappedHandler.getHandler());

                  // 304 Not Modified缓存支持
			    //此处省略具体代码

				// 执行处理器相关的拦截器的预处理(HandlerInterceptor.preHandle)
				//此处省略具体代码

				// 步骤4、由适配器执行处理器(调用处理器相应功能处理方法)
				mv = ha.handle(processedRequest, response, mappedHandler.getHandler());

				// Do we need view name translation?
				if (mv != null && !mv.hasView()) {
					mv.setViewName(getDefaultViewName(request));
				}

				// 执行处理器相关的拦截器的后处理(HandlerInterceptor.postHandle)
				//此处省略具体代码
			}
			catch (ModelAndViewDefiningException ex) {
				logger.debug("ModelAndViewDefiningException encountered", ex);
				mv = ex.getModelAndView();
			}
			catch (Exception ex) {
				Object handler = (mappedHandler != null ? mappedHandler.getHandler() : null);
				mv = processHandlerException(processedRequest, response, handler, ex);
				errorView = (mv != null);
			}

			//步骤5 步骤6、解析视图并进行视图的渲染
//步骤5 由ViewResolver解析View(viewResolver.resolveViewName(viewName, locale))
//步骤6 视图在渲染时会把Model传入(view.render(mv.getModelInternal(), request, response);)
			if (mv != null && !mv.wasCleared()) {
				render(mv, processedRequest, response);
				if (errorView) {
					WebUtils.clearErrorRequestAttributes(request);
				}
			}
			else {
				if (logger.isDebugEnabled()) {
					logger.debug("Null ModelAndView returned to DispatcherServlet with name '" + getServletName() +
							"': assuming HandlerAdapter completed request handling");
				}
			}

			// 执行处理器相关的拦截器的完成后处理(HandlerInterceptor.afterCompletion)
			//此处省略具体代码


		catch (Exception ex) {
			// Trigger after-completion for thrown exception.
			triggerAfterCompletion(mappedHandler, interceptorIndex, processedRequest, response, ex);
			throw ex;
		}
		catch (Error err) {
			ServletException ex = new NestedServletException("Handler processing failed", err);
			// Trigger after-completion for thrown exception.
			triggerAfterCompletion(mappedHandler, interceptorIndex, processedRequest, response, ex);
			throw ex;
		}

		finally {
			// Clean up any resources used by a multipart request.
			if (processedRequest != request) {
				cleanupMultipart(processedRequest);
			}
		}
	}

核心架构的具体流程步骤如下:
1、  首先用户发送请求——>DispatcherServlet,前端控制器收到请求后自己不进行处理,而是委托给其他的解析器进行处理,作为统一访问点,进行全局的流程控制;
2、  DispatcherServlet——>HandlerMapping, HandlerMapping将会把请求映射为HandlerExecutionChain对象(包含一个Handler处理器(页面控制器)对象、多个HandlerInterceptor拦截器)对象,通过这种策略模式,很容易添加新的映射策略;
3、  DispatcherServlet——>HandlerAdapter,HandlerAdapter将会把处理器包装为适配器,从而支持多种类型的处理器,即适配器设计模式的应用,从而很容易支持很多类型的处理器;
4、  HandlerAdapter——>处理器功能处理方法的调用,HandlerAdapter将会根据适配的结果调用真正的处理器的功能处理方法,完成功能处理;并返回一个ModelAndView对象(包含模型数据、逻辑视图名);
5、  ModelAndView的逻辑视图名——> ViewResolver, ViewResolver将把逻辑视图名解析为具体的View,通过这种策略模式,很容易更换其他视图技术;
6、  View——>渲染,View会根据传进来的Model模型数据进行渲染,此处的Model实际是一个Map数据结构,因此很容易支持其他视图技术;
7、返回控制权给DispatcherServlet,由DispatcherServlet返回响应给用户,到此一个流程结束。

spring新特性注解
@Controller
@RequestMapping
@RequestParam:请求参数到处理器功能处理方法的方法参数上的绑定;
@ModelAttribute:请求参数到命令对象的绑定;
被ModelAttribute注释的方法,会在每个方法前执行
@SessionAttributes:用于声明session级别存储的属性,放置在处理器类上,通常列出模型属性(如@ModelAttribute)对应的名称,则这些属性会透明的保存到session中;
@InitBinder:自定义数据绑定注册支持,用于将请求参数转换到命令对象属性的对应类型;
@CookieValue:cookie数据到处理器功能处理方法的方法参数上的绑定;
@RequestHeader:请求头(header)数据到处理器功能处理方法的方法参数上的绑定;
@RequestBody:请求的body体的绑定(通过HttpMessageConverter进行类型转换);
@ResponseBody:处理器功能处理方法的返回值作为响应体(通过HttpMessageConverter进行类型转换);
@ResponseStatus:定义处理器功能处理方法/异常处理器返回的状态码和原因;
@ExceptionHandler:注解式声明异常处理器;
@PathVariable:请求URI中的模板变量部分到处理器功能处理方法的方法参数上的绑定,从而支持RESTful架构风


ModelAttribute
@ModelAttribute:请求参数到命令对象的绑定;
被ModelAttribute注释的方法,会在每个方法前执行

 @RequestMapping(value = "/helloWorld.do")  
        @ModelAttribute("attributeName")  
        public String helloWorld() {  
           return "hi";  
        }  
在某一个具体的映射函数上时,这时这个方法的返回值并不是表示一个视图名称,而是model属性的值,视图名称由RequestToViewNameTranslator根据请求"/helloWorld.do"转换为逻辑视图helloWorld。
Model属性名称有@ModelAttribute(value=””)指定,相当于在request中封装了key=attributeName,value=hi
2、@ModelAttribute注释一个方法的参数 
public class HelloWorldController {  
  
        @ModelAttribute("user")  
        public User addAccount() {  
           return new User("jz","123");  
        }  
  
        @RequestMapping(value = "/helloWorld")  
        public String helloWorld(@ModelAttribute("user") User user) {  
           user.setUserName("jizhou");  
           return "helloWorld";  
        }  
    }
 此时如果方法体没有标注@SessionAttributes("user"),那么scope为request,如果标注了,那么scope为session


JSR-303验证框架的无缝支持(通过@Valid注解定义验证元数据);
使用Spring 3开始的ConversionService进行类型转换(PropertyEditor依然有效),支持使用@NumberFormat 和 @DateTimeFormat来进行数字和日期的格式化;
HttpMessageConverter(Http输入/输出转换器,比如JSON、XML等的数据输出转换器);
ContentNegotiatingViewResolver,内容协商视图解析器,它还是视图解析器,只是它支持根据请求信息将同一模型数据以不同的视图方式展示(如json、xml、html等),RESTful架构风格中很重要的概念(同一资源,多种表现形式);
Spring 3 引入 一个  mvc XML的命名空间用于支持mvc配置,包括如:
    <mvc:annotation-driven>:
      自动注册基于注解风格的处理器需要的DefaultAnnotationHandlerMapping、AnnotationMethodHandlerAdapter
      支持Spring3的ConversionService自动注册
      支持JSR-303验证框架的自动探测并注册(只需把JSR-303实现放置到classpath)
      自动注册相应的HttpMessageConverter(用于支持@RequestBody  和 @ResponseBody)(如XML输入输出转换器(只需将JAXP实现放置到classpath)、JSON输入输出转换器(只需将Jackson实现放置到classpath))等。
    <mvc:interceptors>:注册自定义的处理器拦截器;
    <mvc:view-controller>:和ParameterizableViewController类似,收到相应请求后直接选择相应的视图;
    <mvc:resources>:逻辑静态资源路径到物理静态资源路径的支持;
    <mvc:default-servlet-handler>:当在web.xml 中DispatcherServlet使用<url-pattern>/</url-pattern> 映射时,能映射静态资源(当Spring Web MVC框架没有处理请求对应的控制器时(如一些静态资源),转交给默认的Servlet来响应静态文件,否则报404找不到资源错误,)
  • 大小: 50.4 KB
分享到:
评论

相关推荐

    Java SpringMVC 学习路线.pdf

    在学习SpringMVC的实践中,完成商品列表的加载是一个重要的环节。这个过程包括创建商品列表页面、创建Item的JavaBean类(POJO)、编写ItemController类、启动项目进行测试等步骤。通过这些实际操作,可以深入理解...

    超级详细SpringMVC学习资料

    本资料包包含丰富的SpringMVC学习资源,提供了代码示例和详细介绍,对于深入理解和掌握SpringMVC非常有帮助。 一、SpringMVC基础 SpringMVC的核心组件包括DispatcherServlet(前端控制器)、Controller(控制器)、...

    SpringMVC学习(一)——SpringMVC入门小程序

    在“SpringMVC学习(一)——SpringMVC入门小程序”中,我们首先会接触到SpringMVC的基本概念。这通常包括以下几个核心组件: 1. **DispatcherServlet**:这是SpringMVC的前端控制器,负责接收HTTP请求,并根据配置...

    springMVC学习

    SpringMVC 学习指南 SpringMVC 是 Spring 框架中的一个 web 组件,它提供了丰富的功能来构建稳健的 web 应用。 SpringMVC 的核心思想是基于每个逻辑和功能是高可配置的架构和设计的。下面是 SpringMVC 的学习指南:...

    SpringMVC学习编程代码

    这个“SpringMVC学习编程代码”压缩包包含了一整套用于学习SpringMVC的实例代码,旨在帮助开发者更好地理解和掌握这一强大的Web开发工具。 在SpringMVC中,我们首先会接触到配置文件,这通常是`springmvc-config....

    SpringMVC学习文档

    **SpringMVC学习文档概述** SpringMVC是Spring框架的一个模块,主要负责处理Web应用程序的请求和响应。它是一个基于模型-视图-控制器(MVC)架构模式的轻量级Java Web开发框架,旨在简化Web应用开发并提高可测试性...

    SpringMVC学习资料

    以下是对SpringMVC学习资料的详细解析: 1. **MVC架构**:在SpringMVC中,MVC架构将应用程序分为三个主要组件——模型(Model)、视图(View)和控制器(Controller)。模型负责业务逻辑,视图负责展示结果,而控制...

    SpringMVC 学习总结

    SpringMVC 是一款基于 Java 的轻量级 Web 开发框架,它是 Spring 框架的一部分,主要用于构建 MVC(Model-View-Controller)架构的应用程序。SpringMVC 的核心是 DispatcherServlet,它作为前端控制器,负责接收请求...

    springmvc学习第一天

    ### SpringMVC基础知识详解 #### 一、SpringMVC概览 **SpringMVC**是Spring框架中的一个重要组成部分,主要用于构建Web应用程序。...通过这些内容的学习,可以帮助初学者快速入门并掌握SpringMVC的基本用法。

    SpringMVC学习指南

    SpringMVC是Spring框架的一个重要模块,用于构建Web应用程序的后端控制器。它是一个轻量级的MVC..."SpringMVC学习指南"这个压缩包中的PDF文档,很可能会涵盖这些内容的详细讲解,是学习和提升SpringMVC技能的好资源。

    springMVC学习版源码

    通过"SpringMVC学习版源码",初学者可以详细查看这些组件的实现,理解它们如何协同工作,从而加深对SpringMVC的理解。MySpringMVC可能是该项目的主模块,包含了整个SpringMVC应用的配置、控制器、模型、视图等组件。...

    SpringMvc学习系列整合源码

    在这个"SpringMvc学习系列整合源码"中,你将有机会深入理解SSM(Spring、SpringMVC、MyBatis)框架的集成和工作原理。 首先,Spring作为基础框架,负责管理应用的组件,包括依赖注入(DI)和面向切面编程(AOP)。...

    SpringMVC学习.pdf

    SpringMVC是Spring框架中的一个重要模块,是用于构建Web应用程序的全功能MVC(Model-View-Controller)架构实现。SpringMVC的核心目标是简化Web层的开发流程,即通过注解等现代编程方法,使开发人员能够专注于业务...

    SpringMVC学习学习笔记

    SpringMVC是Java Web开发中的一个轻量级框架,它为构建基于模型-视图-控制器(MVC)模式的应用程序提供了强大的支持。本篇学习笔记将深入探讨SpringMVC的核心概念、配置以及常见操作。 1.1 SpringMVC入门 在开始...

    SpringMVC学习课堂笔记

    ### SpringMVC学习课堂笔记知识点总结 #### 一、SpringMVC基础知识 ##### 1.1 什么是SpringMVC? SpringMVC是Spring框架的一部分,主要用于构建Web应用程序。它遵循了MVC(Model-View-Controller)设计模式,提供...

    SpringIOC+SpringMVC学习笔记

    个人学习spring框架时记录的笔记,纯手敲,SpringIOC+SpringMVC学习笔记,有兴趣的可以参考

    springMVC框架学习备份

    SpringMVC是Spring框架的一个模块,专为构建Web应用程序提供模型-视图-控制器(MVC)架构。它是Java企业级应用开发中的一个重要组件,以其轻量级、灵活且易于使用的特性深受开发者喜爱。在本“springMVC框架学习备份...

    SpringMVC 学习笔记一

    **SpringMVC 学习笔记一** 在Java Web开发领域,SpringMVC是Spring框架的一个重要组成部分,它是一个用于构建Web应用程序的Model-View-Controller(MVC)框架。本学习笔记将深入探讨SpringMVC的基本概念、核心组件...

    SpringMVC学习笔记.zip

    SpringMVC是Java web开发中一个非常重要的框架,它基于模型-视图-控制器(Model-View-Controller)设计模式...这份“SpringMVC学习笔记”包括了从基础到进阶的全面内容,旨在帮助读者从零开始掌握SpringMVC的各个方面。

    SpringMVC学习笔记,学习路线,详细

    总之,SpringMVC 学习涉及到一系列步骤,从理解其核心机制、创建项目结构、配置文件,到编写控制器和视图解析器,再到熟练使用注解来简化配置。通过深入学习和实践,开发者可以充分利用 SpringMVC 的强大功能,高效...

Global site tag (gtag.js) - Google Analytics