图片中虚线部分是我们自己要操作的步骤,实线部分是SpringMVC帮助我们实现的,在现实开发中我们一般不会看到这些操作,但是在面试时可能会出现这些问题,所以我们要有有一个深刻的理解。
在这张流程图里,我们可以分为三个部分。其中2~4的作用主要是为了适配1发送过来的请求(url),找到对应的Controller处理器。HandlerMapping为处理器映射器,HanderExecution表示具体的处理器,其主要作用为是根据请求(url)来查找控制器。然后将解析后的信息传递回给DispatcherServlrt,在编写程序过程中,我们看不到这一操作。
第二个部分,HanddlerAdapter表示处理器适配器,按照特定的规则取执行Handler。也就是根据获得到的信息来找到相应的适配的类(实现了Controller接口的类都为Controller类),让具体的Contorller类执行。Contorller执行成功之后,并将具体的信息返回给HanddlerAdapter,如ModelAndView。然后HanddlerAdapter再将具体的视图逻辑名或模型传递回DispatcherServlrt。
实现了contorller接口的类
package com.gao.controller;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.Controller;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class HelloController implements Controller {
public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {
//ModelAndView模型视图
ModelAndView mv = new ModelAndView();
//封装对象到ModelAndView中,model
mv.addObject("msg","HelloSpringMVC");
//封装要跳转的试图,放在ModelAndView中
mv.setViewName("Hello");//:/WEB-INF/jsp/hello.jsp
return mv;
}
}
第三个部分,DispatcherServlrt调用视图解析器(ViewResolver)来解析HanddlerAdapter传递的视图逻辑名。
<!--添加试图解析器:DispatcherServlet给他的ModeLAndView
1.获取了ModeLAndView的数据
2.解析了ModeLAndView的视图名字
3.拼接视图名字,找到对应的视图/WEB-INF/jsp/Hello.jsp
4.将数据渲染到视图上
-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" id="internalResourceViewResolver">
<!--前缀-->
<property name="prefix" value="/WEB-INF/jsp/"/>
<!--后缀-->
<property name="suffix" value=".jsp"/>
</bean>
ViewResolver将解析的逻辑视图名传给DispatcherServlrt,DispatcherServlrt根据解析的结果调用具体的视图,最终视图呈现给用户。
SpringMVC三大核心处理器映射器、处理器适配器、视图解析器,DispatcherServlrt与三者相互连接,起到了通讯功能。