javamvc新闻发布网站源码分享?javaweb新闻系统

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

1.SpringMVC执行流程分析图

例子

(1)创建HaloHandler

packagecom.li.web.debug;importorg.springframework.stereotype.Controller;importorg.springframework.web.bind.annotation.RequestMapping;importorg.springframework.web.servlet.ModelAndView;importjavax.servlet.http.HttpServletRequest;importjavax.servlet.http.HttpServletResponse;/***@author李*@version1.0*/@ControllerpublicclassHaloHandler{//编写方法,响应请求,返回一个ModelAndView对象@RequestMapping(value=&34;)publicModelAndViewhalo(HttpServletRequestrequest,HttpServletResponseresponse){ModelAndViewmodelAndView=newModelAndView();//对应到WEB-INF/pages/ok.jsp(ok的前后缀是你在视图解析器中配置的前后缀)modelAndView.setViewName(&34;);//在model中放入数据k-v,ModelAndView的属性也会被springmvc放入到request域中modelAndView.addObject(&34;,&34;);returnmodelAndView;}}

(2)创建ok.jsp,作为响应后跳转的页面

<%@pagecontentType=&34;language=&34;%><html><head><title>ok</title></head><body><h1>进入到ok页面</h1><h2>name-${requestScope.name}</h2></body></html>

2.源码debug

我们以上述代码为例子进行源码分析。

(1)在DispatcherServlet的doService方法中打上断点,在浏览器中访问目标方法,可以看到光标跳转到断点处:当请求发送到服务器时,tomcat将http请求包装成request对象,前端控制器DispatcherServlet使用doService()方法接收这个request对象。

(2)点击stepover前进,可以看到这里的getWebApplicationContext()就是spring容器对象。也就是说,当接收到url请求的时候,前端控制器就会进行spring容器的初始化,将各种bean放入到容器中。

(3)点击stepover,在经过一系列处理之后调用了doDispatch()方法。这是一个核心的方法。

(4)点击stepinto,进入doDispatch()方法,该方法中首先定义了一个处理器执行链,它用于存放拦截器(多个)和目标Handler。然后定义了ModelAndView对象,用于存放视图信息和数据。

执行下面的语句后,就通过映射拿到了处理器执行链HandlerExecutionChain的目标Handler和拦截器链

(5)点击stepover,跳到如下:获取适配器,包含要执行的目标Handler

(6)点击stepover,跳到如下:调用handle()方法,进行反射调用目标Handler。

(7)点击stepinto,进入到handle方法中调用的handleInternal()方法,handleInternal()方法中反射调用了目标Handler的方法,然后返回视图对象。

(8)在目标方法中打上断点,点击resume进入目标方法

(9)点击stepover,ModelAndView对象返回给适配器。

(10)然后返回到第7步的方法中,因此第7步中返回的视图就是目标方法操作后返回的视图对象

(11)继续一直点击stepover,方法return返回到第6步,将获取的视图对象返回给前端控制器。

(12)点击stepover,在前端控制器的doService方法中执行如下语句,processDispatchResult()方法对前面返回的视图进行解析。

(13)stepinto进入processDispatchResult方法,该方法调用render()进行渲染。

(14)render()方法从ModelAndView对象中得到视图名称viewName,如果viewName不为空,就进行视图解析。

resolveViewName()方法进行视图解析,然后返回view给前端控制器。

@NullableprotectedViewresolveViewName(StringviewName,@NullableMap<String,Object>model,Localelocale,HttpServletRequestrequest)throwsException{if(this.viewResolvers!=null){for(ViewResolverviewResolver:this.viewResolvers){Viewview=viewResolver.resolveViewName(viewName,locale);if(view!=null){returnview;}}}returnnull;}

(15)返回前端控制器之后,又调用View的render()方法进行视图的渲染。

注意和前端控制器的render方法区分

View的render()方法:

@Overridepublicvoidrender(@NullableMap<String,?>model,HttpServletRequestrequest,HttpServletResponseresponse)throwsException{if(logger.isDebugEnabled()){logger.debug(&34;+formatViewName()+&34;+(model!=null?model:Collections.emptyMap())+(this.staticAttributes.isEmpty()?&34;:&34;+this.staticAttributes));}Map<String,Object>mergedModel=createMergedOutputModel(model,request,response);prepareResponse(request,response);//渲染合并输出模型renderMergedOutputModel(mergedModel,getRequestToExpose(request),response);}

renderMergedOutputModel()方法通过请求转发跳转到相应页面:

(16)最后tomcat返回http响应,浏览器显示页面

3.练习

将之前的SpringMVC异常处理相关代码和案例写一遍简述原生的SpringMVC执行流程,并画出示意图debugSpringMVC的执行流程源码,加深理解

好了,文章到这里就结束啦,如果本次分享的javamvc新闻发布网站源码分享和javaweb新闻系统问题对您有所帮助,还望关注下本站哦!

Published by

风君子

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