1、接收浏览器用户请求(DispatcherServlet)
在SpringMVC中,DispatcherServlet为整个SpringMVC的控制中心,前端发送来的数据和URL被DispatcherServlet接收并拦截(前后端连接的桥梁) 返回响应视图
<!-- 注册DispatcherServlet-->
<servlet>
<servlet-name>springmvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!-- 关联一个springmvc配置文件:【servlet-name】-servlet.xml-->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springmvc-servlet.xml</param-value>
</init-param>
<!-- 启动级别-->
<load-on-startup>1</load-on-startup>
</servlet>
<!-- / : 匹配所有的请求:不包括(.jsp)-->
<!-- /* : 匹配所有的请求:包括(.jsp)-->
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
2、根据用户请求寻找对应处理器(HandlerMapping)返回解析后信息
如上:用户请求为hello,DispatcherServlet就会调用HandlerMapping查找到bean标签id为对应请求的Handler在找到对应控制器后会将控制器映射解析并返回给DispatcherServlet
<bean id="/hello" class="Controller.HelloController"/>
3、调用处理器适配器(HandlerrAdapter)
拿到返回的控制器映射解析结果后DispatcherServlet会调用HandlerrAdapter方法拿到一个适配器去找对应请求的处理器找到后扫描处理器所对应的Controller
4、处理器返回对应Controller扫描后结果(mv : ModelAndView)
package 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 {
@Override
public ModelAndView handleRequest(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws Exception {
// ModelAndView:模型和视图
ModelAndView mv = new ModelAndView();
// 封装对象 放在ModelAndView中
mv.addObject("msg","HelloSpringMVC!");
// 封装要跳转的视图 放在ModelAndView中
// /WEB-INF/jsp/hello.jsp
mv.setViewName("hello");
return mv;
}
}
此时处理器将Controller结果ModelAndView(结果中携带有后端处理数据)返回给HandlerAdapter,HadlerAdapter再将结果返回给控制中心DispatcherServlet
5、DispatcherServlet请求视图解析器解析MV(ViewReslover)
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" id="internalResourceViewResolver">
6、解析器将视图解析结果View返回给DispatcherServlet(解析器实现源码如下)
//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by FernFlower decompiler)
//
package org.springframework.web.servlet.view;
import org.springframework.lang.Nullable;
import org.springframework.util.ClassUtils;
public class InternalResourceViewResolver extends UrlBasedViewResolver {
private static final boolean jstlPresent = ClassUtils.isPresent("javax.servlet.jsp.jstl.core.Config", InternalResourceViewResolver.class.getClassLoader());
@Nullable
private Boolean alwaysInclude;
public InternalResourceViewResolver() {
Class<?> viewClass = this.requiredViewClass();
if (InternalResourceView.class == viewClass && jstlPresent) {
viewClass = JstlView.class;
}
this.setViewClass(viewClass);
}
public InternalResourceViewResolver(String prefix, String suffix) {
this();
this.setPrefix(prefix);
this.setSuffix(suffix);
}
protected Class<?> requiredViewClass() {
return InternalResourceView.class;
}
public void setAlwaysInclude(boolean alwaysInclude) {
this.alwaysInclude = alwaysInclude;
}
protected AbstractUrlBasedView buildView(String viewName) throws Exception {
InternalResourceView view = (InternalResourceView)super.buildView(viewName);
if (this.alwaysInclude != null) {
view.setAlwaysInclude(this.alwaysInclude);
}
view.setPreventDispatchLoop(true);
return view;
}
}
视图解析器会将要跳转的视图添加前缀和后缀使它成为一个完整的路径
视图解析器-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" id="internalResourceViewResolver">
<!-- 前缀-->
<property name="prefix" value="/WEB-INF/jsp/"/>
<!-- 后缀-->
<property name="suffix" value=".jsp"/>
</bean>
7、DispatcherServlet对返回视图进行渲染后返回给浏览器用户
第四步骤中的setViewName后携带的参数就是要返回的视图
===========================分割线============================
这些应该就是SpringMVC从接收前端请求到后端返回视图的执行的大体流程 以上都是我自己看视频及部分源码后自己总结出来的 欢迎各路大神指出我文章中的错误 非常感谢