SpringMVC-1-概述

目录

1、第一章:SpringMVC概述

1.1 SpringMVC简介

1.2 SpringMVC优点

1.3 创建一个SpringMVC Web项目-详细步骤如下截图

1.3.1 创建一个空工程

1.3.2 为这个空工程添加一个SpringMVC Web模块

1.3.3 添加完SpringMVC Web模块之后的初始的Web项目示意图

1.4 在刚才创建好的SpringMVC Web中实现功能:前后端打通

1.4.0 需求与实现步骤

1.4.1 在main目录下创建一个java源代码目录和resources资源目录

1.4.2 在pom.xml文件中配置SpringMVC和Servlet依赖

1.4.3 在web.xml文件中注册中央处理器DispatchServlet

1.4.4 在java包中写具体的控制器: MyController(some.do请求的doSome处理器与other.do请求的doOther处理器)

1.4.5 在springmvc.xml文件中配置组件扫描器和视图解析器

1.4.6 在WEB-INF工程目录下创建jsp视图:show.jsp和other.jsp

1.4.7 前面的操作完成后最终的项目结构图

1.4.8 前后端测试

1.5 使用SpringMVC框架对web请求的处理流程

1.5.1 SpringMVC对前端请求的处理流程-源码分析

1.5.2 WEB-INF目录解释

1.6 SpringMVC的MVC组件

1.6.1 SpringMVC执行流程的流程图

1.6.2 SpringMVC执行流程的简单分析

注:

(1)本套SpringMVC学习专题来自于B站动力节点视频https://www.bilibili.com/video/BV1sk4y167pD?p=1

(2)专题内容概览如下截图:

1、第一章:SpringMVC概述

1.1 SpringMVC简介

SpringMVC 也叫 Spring web mvc,是 Spring 框架的一部分,是在 Spring3.0 后发布的。

1.2 SpringMVC优点

(1)基于 MVC 架构:基于 MVC 架构,功能分工明确,解耦合。

(2)容易理解,上手快,使用简单:学习完Spring就可以开发一个注解的 SpringMVC 项目,SpringMVC 也是轻量级的, jar 很小。不依赖的特定的接口和类。

(3)作为 Spring 框架一部分,能够使用 Spring 的 IoC 和 Aop:方便整合 Strtus,MyBatis,Hiberate,JPA 等其他框架。

(4)SpringMVC 强化注解的使用,在控制器,Service,Dao 都可以使用注 解,方便灵活。

使用@Controller 创建处理器对象,@Service 创建业务对象,@Autowired 或者@Resource 在控制器类中注入 Service,Service 类中注入 Dao。

1.3 创建一个SpringMVC Web项目-详细步骤如下截图

1.3.1 创建一个空工程

   

1.3.2 为这个空工程添加一个SpringMVC Web模块

    

    

1.3.3 添加完SpringMVC Web模块之后的初始的Web项目示意图

    

1.4 在刚才创建好的SpringMVC Web中实现功能:前后端打通

1.4.0 需求与实现步骤

1.4.1 在main目录下创建一个java源代码目录和resources资源目录

1.4.2 在pom.xml文件中配置SpringMVC和Servlet依赖

<?xml version="1.0" encoding="UTF-8"?>

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.wind</groupId>
    <artifactId>springmvc-web</artifactId>
    <version>1.0-SNAPSHOT</version>
    <packaging>war</packaging>

    <!--注册站点用,默认生成的,暂时用不到-->
    <name>springmvc-web Maven Webapp</name>
    <!-- FIXME change it to the project's website -->
    <url>http://www.example.com</url>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <maven.compiler.source>1.8</maven.compiler.source>
        <maven.compiler.target>1.8</maven.compiler.target>
    </properties>

    <dependencies>

        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.11</version>
            <scope>test</scope>
        </dependency>

        <!--添加servlet依赖-->
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
            <version>3.1.0</version>
            <scope>provided</scope>
        </dependency>

        <!--添加SpringMVC依赖,会自动把里面整合的Spring依赖添加进来-->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
            <version>5.2.5.RELEASE</version>
        </dependency>

    </dependencies>

    <build>
        <finalName>springmvc-web</finalName>
        <pluginManagement><!-- lock down plugins versions to avoid using Maven defaults (may be moved to parent pom) -->
            <plugins>

                <!-- 编码和编译和JDK版本 -->
                <plugin>
                    <artifactId>maven-compiler-plugin</artifactId>
                    <version>3.1</version>
                    <configuration>
                        <source>${maven.compiler.source}</source>
                        <target>${maven.compiler.target}</target>
                    </configuration>
                </plugin>

                <plugin>
                    <artifactId>maven-clean-plugin</artifactId>
                    <version>3.1.0</version>
                </plugin>
                <!-- see http://maven.apache.org/ref/current/maven-core/default-bindings.html#Plugin_bindings_for_war_packaging -->
                <plugin>
                    <artifactId>maven-resources-plugin</artifactId>
                    <version>3.0.2</version>
                </plugin>
                <plugin>
                    <artifactId>maven-compiler-plugin</artifactId>
                    <version>3.8.0</version>
                </plugin>
                <plugin>
                    <artifactId>maven-surefire-plugin</artifactId>
                    <version>2.22.1</version>
                </plugin>
                <plugin>
                    <artifactId>maven-war-plugin</artifactId>
                    <version>3.2.2</version>
                </plugin>
                <plugin>
                    <artifactId>maven-install-plugin</artifactId>
                    <version>2.5.2</version>
                </plugin>
                <plugin>
                    <artifactId>maven-deploy-plugin</artifactId>
                    <version>2.8.2</version>
                </plugin>
            </plugins>
        </pluginManagement>
    </build>
</project>

1.4.3 在web.xml文件中注册中央处理器DispatchServlet

(1)web.xml文件中web依赖的约束版本太低,更换成功能强大的高版本:

   

(2)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">

    <!--
    注册SpringMVC的核心对象DispatcherServlet,需要在Tomcat服务器启动的时候创建一个DispatcherServlet实例对象。
    为什么要创建DispatcherServlet对象实例呢?
    因为在创建DispatcherServlet对象实例的时候,会创建SpringMVC容器对象,也即会读取SpringMVC的配置文件,把这个配置文件
    中声名的bean对象都创建好,这样的话,当用户发起请求时就可以直接这些对象来处理ajax请求了。
    servlet的初始化方法init(),DispatcherServlet对象的创建在这个init方法中:
    {
    //读取配置文件,创建SpringMVC的Web容器
    WebApplicationContext ctx = new ClassPathXmlApplicationContext("springmvc.xml");
    //把容器对象放到ServletContext对象中
    getServletContext().setAttribute("key", ctx);
    }
    测试:启动Tomcat的时候报了一个错:Could not open ServletContext resource [/WEB-INF/springMVC-servlet.xml]
    -->
    <servlet>
        <servlet-name>springMVC</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <!--自定义SpringMVC读取的配置文件:
        (1)contextConfigLocation:SpringMVC配置文件位置的属性
        (2)classpath:指定SpringMVC配置文件的位置
        -->
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:springmvc.xml</param-value>
        </init-param>
        <!--Tomcat服务器启动后,就开始创建该SpringMVC容器对象。值是一个大于等于的0的整数,值越小,说明被创建的时间越早。-->
        <load-on-startup>1</load-on-startup>
    </servlet>


    <!--解释url-pattern:
    在使用框架的时候,url-pattern可以有两种取值:
    (1)使用扩展名的方式,语法:*.xxx,其中的xxx是自定义的扩展名,比如:*.action,*.do,*.mvc
        此时针对它们有效:
        http://localhost:8008/springmvc-web/*.do
        http://localhost:8008/springmvc-web/*.action
        http://localhost:8008/springmvc-web/*.mvc
    (2)使用斜杠 / :代表所有类型的路由类型
    -->
    <servlet-mapping>
        <servlet-name>springMVC</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>

</web-app>

1.4.4 在java包中写具体的控制器: MyController(some.do请求的doSome处理器与other.do请求的doOther处理器)

package com.wind.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;

/**
 * @Controller 用来创建一个控制器对象,并且存储在SpringMVC容器中,通过这个控制器对象来处理前端请求。
 * 位置:在类的上面
 * 功能:能够处理前端发起的HTTP请求。能够处理请求的都是控制器(处理器),MyController能够处理请求,叫做后端控制器。
 */
@Controller
public class MyController {

    /**
     * 在SpringMVC中,使用方法来处理前端请求。方法是自定义的,可以有多种参数,多种返回值。
     * ModelAndView:使用SpringMVC框架中自带的视图类。
     * (1)在类中添加数据,以便在视图中展示:
     * 比如:modelAndView.addObject("fun", "doSome处理器");
     * (2)在类中添加视图,读取之前在类中添加好的数据:
     * 比如:modelAndView.setViewName("show");
     */
    @RequestMapping(value = "/some.do")
    public ModelAndView doSome() {
        System.out.println("处理some.do这个请求了");
        ModelAndView modelAndView = new ModelAndView();
        modelAndView.addObject("msg", "使用注解的SpringMVC应用项目");
        modelAndView.addObject("fun", "doSome处理器");
        modelAndView.setViewName("show");
        return modelAndView;
    }

    @RequestMapping(value = "/other.do")
    public ModelAndView doOther() {
        System.out.println("处理other.do这个请求了");
        ModelAndView modelAndView = new ModelAndView();
        modelAndView.addObject("msg", "使用注解的SpringMVC应用项目");
        modelAndView.addObject("fun", "doOther处理器");
        modelAndView.setViewName("other");
        return modelAndView;
    }

}

1.4.5 在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: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/context  http://www.springframework.org/schema/context/spring-context.xsd">

    <!--声名组件扫描器-->
    <context:component-scan base-package="com.wind"/>

    <!--视图解析器:添加前缀和后缀。
    SpringMVC框架为了避免对于请求资源路径与扩展名上的冗余,在视图解析器 InternalResouceViewResolver
    中引入了请求的前辍与后辍。而 ModelAndView 中只需给出要跳转页面的文件名即可,对于具体的文件路径与文件扩展名,
    视图解析器会自动完成拼接。-->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <!--视图文件的路径-->
        <property name="prefix" value="/WEB-INF/jsp/"/>
        <!--视图文件的扩展名-->
        <property name="suffix" value=".jsp"/>
    </bean>

</beans>

1.4.6 在WEB-INF工程目录下创建jsp视图:show.jsp和other.jsp

<%--
  Created by IntelliJ IDEA.
  Date: 2021/1/1
  Time: 12:22
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<h3>/WEB-INF/jsp/show.jsp从request作用域中myController控制器获取的处理结果</h3>
<h3>msg数据是:${msg}</h3>
<h3>fun数据是:${fun}</h3>
</body>
</html>
<%--
  Created by IntelliJ IDEA.
  Date: 2021/1/1
  Time: 12:22
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<h3>/WEB-INF/jsp/other.jsp从request作用域中myController控制器获取的处理结果</h3>
<h3>msg数据是:${msg}</h3>
<h3>fun数据是:${fun}</h3>
</body>
</html>

1.4.7 前面的操作完成后最终的项目结构图

1.4.8 前后端测试

1.5 使用SpringMVC框架对web请求的处理流程

1.5.1 SpringMVC对前端请求的处理流程-源码分析

【IntelliJ IDEA for macOS 快速显示一个类中的所有方法快捷键:command + 7】

1.5.2 WEB-INF目录解释

(1)WEB-INF目录下资源对用户来说都是不开放的,也即用户不可直接访问。 

(2)因此,通常情况下,会把用户访问的页面资源,比如show.jsp这个页面放在WEB-INF/jsp目录下。

(3)同时,在开发时,在sppringmvc.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: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/context  http://www.springframework.org/schema/context/spring-context.xsd">

    <!--声名组件扫描器-->
    <context:component-scan base-package="com.wind"/>

    <!--视图解析器:添加前缀和后缀。
    SpringMVC框架为了避免对于请求资源路径与扩展名上的冗余,在视图解析器 InternalResouceViewResolver
    中引入了请求的前辍与后辍。而 ModelAndView 中只需给出要跳转页面的文件名即可,对于具体的文件路径与文件扩展名,
    视图解析器会自动完成拼接。-->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <!--视图文件的路径-->
        <property name="prefix" value="/WEB-INF/jsp/"/>
        <!--视图文件的扩展名-->
        <property name="suffix" value=".jsp"/>
    </bean>

</beans>

1.6 SpringMVC的MVC组件

1.6.1 SpringMVC执行流程的流程图

1.6.2 SpringMVC执行流程的简单分析

(1)浏览器提交请求到中央调度器。

(2)中央调度器直接将请求转给处理器映射器。

(3)处理器映射器会根据请求,找到处理该请求的处理器,并将其封装为处理器执行链后返回给中央调度器。

(4)中央调度器根据处理器执行链中的处理器,找到能够执行该处理器的处理器适配器。

(5)处理器适配器调用执行处理器。

(6)处理器将处理结果及要跳转的视图封装到一个对象 ModelAndView 中,并将其返回给处理器适配器。

(7)处理器适配器直接将结果返回给中央调度器。

(8)中央调度器调用视图解析器,将 ModelAndView 中的视图名称封装为视图对象。

(9)视图解析器将封装了的视图对象返回给中央调度器。

(10)中央调度器调用视图对象,让其自己进行渲染,即进行数据填充,形成 响应对象。

(11)中央调度器响应浏览器。

猜你喜欢

转载自blog.csdn.net/cmm0401/article/details/112058460