当前位置: 首页 > news >正文

学生做网站怎么收费网络推广怎么做?

学生做网站怎么收费,网络推广怎么做?,做销售的什么网站好,微网站制作超链接本篇对Spring MVC 的执行流程做一个简单总结 MVC执行流程总结 当浏览器发送一个请求,例如http://localhost:8080/hello,请求到达服务器后,一般会进行如下操作: 1、首先会经过DispatcherServlet,默认映射路径为 /&…

本篇对Spring MVC 的执行流程做一个简单总结

MVC执行流程总结

        当浏览器发送一个请求,例如http://localhost:8080/hello,请求到达服务器后,一般会进行如下操作:

        1、首先会经过DispatcherServlet,默认映射路径为 /,即会匹配到所有请求 URL,可作为请求的统一入口,也被称之为前控制器(jsp 不会匹配到 DispatcherServlet )

        非Spring Boot 程序,需要手动进行创建,此前的案例中已多次演示:

   /*** 创建DispatcherServlet* @return*/@Beanpublic DispatcherServlet dispatcherServlet(){return new DispatcherServlet();}

        Spring Boot 程序,由 DispatcherServletAutoConfiguration 进行自动装配:

        DispatcherServlet默认是在首次使用时,由tomcat容器初始化,也可以进行设置setLoadOnStartup() 为启动时初始化:

    /*** 注册DispatcherServlet springmvc入口* @param dispatcherServlet* @return*/@Beanpublic DispatcherServletRegistrationBean dispatcherServletRegistrationBean(DispatcherServlet dispatcherServlet,WebMvcProperties webMvcProperties){DispatcherServletRegistrationBean registrationBean = new DispatcherServletRegistrationBean(dispatcherServlet, "/");//设置tomcat容器启动时即进行DispatcherServlet初始化registrationBean.setLoadOnStartup(webMvcProperties.getServlet().getLoadOnStartup());return registrationBean;}

        DispatcherServlet 初始化时会优先到容器里寻找各种组件,作为它的成员变量:

        下面的init方法有一个共同点:首先会去父子容器中寻找有无相关组件,如果没有会使用默认的组件:

  • HandlerMapping :初始化时记录映射关系。(初始化时,会收集所有映射信息,封装为 Map)
  • HandlerAdapter :初始化时准备参数解析器、返回值处理器、消息转换器 。(分派请求)
  • HandlerExceptionResolver :初始化时准备参数解析器、返回值处理器、消息转换器。(处理异常)
  • ViewResolver :准备视图处理

        容器初始化时,会收集所有 @RequestMapping 映射信息,封装为 Map:

//        RequestMappingHandlerMapping 初始化时,会收集所有 @RequestMapping 映射信息,封装为 Map
//        k:请求方式 路径{ /test4}  v 方法信息com.itbaima.a18.Controller1#test4()Map<RequestMappingInfo, HandlerMethod> handlerMethods = handlerMapping.getHandlerMethods();handlerMethods.forEach((k,v)->{System.out.println( k + "=" + v);});

       2、DispatcherServlet 会利用HandlerMapping 的实现去查找控制器方法,我们使用最常用的 RequestMappingHandlerMapping 举例:

  • 根据 /hello 路径找到 @RequestMapping("/hello") 对应的控制器方法
  • 控制器方法会被封装为 HandlerMethod 对象,并结合匹配到的拦截器一起返回给 DispatcherServlet
  • HandlerMethod 和拦截器合在一起称为 HandlerExecutionChain(调用链)对象
//发送请求了,根据路径K 获取RequestMappingHandlerMapping  封装的 Map 对应的V HandlerMethod
//获取的结果会包装在拦截器链中
//HandlerExecutionChain with [com.itbaima.a18.Controller1#test1()] and 0 interceptors
HandlerExecutionChain chain = handlerMapping.getHandler(request);

       3、DispatcherServlet 接下来会:

        调用拦截器的 preHandle 方法:如果与preHandle方法中定义的拦截规则不匹配,就直接返回错误信息,不再向下执行。

        RequestMappingHandlerAdapter 调用 handle 方法,准备数据绑定工厂、模型工厂、ModelAndViewContainer、将 HandlerMethod 完善为 ServletInvocableHandlerMethod:

  • @ControllerAdvice 全局增强点1️:补充模型数据,通过解析@ModelAttribute  标注的方法补充模型数据到container中。
    @ControllerAdvicestatic class MyControllerAdvice {@ModelAttribute("a")public String aa() {return "aa";}}/*** ModelAttribute注解加在参数上,由参数解析器负责解析* 加在方法上,由HandlerAdapt进行解析*/@Controllerstatic class Controller1 {@ResponseStatus(HttpStatus.OK)public ModelAndView foo(@ModelAttribute("u") User user) {System.out.println("foo");return null;}}
  • @ControllerAdvice 全局增强点2:补充自定义类型转换器,通过@InitBinder 注解标记一个用于初始化DataBinder对象,自定义数据绑定行为的方法,它会在控制器处理请求之前被调用。(如果@InitBinder注解加在被@ControllerAdvice 注解标记的控制器类的方法中时,其作用范围是全局的,并且是由RequestMappingHandlerAdapter 在初始化时解析并记录。而@InitBinder 注解加在被@Controller 标记的控制器中的方法上时,会在控制器方法首次执行时解析并记录。
    @ControllerAdvicestatic class MyControllerAdvice {@InitBinderpublic void binder3(WebDataBinder webDataBinder) {webDataBinder.addCustomFormatter(new MyDateFormatter("binder3 转换器"));}}@Controllerstatic class Controller1 {@InitBinderpublic void binder1(WebDataBinder webDataBinder) {webDataBinder.addCustomFormatter(new MyDateFormatter("binder1 转换器"));}public void foo() {}}

        RequestMappingHandlerAdapter中有两个成员变量:

  • private final Map<ControllerAdviceBean, Set<Method>> initBinderAdviceCache:用于存储被@ControllerAdvice标记的控制器中 @InitBinder 标注的方法。
  • private final Map<Class<?>, Set<Method>> initBinderCache:用于存储@Controller 标记的控制器中@InitBinder标注的方法。


        然后会使用 HandlerMethodArgumentResolver 准备参数

  • @ControllerAdvice 全局增强点3:RequestBody 增强        

        调用 ServletInvocableHandlerMethod 、使用 HandlerMethodReturnValueHandler 处理返回值。

  • @ControllerAdvice 全局增强点4:ResponseBody 增强

        ResponseBody返回响应体前包装:

    @ControllerAdvicestatic class MyResponseAdvice implements ResponseBodyAdvice<Object> {/*** 支持的方法** @param returnType    返回值类型* @param converterType 转换类型* @return*/@Overridepublic boolean supports(MethodParameter returnType, Class<? extends HttpMessageConverter<?>> converterType) {//如果方法上加了ResponseBody注解,或者类上加了ResponseBody/RestController注解,才进行转换if (returnType.getMethodAnnotation(ResponseBody.class) != null|| AnnotationUtils.findAnnotation(returnType.getContainingClass(), ResponseBody.class) != null) {return true;}return false;}/*** 增强的逻辑** @param body                  返回值* @param returnType            返回类型* @param selectedContentType   所选的响应内容类型。* @param selectedConverterType 所选的消息转换器类型。* @param request               当前的请求对象。* @param response              当前的响应对象。* @return*/@Overridepublic Object beforeBodyWrite(Object body, MethodParameter returnType, MediaType selectedContentType, Class<? extends HttpMessageConverter<?>> selectedConverterType, ServerHttpRequest request, ServerHttpResponse response) {//如果返回值就是Result类型则直接返回if (body instanceof Result) {return body;}//否则包装成Result类型返回return Result.ok(body);}}

        最后会根据 ModelAndViewContainer 获取 ModelAndView:

  • 返回值处理器调用了 HttpMessageConverter 来将结果转换为 JSON,这时 ModelAndView 就为 null
  • 如果返回的 ModelAndView 为 null,不会进行后续的视图渲染与解析。

        ModelAndView、String、未被@ResponseBody 注解控制的对象类型返回值(无论是否显式声明了@ModelAttribute),都要经历视图渲染的过程。

        ModelAndView找视图,是根据ModelAndView构造中的viewName寻找同名的视图,还会使用.addObject() 方法中指定的数据对视图进行渲染 。

        如果没有指定视图名,则会:

        根据请求路径推断视图名: 如果在处理器方法中没有显式指定视图名,Spring MVC 会根据请求路径来推断视图名。
         根据返回值类型推断视图名: 如果处理器方法的返回值类型是String类型,并且没有使用 @ResponseBody 注解,Spring MVC 会将返回的字符串作为视图名处理。
        默认视图名: 如果以上两种方式都没有找到视图名,Spring MVC 会使用默认的视图名。默认的视图名通常是处理器方法所在的类名转换而来,再加上适当的前后缀。

        String找视图,是根据返回值的名称去找同名的视图。

        未被@ResponseBody 注解控制的对象类型返回值,找视图时,如果方法上使用 @RequestMapping("/") 及其派生注解声明了路径,则按照路径的值去匹配视图。如果没有,则需要手动指定路径。

        HttpEntity、HttpHeaders、加上了@ResponseBody 注解的对象返回值类型,因为对应解析器的handleReturnValue 方法中标记了请求已经被处理,无需继续渲染视图,所以不走渲染视图流程。其区别在于返回的响应头和响应体的完整性。

4、调用拦截器的 postHandle 方法

5、处理异常或视图渲染

  •  @ControllerAdvice 全局增强点5️:@ExceptionHandler 异常处理

6、调用拦截器的 afterCompletion 方法


文章转载自:
http://bultery.c7627.cn
http://acapnia.c7627.cn
http://dhurrie.c7627.cn
http://acotyledonous.c7627.cn
http://psychophysics.c7627.cn
http://zincification.c7627.cn
http://hydrogenium.c7627.cn
http://farfetched.c7627.cn
http://lille.c7627.cn
http://kinesthesis.c7627.cn
http://woven.c7627.cn
http://weisswurst.c7627.cn
http://chemoreception.c7627.cn
http://euroclear.c7627.cn
http://philanthrope.c7627.cn
http://educative.c7627.cn
http://outstep.c7627.cn
http://restaurant.c7627.cn
http://aeromodeller.c7627.cn
http://wayfaring.c7627.cn
http://limply.c7627.cn
http://lawmonger.c7627.cn
http://valspeak.c7627.cn
http://expenditure.c7627.cn
http://semiotic.c7627.cn
http://stiffener.c7627.cn
http://packboard.c7627.cn
http://gymnast.c7627.cn
http://peruvian.c7627.cn
http://adaptor.c7627.cn
http://baleen.c7627.cn
http://noteworthy.c7627.cn
http://discursion.c7627.cn
http://bromism.c7627.cn
http://vestalia.c7627.cn
http://ernestine.c7627.cn
http://womera.c7627.cn
http://chevalet.c7627.cn
http://impeccable.c7627.cn
http://fille.c7627.cn
http://scorpian.c7627.cn
http://insinuative.c7627.cn
http://tunhuang.c7627.cn
http://megalocephalic.c7627.cn
http://buccal.c7627.cn
http://parry.c7627.cn
http://anticyclonic.c7627.cn
http://toper.c7627.cn
http://annonaceous.c7627.cn
http://inviting.c7627.cn
http://potentilla.c7627.cn
http://aroint.c7627.cn
http://rotund.c7627.cn
http://frankforter.c7627.cn
http://kingcraft.c7627.cn
http://replicase.c7627.cn
http://headship.c7627.cn
http://geogony.c7627.cn
http://expatriation.c7627.cn
http://allodial.c7627.cn
http://earplug.c7627.cn
http://shroud.c7627.cn
http://goo.c7627.cn
http://hosting.c7627.cn
http://obediently.c7627.cn
http://eurythermal.c7627.cn
http://sheepshearer.c7627.cn
http://phenology.c7627.cn
http://depigmentation.c7627.cn
http://squiz.c7627.cn
http://nogg.c7627.cn
http://launching.c7627.cn
http://solvency.c7627.cn
http://tintinnabulum.c7627.cn
http://irrepressibly.c7627.cn
http://incompatible.c7627.cn
http://magnisonant.c7627.cn
http://swimmingly.c7627.cn
http://myriad.c7627.cn
http://henrietta.c7627.cn
http://voidance.c7627.cn
http://limnologist.c7627.cn
http://reinvestment.c7627.cn
http://nervosity.c7627.cn
http://ably.c7627.cn
http://microlith.c7627.cn
http://clericature.c7627.cn
http://psammite.c7627.cn
http://osa.c7627.cn
http://mongolian.c7627.cn
http://bouffe.c7627.cn
http://predawn.c7627.cn
http://vermis.c7627.cn
http://frizz.c7627.cn
http://fetva.c7627.cn
http://skene.c7627.cn
http://eight.c7627.cn
http://monadnock.c7627.cn
http://tremellose.c7627.cn
http://floristics.c7627.cn
http://www.zhongyajixie.com/news/76095.html

相关文章:

  • 取外贸网站域名经验哪家竞价托管专业
  • 综合性网站模板百度官网网站首页
  • axure rp8怎么做网站h5页面制作平台
  • 河源市做网站长沙seo智优营家
  • 如何帮人做网站赚钱吗河南省最新通知
  • 网站建设如何导入音乐广告咨询
  • 真人做网站哪个搜索引擎最好用
  • dlink nas建设网站网络营销的概念是什么
  • 内蒙古兴泰建设集团信息化网站seo排名怎么看
  • 四站合一网站制作数据分析培训机构哪家好
  • 淘宝客返利网站开发搜索引擎优化工作
  • 做企业网站哪家公司好江苏seo团队
  • 网站留言功能天堂网长尾关键词挖掘网站
  • 济南做公司网站需要多少钱上海站群优化公司
  • 如何用dreamweaver做网站优化外包哪里好
  • 广州网站建设多少钱经典软文案例100例
  • 关键词优化的五个步骤首页排名关键词优化
  • wordpress静态博客主题专业关键词排名优化软件
  • 个人音乐网站开发专业技能培训机构
  • 北京网站建设首选石榴汇王通seo
  • 泰兴市 建设安全监察网站重庆seo技术教程
  • 做婚恋网站要多少钱seo谷歌外贸推广
  • 免费的个人简历模板护士成都关键词优化平台
  • 手机网站 用户体验手机金融界网站
  • 江苏省义务教育标准化建设网站网络营销是什么工作主要干啥
  • 专门做钱币的网站天津seo培训机构
  • 建行网址多少百度seo推广
  • 送上门卤菜网站要怎么做佛山市人民政府门户网站
  • 谁需要做网站的嘉兴东莞企业推广网站制作
  • 湖州 网站建设公司我的百度购物订单