`

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
分享到:
评论

相关推荐

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

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

    springmvc学习第一天

    springmvc学习资料,某大型培训机构学习心得,总结了springmvc入门详情

    SpringIOC+SpringMVC学习笔记

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

    SpringMVC框架学习指南

    让你从零基础基础学习springMVC的技术,并且告诉你如何搭建一个springMVC的架构

    springMVC的视频讲解

    springmvc整合的源码,学习springmvc框架的新手可以下载学习一下,里面详细讲解了springmvc的配置,希望对新学springmvc框架的新手有帮助

    SpringMvc学习笔记

    一份简单的SpringMvc的学习笔记,能简单和清楚的了解SpringMvc

    狂神说Java-SpringMVC学习笔记

    狂神说Java——SpringMVC学习笔记 内容概要: 1、了解什么是SpringMVC 2、RestFul和控制器 3、转发和重定向 4、数据处理 5、JSON 6、SSM项目整合 7、Ajax 8、拦截器+文件上传下载 能学到什么:详细了解SpringMVC基础...

    springMVC 学习参考 配套mongodb数据库1

    springMVC 学习参考 配套mongodb数据库1

    SpringMVC学习笔记整合搭建框架

    SpringMVC第一天 框架课程 1.课程计划 第一天 1、SpringMVC介绍 2、入门程序 3、SpringMVC架构讲解 a)框架结构 b)组件说明 4、SpringMVC整合MyBatis 5、参数绑定 a)SpringMVC默认支持的类型 b)简单数据类型 c)Pojo...

    SpringMVC PPT_springmvc_

    springmvc是常用的一种框架,学习springmvc非常重要,故需要良好教程资料

    springmvc第一天课堂笔记

    springmvc框架原理(掌握) 前端控制器、处理器映射器、处理器适配器、视图解析器 springmvc入门程序 目的:对前端控制器、处理器映射器、处理器适配器、视图解析器学习 非注解的处理器映射器、处理器适配器 ...

    【狂神SpringMVC配套课程代码】SpringMVC.zip

    欢迎大家作为学习SpringMVC的参考!! 下面附上狂神B站课程网址,和我的博客笔记(共8章) 狂神老师B站课程:...

    SpringMVC学习指南.pdf

    Spring MVC是Spring框架中用于Web应用快速开发的一个模块,其中的MVC是Model-View-Controller的缩写。作为当今业界*主流的Web开发框架,Spring MVC已经成为当前*热门的开发技能,同时也广泛用于桌面开发领域。  ...

    springMVC+mybatis学习代码

    这是一个springMVC和mybatis的集成学习,主要集成mybatis的一些配置

    SpringMVC学习的时候写的一个小站源码

    SpringMVC学习的时候写的一个小站源码,很简单,包含了springmvc,freemarker等一些知识点,作为初学的参考有用,这个对结束了初级的朋友没有任何意义。。。。

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

    SpringMVC详细学习笔记,有关源码的提取,有关实例代码的提取,有关maven的配置,web.xml的配置,还有高阶采用注解来代替配置文件的类的书写方法。

    springmvc基础.docx

    1. 什么是springmvc? 2. springmvc框架原理 前端控制器、处理器映射器、处理器适配器、视图解析器 3. springmvc入门程序 目的:对前端控制器、处理器映射器、处理器适配器、视图解析器学习 非注解的处理器映射器...

    SpringMVC学习指南

    京东畅销书,排名第一,SpringMVC学习首选,奉送全部源代码,全网难得一见! https://github.com/pauldeck/springmvc-2ed

    SpringMVC 学习笔记一

    NULL 博文链接:https://zx527291227.iteye.com/blog/1928347

Global site tag (gtag.js) - Google Analytics