SpringMvc执行流程
SpringMvc运行原理:
SpringMvc运行原理图:
列如请求:http://localhost:8080/springmvc/hello
1、前端页面发送请求到DispatcherServlet(前端控制器):
在web.xml中DispatcherServlet接收到请求:
<servlet> <servlet-name>springmvc</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:spring-mvc.xml</param-value> </init-param> </servlet> <servlet-mapping> <servlet-name>springmvc</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping>
2、DispatcherServlet根据加载的springmvc.xml文件,查找并发送请求到HandlerMapping:
<!-- 扫描@Controller的包扫描 --> <context:component-scan base-package="com.ypf.*"></context:component-scan> <!-- 配置注解驱动 该配置会自动注册RequestMappingHandlerMapping与RequestMappingHandlerAdapter两个Bean,
这是Spring MVC为@Controller分发请求所必需的--> <mvc:annotation-driven/> <!-- 配置视图解析器 --> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="prefix" value="/WEB-INF/"></property> <property name="suffix" value=".jsp"></property> </bean>
3、HandlerMapping会根据请求查找com.ypf.*包下所有被扫描到的Controller,返回处理器执行链(一个或多个拦截器)和查询到的Handler(在多个Controller中根据请求路径匹配到的Controller)到前端控制器(DispatcherServlet)
<!-- 扫描@Controller的包扫描 --> <context:component-scan base-package="com.ypf.*"></context:component-scan> <!-- 配置注解驱动 该配置会自动注册RequestMappingHandlerMapping与RequestMappingHandlerAdapter两个Bean,这是Spring MVC为@Controller分发请求所必需的--> <mvc:annotation-driven/> <!-- 配置视图解析器 --> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="prefix" value="/WEB-INF/"></property> <property name="suffix" value=".jsp"></property> </bean>
" /springmvc "就是当前项目,然后查找路径中的" /hello "匹配到Controller,
cpackage com.ypf.controller; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; @Controller public class HelloController { @RequestMapping("/hello") public String hello() { return "hello"; } }
4、DispatcherServlet发送请求到HandlerAdapter(处理器适配器)请求执行查询到的Handler(即匹配到的Controller)
5、HandlerAdapter(处理器适配器)执行Handler(执行HelloController),代码如上图;
6、执行完Handler,返回ModelAndView(返回“hello”字符串)到HandlerAdapter;
7、HandlerAdapter(处理器适配器)将ModelAndView返回给DispatcherServlet(前端控制器);
8、DispatcherServlet发送得到的字符串到ViewResolver(视图解析器),请求解析视图;
<!-- 扫描@Controller的包扫描 --> <context:component-scan base-package="com.ypf.*"></context:component-scan> <!-- 配置注解驱动 该配置会自动注册RequestMappingHandlerMapping与RequestMappingHandlerAdapter两个Bean,这是Spring MVC为@Controller分发请求所必需的--> <mvc:annotation-driven/> <!-- 配置视图解析器 --> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="prefix" value="/WEB-INF/"></property> <property name="suffix" value=".jsp"></property> </bean>
9、ViewResolver(视图解析器)将接收到的字符串"hello",拼接上prefix(前缀)与suffix(后缀),即“ /WEB-INF/hello.jsp”,在/WEB-INF下找到hello.jsp页面,返回到DispatcherServlet(前端控制器);
10、DispatcherServlet(前端控制器)将视图响应给用户。
在整个过程中,前端控制器起到用于接收请求,响应结果,相当于转发器,中央处理器,减小向组件间的耦合度。