springmvc工作流程

本文详细介绍了SpringMVC的组件及执行流程,从前端控制器DispatcherServlet开始,经过处理器映射器查找处理器,处理器适配器执行处理器,再到视图解析器解析视图,最后完成响应。整个流程涉及了Controller、HandlerMapping、HandlerAdapter、ViewResolver等多个关键角色。

springmvc工作原理图
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

一、SpringMVC的组件介绍

前端控制器(DisatcherServlet)

接收请求,响应结果,返回可以是json,String等数据类型,也可以是页面(Model)

处理器映射器(HandlerMapping)

根据URL去查找处理器,一般通过xml配置或者注解进行查找

处理器(Handler)

就是我们常说的controller控制器啦,由程序员编写。

处理器适配器(HandlerAdapter)

可以将处理器包装成适配器,这样就可以支持多种类型的处理器

视图解析器(ViewResovler)

进行视图解析,返回view对象(常见的有JSP,FreeMark等)

二、执行流程

1、用户发送请求到前端控制器(DispatcherServlet),也叫中央处理器

<!--
	index.jsp
	请求:/hello
	/:会触发servlet中 <url-pattern>/</url-pattern> 配置 ,调用 DispatcherServlet
	hello:会根据@RequestMapping("/hello")找到具体controller中的具体方法
-->
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>

    <a href="/hello">入门程序</a>

</body>
</html>

根据servlet映射web.xml,激活DispatcherServlet

<!DOCTYPE web-app PUBLIC
 "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
 "http://java.sun.com/dtd/web-app_2_3.dtd" >

<web-app>
  <display-name>Archetype Created Web Application</display-name>

<!--  springmvc必须先配置前端控制器 DisPatcherServlet,任何请求都会经过servlet-->
  <servlet>
    <servlet-name>dispatcherServlet</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!--    将 springmvc.xml 文件交给servlet加载后才可生效-->
    <init-param>
      <param-name>contextConfigLocation</param-name>
      <param-value>classpath:springmvc.xml</param-value>
    </init-param>
<!--    服务器启动就会创建 DispatcherServlet 类-->
    <load-on-startup>1</load-on-startup>
  </servlet>
  <servlet-mapping>
    <servlet-name>dispatcherServlet</servlet-name>
    <url-pattern>/</url-pattern>
  </servlet-mapping>

</web-app>

2、前端控制器请求处理器映射器(HandlerMapping)去查找处理器(Handler)

3、找到以后处理器映射器(HandlerMappering)向前端控制器返回执行链(HandlerExecutionChain)

根据请求路径 /hello,找到具体的controller中的具体方法,并将方法sayHello返回给DispatcherServlet

/**
 * 1、想要让一个类的方法执行,需要让这个类变为对象
 * 2、前端控制器DispatcherServlet执行流程:
 * load-on-startup配置让服务器启动就创建DispatcherServlet类
 * DispatcherServelet就会用init-param加载springmvc.xml
 * springmvc.xml 就会用 context:component-scan 开启注解扫描
 * 注解扫描就会使 @Controller 注解生效,且spring注解controller自动创建bean实体类<bean id= class=></bean>
 */
@Controller
public class HelloController {

    @RequestMapping("/hello")
    public String sayHello(){
        System.out.println("hello");
        return "success";
    }
}

4、前端控制器(DispatcherServlet)调用处理器适配器(HandlerAdapter)去执行处理器(Handler)

5、处理器适配器去执行Handler

6、处理器执行完给处理器适配器返回ModelAndView

7、处理器适配器向前端控制器返回ModelAndView

根据 sayHello 方法找到 success.jsp的页面路径

<!--
	return "success"; 控制层返回success.jsp页面
	success.jsp,路径在 WEB-INF/pages/ 
-->
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
    <h1>成功页面</h1>
</body>
</html>

8、前端控制器请求视图解析器(ViewResolver)去进行视图解析

9、视图解析器向前端控制器返回View

springmvc.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:mvc="http://www.springframework.org/schema/mvc"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans.xsd
       http://www.springframework.org/schema/mvc
       http://www.springframework.org/schema/mvc/spring-mvc.xsd
       http://www.springframework.org/schema/context
       http://www.springframework.org/schema/context/spring-context.xsd">

<!--    开启注解扫描,可扫描到此包下带有注解的类,将实体类交给spring的ioc容器管理,将其注入spring容器中-->
    <context:component-scan base-package="com.lian.springmvc"/>

<!--    配置试图解析器对象,使返回的success找到success.jsp页面的路径-->
    <bean id="internalResourceViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/WEB-INF/pages/"/>
        <property name="suffix" value=".jsp"/>
    </bean>

<!--    开启springmvc的框架注解支持,默认会开启处理器适配器和处理器映射器,@RequestMapping就是springmvc的注解-->
    <mvc:annotation-driven/>

</beans>

10、前端控制器对视图进行渲染

11、前端控制器向用户响应结果

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值