一边学习狂神Java说一边记录自己的学习经过,文章里有自己学习的理解和扩展,大部分是自己不懂又去扩展了的内容,所以和狂神自己的笔记和课程可能会有一些不一样,新手难免有理解偏差或者错误,恳请大佬指正。
SpringMVC学习(三)SpringMVC原理简单解析
SpringMVC原理
图中实线为SpringMVC帮我们做的,虚线为需要我们自己做的
分析该图中的流程:
1.DispatcherServlet表示前置控制器,是整个SpringMVC的控制中心。用户发出请求,DispatcherServlet接收请求并拦截请求。
- 假设我们请求的url为:http://localhhost:8080/SpringMVC/hello
- 将上述URL拆成三部分:
- http://localhost:8080 服务器域名
- SpringMVC部署在服务器上的web站点
- hello表示控制器
- 通过分析解析如上url表示:请求位于服务器localhost:8080上的SpringMVC站点的hello控制器
2.HandlerMapping为处理器映射,DispatcherServlet调用
HandlerMapping根据请求url查找Handler
<!--Handler-->
<bean id="/hello" class="com.hj.controller.HelloController"/>
3.HandlerExecution表示具体的Handler,其主要作用是根据url查找控制器,如上url被查找控制器为hello。
public class HelloController implements Controller {
public ModelAndView handleRequest(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws Exception {
//ModelAndView 模型和视图
ModelAndView mv = new ModelAndView();
//调用业务层
//封装对象,放在ModelAndView中,Model
mv.addObject("msg", "HelloSpringMVC!");
//封装要跳转的视图,放在ModelAndView中
mv.setViewName("hello");//放在/WEB-INF/jsp/hello.jsp
return mv;
}
}
4.HandlerExecution将解析后的信息传递给DispathcerServlet,如解析控制器映射等
至此我们找到了控制器。仅仅只是找到,在Adapter才用到。
5.HandlerAdapter表示处理器适配器,其按照特定的规则去执行Handler
6.Handler让具体的Controller执行
7.Controller将具体的执行信息返回给HandlerAdapter,如ModelAndView内容,上面3中代码里返回的mv就是ModelAndView类型的。
8.HandlerAdapter将视图逻辑名或者模型传递给DispatcherServlet
9.DispatcherServlet调用视图解析器(ViewResolver)来解析HandlerAdapter传递的逻辑视图名
<!--添加视图解析器-->
<!--视图解析器:DispatcherServlet给他的ModelAndView
1.获得了ModelAndView的数据
2.解析ModelAndView的视图名字
3.拼接视图名字,找到对应的视图 /WEB-INF/jsp/hello.jsp
-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" id="internalResourceViewResolver">
<!--前缀后缀是相同的,可以先设置好-->
<!--前缀-->
<property name="prefix" value="/WEB-INF/jsp/"/>
<!--后缀-->
<property name="suffix" value=".jsp"/>
</bean>
10.视图解析器将解析的逻辑视图名传给DispathcerServlet,看9中的代码,最后把/WEB-INF/jsp/hello.jsp返回了
11.DispatcherServlet根据视图解析器解析的视图结果,调用具体的视图,根据刚刚拿到的逻辑视图名,解析视图结果。
12.最终视图呈现给用户。