mvc怎么发布网站源码分享(mvc开发步骤)

大家好,今天给各位分享mvc怎么发布网站源码分享的一些知识,其中也会对mvc开发步骤进行解释,文章篇幅可能偏长,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在就马上开始吧!

引言

springmvc在web项目中基本上是必用的,基于servlet的一种控制层框架,我们在使用的过程中往往会碰到各种问题,有时候还没有思绪解决问题,主要是因为我们对请求处理的流程不熟悉,不能快速定位都问题所在,所以总会耗费大量时间,各种百度才解决问题。如果你也有这样的困惑,不妨一起来看下springmvc的请求处理流程。让我们能够快速定位问题。

您将了解到:

DispatcherServlet九大对象介绍DispatcherServlet核心方法分析request请求处理流程分析请求处理流程源码剖析

DispatcherServlet九大组件

其中前面三个为核心组件。

HandlerMapping(处理器映射器)

HandlerMapping是?来查找Handler的,也就是处理器,具体的表现形式可以是类,也可以是?法。?如,标注了@RequestMapping的每个?法都可以看成是?个Handler。Handler负责具体实际的请求处理,在请求到达后,HandlerMapping的作?便是找到请求相应的处理器Handler和Interceptor.

HandlerAdapter(处理器适配器)

HandlerAdapter是?个适配器。因为SpringMVC中Handler可以是任意形式的,只要能处理请求即可。但是把请求交给Servlet的时候,由于Servlet的?法结构都是doService(HttpServletRequestreq,HttpServletResponseresp)形式的,要让固定的Servlet处理?法调?Handler来进?处理,便是HandlerAdapter的职责。

ViewResolver

ViewResolver即视图解析器,?于将String类型的视图名和Locale解析为View类型的视图,只有?个resolveViewName()?法。从?法的定义可以看出,Controller层返回的String类型视图名viewName最终会在这?被解析成为View。View是?来渲染??的,也就是说,它会将程序返回的参数和数据填?模板中,?成html?件。ViewResolver在这个过程主要完成两件事情:ViewResolver找到渲染所?的模板(第?件?事)和所?的技术(第?件?事,其实也就是找到视图的类型,如JSP)并填?参数。默认情况下,SpringMVC会?动为我们配置?个InternalResourceViewResolver,是针对JSP类型视图的。

HandlerExceptionResolver

HandlerExceptionResolver?于处理Handler产?的异常情况。它的作?是根据异常设置ModelAndView,之后交给渲染?法进?渲染,渲染?法会将ModelAndView渲染成??。

RequestToViewNameTranslator

RequestToViewNameTranslator组件的作?是从请求中获取ViewName.因为ViewResolver根据ViewName查找View,但有的Handler处理完成之后,没有设置View,也没有设置ViewName,便要通过这个组件从请求中查找ViewName。

LocaleResolver

ViewResolver组件的resolveViewName?法需要两个参数,?个是视图名,?个是Locale。LocaleResolver?于从请求中解析出Locale,?如中国Locale是zh-CN,?来表示?个区域。这个组件也是i18n的基础。

ThemeResolverMultipartResolver

MultipartResolver?于上传请求,通过将普通的请求包装成MultipartHttpServletRequest来实现。MultipartHttpServletRequest可以通过getFile()?法直接获得?件。如果上传多个?件,还可以调?getFileMap()?法得到Map<FileName,File>这样的结构,MultipartResolver的作?就是封装普通的请求,使其拥有?件上传的功能。

FlashMapManager

FlashMap?于重定向时的参数传递,?如在处理?户订单时候,为了避免重复提交,可以处理完post请求之后重定向到?个get请求,这个get请求可以?来显示订单详情之类的信息。这样做虽然可以规避?户重新提交订单的问题,但是在这个??上要显示订单的信息,这些数据从哪?来获得呢?因为重定向时么有传递参数这?功能的,如果不想把参数写进URL(不推荐),那么就可以通过FlashMap来传递。只需要在重定向之前将要传递的数据写?请求(可以通过ServletRequestAttributes.getRequest()?法获得)的属性OUTPUT_FLASH_MAP_ATTRIBUTE中,这样在重定向之后的Handler中Spring就会?动将其设置到Model中,在显示订单信息的??上就可以直接从Model中获取数据。FlashMapManager就是?来管理FalshMap的。

这九大组件都在DispatcherServlet类中。

/**MultipartResolverusedbythisservlet.*/\n\t//多部件解析器\n\t@Nullable\n\tprivateMultipartResolvermultipartResolver;\n\t/**LocaleResolverusedbythisservlet.*/\n\t//地域解析器,国际化\n\t@Nullable\n\tprivateLocaleResolverlocaleResolver;\n\t/**ThemeResolverusedbythisservlet.*/\n\t//主题解析器\n\t@Nullable\n\tprivateThemeResolverthemeResolver;\n\t/**ListofHandlerMappingsusedbythisservlet.*/\n\t//处理器映射器组件\n\t@Nullable\n\tprivateList<HandlerMapping>handlerMappings;\n\t/**ListofHandlerAdaptersusedbythisservlet.*/\n\t//处理器适配器组件\n\t@Nullable\n\tprivateList<HandlerAdapter>handlerAdapters;\n\t/**ListofHandlerExceptionResolversusedbythisservlet.*/\n\t//处理器异常解析器\n\t@Nullable\n\tprivateList<HandlerExceptionResolver>handlerExceptionResolvers;\n\t/**RequestToViewNameTranslatorusedbythisservlet.*/\n\t//视图名称转换器\n\t@Nullable\n\tprivateRequestToViewNameTranslatorviewNameTranslator;\n\t/**FlashMapManagerusedbythisservlet.*/\n\t//flash组件管理器\n\t@Nullable\n\tprivateFlashMapManagerflashMapManager;\n\t/**ListofViewResolversusedbythisservlet.*/\n\t//视图解析器\n\t@Nullable\n\tprivateList<ViewResolver>viewResolvers;

MVC结构体系

三层架构:表现层、业务层和持久层

MVC设计模式:

MVC全名是ModelViewController,是模型(model)-视图(view)-控制器(controller)的缩写,是?

种?于设计创建Web应?程序表现层的模式。MVC中每个部分各司其职:

Model(模型):模型包含业务模型和数据模型,数据模型?于封装数据,业务模型?于处理业

务。

View(视图):通常指的就是我们的jsp或者html。作??般就是展示数据的。通常视图是依据

模型数据创建的。

Controller(控制器):是应?程序中处理?户交互的部分。作??般就是处理程序逻辑的。

MVC提倡:每?层只编写??的东?,不编写任何其他的代码;分层是为了解耦,解耦是为了维

护?便和分?协作。

springMVC请求处理流程

所有请求都会通过DispatcherServlet来执行。

流程说明:

1、DispatcherServlet接收到客户端发送的请求。

2、DispatcherServlet收到请求调用HandlerMapping处理器映射器。

3、HandleMapping根据请求URL找到对应的handler以及处理器拦截器,返回给DispatcherServlet

4、DispatcherServlet根据handler调用HanderAdapter处理器适配器。

5、HandlerAdapter根据handler执行处理器,也就是我们controller层写的业务逻辑,并返回一个ModeAndView

6、HandlerAdapter返回ModeAndView给DispatcherServlet

7、DispatcherServlet调用ViewResolver视图解析器来来解析ModeAndView

8、ViewResolve解析ModeAndView并返回真正的view给DispatcherServlet

9、DispatcherServlet将得到的视图进行渲染,填充到request域中

10、返回给客户端响应结果。

springmvc源码分析

请求进来。先找HttpServlet.发现FrameworkServlet重现了doGet()和doPost()方法。所以会执行其中的方法。

并且在FrameworkServlet中实现了HttpServlet的doGet()和doPost()方法。

我们接着看FrameworkServlet的doGet和doPost方法都是调用其processRequest方法。这个方法里面主要的调用DispatcherServlet中doService()方法。

在DispatcherServlet中的这个方法。会调用doDispatche()方法执行。

所以整体的请求流程都在doDispatch()方法中。

主要流程如下:

1、根据url请求获取到handlerExecutorChina对象,也就是获取到handler执行链对象,这个对象中包含执行的handler和一个拦截器的集合。

2、根据这个handlerExecutorChina执行链对象获取到对应的handlerAdapterhandler适配器。

3、根据这个适配器,真正执行handler,并且返回一个modeAndView这里的handler就是我们通常所有的controller层的业务逻辑。

4、根据获取到的modeAndView,解析渲染页面并返回结果。

这样整体核心流程就完了。只有这四步。其实和最开始的流程处理图是一样的。总结一下:先根据请求从handlermapping中获取到handle,然后通过handle找到能处理该请求的handlerAdapter,通过handlerAdapter执行真正的handler也就是我们的业务代码,并返回一个ModeAndView。然后通过viewResolver解析成view返回给页面

九大组件初始化的流程

九大组件初始化是在DispatcherServlet中的onRefresh()方法中。

我们通过调用栈可以发现,是在applicationContext类中的refresh()方法中执行的。这个方法我们很熟悉就是spring框架的初始化流程执行的主要方法。在refresh()方法中完成的Bean对象实例化流程之后,会执行事件发布。这样就来到了我们springmvc初始化了。

这九大组件的初始化流程都是差不多的,我们来看下核心组件的HandlerMapping组件的初始化。

先在ApplicationContext中查找所有HandlerMappings,包括祖先上下文或者指定的名称还获取,如果获取不到,就会从默认的配置中获取handlermappings

获取默认的handlermappings主要是从defaultStrategies中获取。

那defaultStrategies数据是怎么来的呢?

可以看到这个Properties是从DispatcherServlet.properties配置文件来的。

我们查看这个文件可以看到默认的配置信息,九大组件的默认配置信息都有。

获取Handler流程

下面我们回到主流程,第一步,从handlermappingshandlerMappings中获取对应的handler

可以看到就是遍历handlerMappings找到这个url对应的handler就完了。

获取handlerAdapter流程

一样的遍历handlerAdpters,获取到可以处理这个handler的适配器。

ha.handler()执行真正的处理器流程

可以根据调用栈很好地找到调用流程。主要就是检测request,然后通过url找到对对应的方法,填充方法需要的参数值,通过反射调用该方法。

processDispatchResult处理流程

render?法完成渲染

视图解析器解析出View视图对象

2、在解析出View视图对象的过程中会判断是否重定向、是否转发等,不同的情况封装的是不同的View实现

3、解析出View视图对象的过程中,要将逻辑视图名解析为物理视图名

4、封装View视图对象之后,调?了view对象的render?法

5、渲染数据

6、把modelMap中的数据暴露到request域中,这也是为什么后台model.add之后在jsp中可以从请求域取出来的根本原因

7、将数据设置到请求域中

总结

主要了解请求处理的流程,在DispatcherServlet中,先通过请求从handlerMappings中获取对应的handler,然后通过handler找到对应的handlerAdapter然后通过handlerAdapter的handle()方法真正执行我么controller层的业务逻辑。并返回一个ModeAndView然后通过ViewResolver解析成view并渲染到界面上。

当然这中间还有拦截器,主要在获取handlerAdapter后,会先执行拦截器方法,然后才执行真正的handler方法。

关于本次mvc怎么发布网站源码分享和mvc开发步骤的问题分享到这里就结束了,如果解决了您的问题,我们非常高兴。

Published by

风君子

独自遨游何稽首 揭天掀地慰生平