SpringMvc(3) SpringMvc执行原理和深入学习

 SpringMvc执行原理和深入学习

1.中心控制器 

  SpringMVC的原理如下图所示:

  当发起请求时被前置的控制器拦截到请求,根据请求参数生成代理请求,找到请求对应的实际控制器,控制器处理请求,创建数据模型,访问数据库,将模型响应给中心控制器,控制器使用模型与视图渲染视图结果,将结果返回给中心控制器,再将结果返回给请求者。

2.SpringMVC执行原理

  

  图为SpringMVC的一个较完整的流程图,实线表示SpringMVC框架提供的技术,不需要开发者实现,虚线表示需要开发者实现。

  简要分析执行流程

    1.DispatcherServlet表示前置控制器,是整个SpringMVC的控制中心。用户发出请求,DispatcherServlet接收请求并拦截请求。

    我们假设请求的url为 : http://localhost:8080/SpringMVC/hello

    如上url拆分成三部分:

      http://localhost:8080服务器域名

      SpringMVC部署在服务器上的web站点

      hello表示控制器

    通过分析,如上url表示为:请求位于服务器localhost:8080上的SpringMVC站点的hello控制器。

      1.HandlerMapping为处理器映射。DispatcherServlet调用HandlerMapping,HandlerMapping根据请求url查找Handler。

      2.HandlerExecution表示具体的Handler,其主要作用是根据url查找控制器,如上url被查找控制器为:hello。

      3.HandlerExecution将解析后的信息传递给DispatcherServlet,如解析控制器映射等。

      4.HandlerAdapter表示处理器适配器,其按照特定的规则去执行Handler。

      5.Handler让具体的Controller执行。

      6.Controller将具体的执行信息返回给HandlerAdapter,如ModelAndView。

      7.HandlerAdapter将视图逻辑名或模型传递给DispatcherServlet。

      8.DispatcherServlet调用视图解析器(ViewResolver)来解析HandlerAdapter传递的逻辑视图名。

      9.视图解析器将解析的逻辑视图名传给DispatcherServlet。

      10.DispatcherServlet根据视图解析器解析的视图结果,调用具体的视图。

      最终视图呈现给用户。

3.看了这么多,下面我们代码演示一下 

  1、新建一个Moudle,springmvc-02-hello,添加web的支持!

 

  2、确定导入了SpringMVC的依赖!

 

  3、配置web.xml,注册DispatcherServlet

<?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">

    <!-- 配置DispatchServlet:这个是SpringMvc的核心;请求分发器,前端控制器 -->
    <servlet>
        <servlet-name>springmvc</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <!-- DispatcherServlet要绑定spring的配置文件-->
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:springmvc-servlet.xml</param-value>
        </init-param>
        <!-- 启动级别:1 -->
        <load-on-startup>1</load-on-startup>
    </servlet>

    <!--
        在SpringMvc中: /  /*
        / :只匹配所有的请求,不会去匹配jsp页面
        /*:匹配所有的请求,包括jsp页面
    -->
    <servlet-mapping>
        <servlet-name>springmvc</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>

</web-app> 

  4、编写SpringMVC 的 配置文件!名称:springmvc-servlet.xml  : [servletname]-servlet.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"
      xsi:schemaLocation="http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans.xsd">

</beans>

  5、添加 处理映射器

 6、添加 处理器适配器

 7、添加 视图解析器

<?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:context="http://www.springframework.org/schema/context"
       xmlns:mvc="http://www.springframework.org/schema/mvc"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans.xsd
       http://www.springframework.org/schema/context
       https://www.springframework.org/schema/context/spring-context.xsd
       http://www.springframework.org/schema/mvc
       https://www.springframework.org/schema/mvc/spring-mvc.xsd">

    <!-- 处理器映射器 -->
    <bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/>
    <!-- 处理器适配器-->
    <bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"/>

    <!-- 视图解析器:模板引擎 Thymeleaf Freemarker .. -->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" id="internalResourceViewResolver">
        <!-- 前缀-->
        <property name="prefix" value="/WEB-INF/jsp/"></property>
        <!-- 后缀-->
        <property name="suffix" value=".jsp"></property>
    </bean>

    <!-- BeanNameUrlHandlerMapping:bean -->
    <bean id="/hello" class="com.luo.controller.HelloController"></bean>
</beans>

  8、编写我们要操作业务Controller ,要么实现Controller接口,要么增加注解;需要返回一个ModelAndView,装数据,封视图;

package com.luo.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 httpServletRequest, HttpServletResponse httpServletResponse) throws Exception {

        ModelAndView mv = new ModelAndView();

        //业务代码
        String result="HelloSpringMvc";
        mv.addObject("msg",result);

        //视图跳转
        mv.setViewName("test");
        return mv;
    }
}

  9、将自己的类交给SpringIOC容器,注册bean(在上面的springmvc-servlet.xml已经有过了)

    <!-- BeanNameUrlHandlerMapping:bean -->
    <bean id="/hello" class="com.luo.controller.HelloController"></bean>

  10、写要跳转的jsp页面,显示ModelandView存放的数据,以及我们的正常页面;

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
    ${msg}
</body>
</html>

  11.配置tomcat,并且测试

   

  可能遇到的问题:访问出现404,排查步骤:

    1.查看控制台输出,看一下是不是缺少了什么jar包。

    2.如果jar包存在,显示无法输出,就在IDEA的项目发布中,添加lib依赖!

    3.重启Tomcat 即可解决!

    小结:看这个估计大部分同学都能理解其中的原理了,但是我们实际开发才不会这么写,不然就疯了,还学这个玩意干嘛!我们来看个注解版实现,这才是SpringMVC的精髓,到底有多么简单,看这个图就知道了。

 

 

 

     感谢B站狂神说Java,这一路在B站上白嫖很多内容!

posted @ 2022-06-17 16:55  十三加油哦  阅读(42)  评论(0编辑  收藏  举报