【SpringMVC】(一)什么是SpringMVC

详细见:狂神说SpringMVC01:什么是SpringMVC


1.回顾MVC

1.1 什么是MVC

  • MVC是模型Model、视图View、控制器Controller的简写,是一种软件设计规范。
  • MVC的主要作用是降低了视图与业务逻辑间的双向耦合。

1.2 回顾Servlet

  • 1.导入依赖

     <dependencies>
            <dependency>
                <groupId>junit</groupId>
                <artifactId>junit</artifactId>
                <version>4.12</version>
            </dependency>
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-webmvc</artifactId>
                <version>5.1.9.RELEASE</version>
            </dependency>
            <dependency>
                <groupId>javax.servlet</groupId>
                <artifactId>servlet-api</artifactId>
                <version>2.5</version>
            </dependency>
            <dependency>
                <groupId>javax.servlet.jsp</groupId>
                <artifactId>jsp-api</artifactId>
                <version>2.2</version>
            </dependency>
            <dependency>
                <groupId>javax.servlet</groupId>
                <artifactId>jstl</artifactId>
                <version>1.2</version>
            </dependency>
    </dependencies>
    
  • 2.HelloServlet

    public class HelloServlet extends HttpServlet {
    
        @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            //1.获取前端参数
            String method = req.getParameter("method");
            if(method.equals("add")){
                req.getSession().setAttribute("msg","执行了add方法");
            }
            if(method.equals("delete")){
                req.getSession().setAttribute("msg","执行了delete方法");
            }
    
            //2.调用业务层
            //3.视图转发或者重定向
            req.getRequestDispatcher("/WEB-INF/jsp/test.jsp").forward(req,resp);
        }
    
        @Override
        protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            doGet(req, resp);
        }
    }
    
  • 3.web.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
             version="4.0">
    
        <servlet>
            <servlet-name>HelloServlet</servlet-name>
            <servlet-class>com.musecho.servlet.HelloServlet</servlet-class>
        </servlet>
        <servlet-mapping>
            <servlet-name>HelloServlet</servlet-name>
            <url-pattern>/hello</url-pattern>
        </servlet-mapping>
    
    </web-app>
    
  • 4.test.jsp

    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <html>
    <head>
        <title>test</title>
    </head>
    
    <body>
        ${msg}
    </body>
    
    </html>
    
  • 5.请求url

    http://localhost:8080/hello?method=add
    


2.什么是SpringMVC

2.1 概述


2.2 中心控制器

  • Spring的web框架围绕DispatcherServlet(调度Servlet)设计。

  • DispatcherServlet的作用是将请求分发到不同的处理器。

  • SpringMVC以请求为驱动,围绕一个中心Servlet分派请求及提供其他功能,DispatcherServlet本质是Servlet(继承HttpServlet基类)。


2.3 SpringMVC执行原理

  • SpringMVC原理

  • SpingMVC执行原理



可参考例子理解原理:【SpringMVC】(二)第一个MVC程序

  • 假设请求的url是:http://localhost:8080/SpringMVC/hello

  • 1.用户发送请求,被DispatcherServlet拦截

  • 2.DispatcherServlet会调用springmvc配置文件中的处理器映射HandlerMapping

    HandlerMapping根据请求url(/hello)查找Handler

  • 3.HandlerExecution表示具体的Handler,其主要作用是根据url查找控制器hello

  • 4.HandlerExecution将解析后的信息传递给DispatcherServlet(hello控制器映射)

  • 5.DispatcherServlet调用(处理器适配器)HandlerAdapter,按照特定规则执行Handler。

    适配每一个实现了Controller接口的类,直到找到目标类

  • 6.Handler让具体的Controller执行

    执行HelloController类

  • 7.Controller将具体的执行信息(ModelAndView:包含要返回给前端的数据msg,要跳转的视图hello)返回给HandlerAdapter。

  • 8.HandlerAdapter将ModelAndView传递给DispatcherServlet。

  • 9.DispatcherServlet调用视图解析器ViewResolver,并传递ModelAndView。ViewResolver做的工作见下图。

  • 10.ViewResolver将解析的逻辑视图名/WEB-INF/jsp/hello.jsp传给DispatcherServlet。

  • 11.DispatcherServlet根据这个解析结果,调用具体的视图

  • 12.最终视图呈现给用户

posted @ 2021-02-02 21:00  musecho  阅读(120)  评论(0)    收藏  举报