signed

QiShunwang

“诚信为本、客户至上”

1.SpringMVC介绍与配置

2021/3/21 1:12:10   来源:

1、SpringMVC介绍与配置

文章目录

    • 1、SpringMVC介绍与配置
      • 1、什么是MVC?
      • 2、SpringMVC
          • 1、什么是SpringMVC
          • 2、Spring的优点
          • 3、SpringMVC的供工作原理
          • 4、SpringMVC的具体执行流程:
      • 3、基于注解的SpringMVC
          • 1、配置和演示
      • 4、总结和分析细节:
          • 1、整体的运行流程:
          • 2、spring的配置文件
          • 3、web.xml中DispatcherServlet的url-pattern
          • 4、@RequestMapping

1、什么是MVC?

MVC是模型(Model)、视图(View)、控制器(Controller)的简写,是一种软件设计规范。就是将业务逻辑、数据、显示分离的方法来组织代码。MVC主要作用是降低了视图与业务逻辑间的双向偶合。MVC不是一种设计模式,MVC是一种架构模式。当然不同的MVC存在差异。

Model(模型):数据模型,提供要展示的数据,因此包含数据和行为,可以认为是领域模型或JavaBean组件(包含数据和行为),不过现在一般都分离开来:Value Object(数据Dao) 和 服务层(行为Service)。也就是模型提供了模型数据查询和模型数据的状态更新等功能,包括数据和业务。

View(视图):负责进行模型的展示,一般就是我们见到的用户界面,客户想看到的东西。

Controller(控制器):接收用户请求,委托给模型进行处理(状态改变),处理完毕后把返回的模型数据返回给视图,由视图负责展示。 也就是说控制器做了个调度员的工作。

​ 其实在最早期的时候还有model1和model2的设计模型

最典型的MVC就是JSP + servlet + javabean的模式。

在这里插入图片描述

2、SpringMVC

1、什么是SpringMVC

Spring Web MVC is the original web framework built on the Servlet API and has been included in the Spring Framework from the very beginning. The formal name, “Spring Web MVC,” comes from the name of its source module (spring-webmvc), but it is more commonly known as “Spring MVC”.
Spring Web MVC是构建在Servlet API上的原始Web框架,从一开始就包含在Spring Framework中。 正式名称 “Spring Web MVC,” 来自其源模块(spring-webmvc)的名称,但它通常被称为“Spring MVC”。

简而言之:springMVC是Spring框架的一部分,是基于java实现的一个轻量级web框架,但是SpringMVC不是一个独立的框架。

​ 学习SpringMVC框架最核心的就是DispatcherServlet(前端控制器)的设计,掌握好DispatcherServlet是掌握SpringMVC的核心关键。

2、Spring的优点
  1. 清晰的角色划分:控制器(controller)、验证器(validator)、命令对象(command obect)、表单对象(form object)、模型对象(model object)、Servlet分发器(DispatcherServlet)、处理器映射(handler mapping)、试图解析器(view resoler)等等。每一个角色都可以由一个专门的对象来实现。

  2. 强大而直接的配置方式:将框架类和应用程序类都能作为JavaBean配置,支持跨多个context的引用,例如,在web控制器中对业务对象和验证器validator)的引用。

  3. 可适配、非侵入:可以根据不同的应用场景,选择何事的控制器子类(simple型、command型、from型、wizard型、multi-action型或者自定义),而不是一个单一控制器(比如Action/ActionForm)继承。

  4. 可重用的业务代码:可以使用现有的业务对象作为命令或表单对象,而不需要去扩展某个特定框架的基类。

  5. .可定制的绑定(binding)和验证(validation):比如将类型不匹配作为应用级的验证错误,这可以保证错误的值。再比如本地化的日期和数字绑定等等。在其他某些框架中,你只能使用字符串表单对象,需要手动解析它并转换到业务对象。

  6. 可定制的handler mapping和view resolution:Spring提供从最简单的URL映射,到复杂的、专用的定制策略。与某些web MVC框架强制开发人员使用单一特定技术相比,Spring显得更加灵活。

  7. 灵活的model转换:在Springweb框架中,使用基于Map的键/值对来达到轻易的与各种视图技术集成。

  8. 可定制的本地化和主题(theme)解析:支持在JSP中可选择地使用Spring标签库、支持JSTL、支持Velocity(不需要额外的中间层)等等。

  9. 简单而强大的JSP标签库(Spring Tag Library):支持包括诸如数据绑定和主题(theme)之类的许多功能。他提供在标记方面的最大灵活性。

  10. .JSP表单标签库:在Spring2.0中引入的表单标签库,使用在JSP编写表单更加容易。Spring Bean的生命周期:可以被限制在当前的HTTp Request或者HTTp Session。准确的说,这并非Spring MVC框架本身特性,而应归属于Spring MVC使用的WebApplicationContext容器。

3、SpringMVC的供工作原理

在这里插入图片描述

4、SpringMVC的具体执行流程:

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

在这里插入图片描述

  • 流程详解:
    1. DispatcherServlet表示前置控制器,是整个SpringMVC的控制中心。用户发出请求,DispatcherServlet接收请求并拦截请求。
    2. HandlerMapping为处理器映射。DispatcherServlet调用HandlerMapping,HandlerMapping根据请求url查找Handler。
    3. 返回处理器执行链,根据url查找控制器,并且将解析后的信息传递给DispatcherServlet
    4. HandlerAdapter表示处理器适配器,其按照特定的规则去执行Handler。
    5. 执行handler找到具体的处理器
    6. Controller将具体的执行信息返回给HandlerAdapter,如ModelAndView。
    7. DispatcherServlet调用视图解析器(ViewResolver)来解析HandlerAdapter传递的逻辑视图名。
    8. 视图解析器将解析的逻辑视图名传给DispatcherServlet。
    9. DispatcherServlet根据视图解析器解析的视图结果,调用具体的视图,进行试图渲染
    10. 将响应数据返回给客户端

3、基于注解的SpringMVC

1、配置和演示

项目目录:

在这里插入图片描述

  1. 创建Maven工程

    直接创建一个maven工程,不需要勾选其他东西,创建后工程后选中 工程 右键**—》add framework**…----》勾选Web Appliction–完成

在这里插入图片描述

在这里插入图片描述

  1. 添加pom依赖(也叫导入坐标依赖)

    <?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>org.example</groupId>
        <artifactId>mashibing_mvc_01</artifactId>
        <version>1.0-SNAPSHOT</version>
        <packaging>jar</packaging>
    
        <dependencies>
            <!-- https://mvnrepository.com/artifact/org.springframework/spring-webmvc -->
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-webmvc</artifactId>
                <version>5.3.5</version>
            </dependency>
            <!-- https://mvnrepository.com/artifact/org.springframework/spring-context -->
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-context</artifactId>
                <version>5.3.5</version>
            </dependency>
    
            <!-- https://mvnrepository.com/artifact/org.springframework/spring-web -->
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-web</artifactId>
                <version>5.3.5</version>
            </dependency>
            
              <!-- https://mvnrepository.com/artifact/javax.servlet/jsp-api -->
            <dependency>
                <groupId>javax.servlet</groupId>
                <artifactId>jsp-api</artifactId>
                <version>2.0</version>
                <scope>provided</scope>
            </dependency>
    
        </dependencies>
    </project>
    
  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">
    
        <!--配置前端控制器-->
        <servlet>
            <servlet-name>dispatcher</servlet-name>
            <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    
            <!--启动时加载applictionContext配置文件-->
            <init-param>
                <param-name>contextConfigLocation</param-name>
                <param-value>classpath:applictionContext.xml</param-value>
            </init-param>
            </servlet>
    <!--匹配servlet请求,/标识匹配所有请求,但是不会匹配.jsp-->
        <servlet-mapping>
            <servlet-name>dispatcher</servlet-name>
            <url-pattern>/</url-pattern>
        </servlet-mapping>
    
    </web-app>
    
  3. 配置applictionContext.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"
           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
           http://www.springframework.org/schema/context/spring-context.xsd
           http://www.springframework.org/schema/mvc
             http://www.springframework.org/schema/mvc/spring-mvc.xsd
    ">
        
        <!--添加扫描包,用于AOP注解-->
        <context:component-scan base-package="com.mvn"></context:component-scan>
        <!--添加mvn注解支持-->
        <mvc:annotation-driven></mvc:annotation-driven>
    
        <!--添加视图解析器-->
        <bean id="internalResourceViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
            <!--前缀-->
            <property name="prefix" value="/WEB-INF/page/"></property>
            <!-- 后缀 -->
            <property name="suffix" value=".jsp"/>
        </bean>
    </beans>
    
  4. 编写MyController类(@RequestMapping)

    package com.mvn.controller;
    import org.springframework.stereotype.Controller;
    import org.springframework.web.bind.annotation.RequestMapping;
    
    @Controller
    public class MyController {
    
        /*
         * @RequestMapping就是用来标识此方法用来处理什么请求,其中的/可以取消
         * 取消后默认也是从当前项目的根目录开始查找,一般在编写的时候看个人习惯
         * 同时,@RequestMapping也可以用来加在类上,
         * */
        @RequestMapping("/hello")
        public String hello() {
            System.out.println("成功!");
            return "hello";//返回一个叫hello的页面
        }
    }
    
    
  5. 在WEB-INF目录下创建page包,在包中创建hello.jsp
    在这里插入图片描述

  6. 将war包导入工程(这一步如果不做,那将会报500错误)

    步骤:

    file–》project sru…–》Artifacts–》在WEB-INF中创建lib文件夹–》选中该文件夹右键–add copy…》–将所有包导入

选中Project Structure
在这里插入图片描述

​ 在WEB-INF中创建lib文件夹
在这里插入图片描述
选中lib文件夹
在这里插入图片描述

全部导入
在这里插入图片描述

  1. 启动tomcat,访问http://localhost:8080/springmvc_01_war_exploded/hello

4、总结和分析细节:

1、整体的运行流程:
  1. 客户端发送请求:http://localhost:8080/springmvc_01_war_exploded/hello
  2. 由tomcat接受请求
  3. SpringMVC的前端控制器DispatcherServlet接收到所有的请求(拦截)
  4. 查看请求地址和@RequestMapping注解的哪个匹配,来找到具体的类的处理方法
  5. 前端控制器找到目标处理类和方法之后,执行目标方法
  6. DispatcherServlet拿到页面地址之后,转发到具体的页面
2、spring的配置文件

在web.xml中可以不添加关联springmvc的配置文件,但是应该将配置文件放入WEB-INF中,且有严格的名称规定。

3、web.xml中DispatcherServlet的url-pattern
<?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">
    <!--配置DispatcherServlet-->
    <servlet>
        <servlet-name>springmvc</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <!--
		关联springmvc的配置文件
		此配置文件的属性可以不添加,但是需要在WEB-INF的目录下创建 前端控制器名称-servlet.xml文件
		-->
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:applicationContext.xml</param-value>
        </init-param>
    </servlet>
    <!--匹配servlet的请求,
    /:标识匹配所有请求,但是不会jsp页面
    /*:拦截所有请求,拦截jsp页面

     但是需要注意的是,当配置成/的时候,index.html会发现请求不到
     原因在于,tomcat下也有一个web.xml文件,所有的项目下web.xml文件都需要继承此web.xml
     在服务器的web.xml文件中有一个DefaultServlet用来处理静态资源,但是url-pattern是/
     而我们在自己的配置文件中如果添加了url-pattern=/会覆盖父类中的url-pattern,此时在请求的时候
     DispatcherServlet会去controller中做匹配,找不到则直接报404
     而在服务器的web.xml文件中包含了一个JspServlet的处理,所以不过拦截jsp请求
    -->
    <servlet-mapping>
        <servlet-name>springmvc</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>
</web-app>

解决方案:添加下面标签

<welcome-file-list>
	<welcome-file>index.html</welcome-file>
	<welcome-file>index.jsp</welcome-file>
	<welcome-file>index.htm</welcome-file>
</welcome-file-list>
4、@RequestMapping
  1. @RequestMapping用来匹配客户端发送的请求,可以在方法上使用,也可以在类上使用。

    ​ 方法:表示用来匹配要处理的请求

    ​ 类上:表示为当前类的所有方法的请求地址添加一个前置路径,访问的时候必须要添加此路径

  2. 什么时候需要在类上添加@RequestMapping呢?

    当不同类中存在相同的RequestMapping用于方法上时,需要在类上加上@RequsetMapping