Spring MVC框架学习---- 使用原生的配置 熟悉 SpringMVC 的执行流程

Posted RAIN 7

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spring MVC框架学习---- 使用原生的配置 熟悉 SpringMVC 的执行流程相关的知识,希望对你有一定的参考价值。

文章目录

一、Maven 搭建原生 SpringMVC


使用原生的方式,更加熟悉具体的MVC框架的执行流程



(1)使用maven创建web项目(使用web模板)



创建好项目的显示界面



(2)创建基本的目录结构


main下面创建java、resource目录,

如果使用页面渲染的话,在WEB-INF下创建jsp目录



(3)导入servlet、spring-webmvc依赖,部署好tomcat


servelt-API的依赖

    <!-- https://mvnrepository.com/artifact/javax.servlet/javax.servlet-api -->
    <dependency>
      <groupId>javax.servlet</groupId>
      <artifactId>javax.servlet-api</artifactId>
      <version>3.1.0</version>
      <scope>provided</scope>
    </dependency>

下面是maven仓库中最新的spring-webmvc依赖

    <!-- https://mvnrepository.com/artifact/org.springframework/spring-webmvc -->
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-webmvc</artifactId>
      <version>5.3.21</version>
    </dependency>

tomcat使用工具设置好



(4) 配置web.xml, 注册DispatcherServlet


SpringMVC框架是围绕 DispatcherServelt 调度器进行设计的

DispatcherServlet 就是前端控制器,对前端的各种请求进行调度,最终返回一个渲染的视图或者数据

在web.xml中注册为 DispathcherServlet 接口设计 servlet 标签及映射 servletMapper

<?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>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>
  <load-on-startup>1</load-on-startup>
</servlet>

  <servlet-mapping>
    <servlet-name>springmvc</servlet-name>
    <url-pattern>/</url-pattern>
  </servlet-mapping>

</web-app>

Dispatcher同时与springMVC的配置文件绑定,同时设置启动级别为1,随着服务器的启动而加载。

映射的路径为/,处理/的所有请求


/ 与 /* 的区别


/ 匹配所有的请求,但是不包括 不包括 .jsp

/* 匹配所有的请求,也包括 .jsp


  因为我们想要返回的视图都是jsp文件,所有在后面的视图解析器配置中会加上jsp文件的前缀与后缀,如果是jsp的请求的话,那么达到视图解析器就会嵌套名字了,不符合要求了。


(5)编写SpingMVC 的配置文件


使用原生的底层处理的方式使用mvc,在resource目录下创建spring-mvc.xml 配置文件


处理器映射器(HandlerMapping)

  使用spingMVC框架提供的 BeanNameUrlHandlerMapping ,记住得在下面注册bean使得id与class进行对应,这样才能找到url与接口的映射关系。


处理器适配器(HandlerAdapter)

​ 使用SpringMVC框架提供的 SimpleControllerHandlerAdapter , 根据映射关系,执行controller的代码,调用service层,返回数据(Json)或者模型视图(ModelAndView)。


视图解析器(ViewResolver)

  使用SpringMVC框架提供的 InternalResourceViewResolver ,并加上指定id方便调用,渲染视图界面,返回给DispatcherServlet。


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


<!--    处理器映射器:在上下文中找到url与具体控制器(接口或者类)的关系-->
<bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/>

<!--    处理器适配器:找到映射关系之后,让控制器执行之后返回数据或者视图 -->
    <bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"/>

<!--    视图解析器: 如果返回数据(JSON、html),不需要经过该步骤-->
<!--    如果返回的是视图的话,那么原来的视图经过 之前的数据进行渲染之后 返回给Dispatcher,在展示给前端-->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" id="internalResourceViewResolver">
        <property name="prefix" value="/WEB-INF/jsp/"/>
        <property name="suffix" value=".jsp"/>
    </bean>


<!--    因为前面是url是根据bean名字进行映射的,所以需要注册bean,id与class符合映射关系-->
    <bean id="/hello" class="com.bit.controller.HelloController"/>

</beans>

(6) 创建具体的jsp页面


在jsp目录下写一个具体的hello.jsp 为渲染的页面,等待后端返回数据渲染

<%--
  Created by IntelliJ IDEA.
  User: rain7
  Date: 2022/6/24
  Time: 19:50
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>111</title>
</head>
<body>

$msg

</body>
</html>

(7)写一个后端的控制器(Controller),部署项目进行访问


  使用原生的方式,继承Controller(别导错了,导入springweb框架下的包),重写方法,给视图中的部分进行设置返回的业务数据,返回具体的视图模型。


package com.bit.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 request, HttpServletResponse response) throws Exception 
        ModelAndView mv = new ModelAndView();

        // 给视图设置业务数据
        mv.addObject("msg","HelloSpringMVC");

        // 返回一个具体的视图
        mv.setViewName("hello");

        return mv;
    


(8)运行项目,前端进行访问

(9)可能存在的问题


如果遇到404问题的话,那么排查步骤:

1、查看控制台输出,看一下是否是缺少了jar包

2、如果jar包存在的话,那么查看IEAD的发布项目中,是否添加了依赖

3、如果不存在依赖的话,那么在WEB-INF目录下建立lib文件夹,导入所有的依赖即可


二、Spring MVC执行流程


(1)简单流程概述


  1. 用户发送请求至前端控制器DispatcherServlet。


  2. DispatcherServlet收到请求调用HandlerMapping处理器映射器。


  1. 处理器映射器找到具体的处理器(controller或者handle)(可以根据xml配置、注解进行查找),生成处理器对象及处理器拦截器(如果有则生成)一并返回给DispatcherServlet。

  1. DispatcherServlet调用HandlerAdapter处理器适配器。

  1. HandlerAdapter经过适配调用具体的处理器(Controller,也叫后端控制器)。

  1. Controller执行完成返回ModelAndView。

  1. HandlerAdapter将controller执行结果ModelAndView返回给DispatcherServlet。

  1. DispatcherServlet将ModelAndView传给ViewReslover视图解析器。

  1. ViewReslover解析后返回具体View。

  1. DispatcherServlet根据View进行渲染视图(即将模型数据填充至视图中)。

  1. DispatcherServlet响应用户。

(2)什么是handler?


(3)什么是拦截器?



(4)核心架构的具体流程步骤


1.首先用户发送请求——>DispatcherServlet,前端控制器收到请求后自己不进行处理,而是委托给其他的解析器进行处理,作为统一访问点,进行全局的流程控制;


2.DispatcherServlet——>HandlerMapping, HandlerMapping 将会把请求映射为HandlerExecutionChain 对象(包含一个Handler 处理器(Controller)对象、多个HandlerInterceptor 拦截器)对象,通过这种策略模式,很容易添加新的映射策略;


3.DispatcherServlet——>HandlerAdapter,HandlerAdapter 将会把处理器包装为适配器,从而支持多种类型的处理器,即适配器设计模式的应用,从而很容易支持很多类型的处理器;


4.HandlerAdapter——>处理器功能处理方法的调用,HandlerAdapter 将会根据适配的结果调用真正的处理器的功能处理方法,完成功能处理;并返回一个ModelAndView 对象(包含模型数据、逻辑视图名);


5.ModelAndView的逻辑视图名——> ViewResolver, ViewResolver 将把逻辑视图名解析为具体的View,通过这种策略模式,很容易更换其他视图技术;


6.View——>渲染,View会根据传进来的Model模型数据进行渲染,此处的Model实际是一个Map数据结构,因此很容易支持其他视图技术;


7返回控制权给DispatcherServlet,由DispatcherServlet返回响应给用户,到此一个流程结束。

以上是关于Spring MVC框架学习---- 使用原生的配置 熟悉 SpringMVC 的执行流程的主要内容,如果未能解决你的问题,请参考以下文章

Spring MVC +Spring 框架学习总结-全网最好用的学习笔记

Spring MVC框架 学习笔记总结

Spring MVC 框架学习---- SSM 框架整合

Spring MVC框架 学习笔记总结

从零学习Spring MVC框架「环境搭建和MVC架构」

SSM 框架学习 => Spring MVC