Spring MVC__入门

目录

一、SpringMVC简介

1、什么是MVC

MVC是一种软件架构的思想,将软件按照模型、视图、控制器来划分

M:Model,模型层,指工程中的JavaBean,作用是处理数据

JavaBean分为两类:

  • 一类称为实体类 Bean:专门存储业务数据的,如Student、User 等
  • 一类称为业务处理 Bean :指 Service 或 Dao 对象,专门用于处理业务逻辑和数据访问

V : View ,视图层,指工程中的 html 或 jsp 等页面,作用是与用户进行交互,展示数据
C : Controller ,控制层,指工程中的 servlet ,作用是接收请求和响应浏览器

MVC 的工作流程:用户通过视图层发送请求到服务器,在服务器中请求被 Controller 接收, Controller调用相应的Model 层处理请求,处理完毕将结果返回到 Controller , Controller 再根据请求处理的结果找到相应的View 视图,渲染数据后最终响应给浏览器

2、什么是SpringMVC

SpringMVC 是 Spring 的一个后续产品,是 Spring 的一个子项目

SpringMVC 是 Spring 为表述层开发提供的一整套完备的解决方案。在表述层框架历经 Strust 、

WebWork 、 Strust2 等诸多产品的历代更迭之后,目前业界普遍选择了 SpringMVC 作为 Java EE 项目表述层开发的首选方案

注:三层架构分为表述层(或表示层)、业务逻辑层、数据访问层,表述层表示前台页面和后台servlet

二、Spring MVC实现原理

2.1核心组件

  • DispatcherServlet:前置控制器,负责调度其他组件的执行,可以降低不同组件之间的耦合性,是整个Spring MVC的核心模块
  • Handler:处理器,完成具体的业务逻辑,相当于Servlet
  • HandlerMapping:DispatcherServlet是通过 HandlerMapping把请求映射到不同的Handler
  • HandlerInterceptor:处理器拦截器,是一个接口,如果我们需要进行一些拦截处理,可以通过实现该接口完成
  • HandlerExecutionChain:处理器执行链,包括两部分内容:Handler和HandlerInterceptor(系统会有一个默认的HandlerInterceptor,如果有额外拦截处理,可以添加拦截器进行设置)
  • HandlerAdapter:处理器适配器,Handler执行业务方法之前,需要进行一系列的操作包括表单的数据验证、数据类型转换、把表单数据封装到POJO 等,这些一系列的操作都是由HandlerAdapter完成,DispatcherServlet通过HandlerAdapter执行不同的Handler
  • ModelAndView:封装了模型数据和视图信息,作为Handler的处理结果,返回给DispatcherServlet
  • ViewResolver:视图解析器,DispatcherServlet通过它把逻辑视图解析为物理视图,最终把渲染的结果响应给客户端

2.2工作流程

  1. 客户端请求被DispatcherServlet接收
  2. 根据HandlerMapping映射到Handler
  3. 生成Handler和HandlerInterceptor
  4. Handler和HandlerInterceptor以HandlerExecutionChain的形式一并返回给DispatcherServlet
  5. DispatcherServlet通过HandlerAdapter调用Handler的方法完成业务逻辑处理
  6. 返回一个ModelAndView对象给DispatcherServlet
  7. DispatcherServlet把获取的ModelAndView对象传给ViewResolver视图解析器,把逻辑视图解析成物理视图
  8. ViewResolver返回一个View进行视图渲染(把模型填充到视图中)
  9. DispatcherServlet把渲染后的视图响应给客户端

三、helloworld

1、开发环境

IDE : idea 2021.2

构建工具: maven3.6.3

服务器: tomcat8

Spring 版本: 5.3.1

2、创建maven工程

a>添加web模块

b>打包方式:war

c>引入依赖

pom.xml:

xml 复制代码
<?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.zhao</groupId>
    <artifactId>springMVC-rest</artifactId>
    <version>1.0-SNAPSHOT</version>
    <packaging>war</packaging>
 
    <dependencies>
        <!-- SpringMVC -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
            <version>5.3.1</version>
        </dependency>
        <!-- 日志 -->
        <dependency>
            <groupId>ch.qos.logback</groupId>
            <artifactId>logback-classic</artifactId>
            <version>1.2.3</version>
        </dependency>
        <!-- ServletAPI -->
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
            <version>3.1.0</version>
            <scope>provided</scope>
        </dependency>
        <!-- Spring5和Thymeleaf整合包 -->
        <dependency>
            <groupId>org.thymeleaf</groupId>
            <artifactId>thymeleaf-spring5</artifactId>
            <version>3.0.12.RELEASE</version>
        </dependency>
        <!--导入jackson的依赖-->
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
            <version>2.12.1</version>
        </dependency>
        <dependency>
            <groupId>commons-fileupload</groupId>
            <artifactId>commons-fileupload</artifactId>
            <version>1.3.1</version>
        </dependency>
    </dependencies>
</project>

3、配置web.xml

注册SpringMVC的前端控制器DispatcherServlet

  • a>默认配置方式

此配置作用下, SpringMVC 的配置文件默认位于 WEB-INF 下,默认名称为 -

servlet.xml ,例如,以下配置所对应 SpringMVC 的配置文件位于 WEB-INF 下,文件名为 springMVC-servlet.xm

xml 复制代码
<!-- 配置SpringMVC的前端控制器,对浏览器发送的请求统一进行处理 --> 
<servlet> 
    <servlet-name>springMVC</servlet-name> 
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> 
</servlet> 
<servlet-mapping> 
    <servlet-name>springMVC</servlet-name> 
    <!--
    设置springMVC的核心控制器所能处理的请求的请求路径 
    /所匹配的请求可以是/login或.html或.js或.css方式的请求路径 
    但是/不能匹配.jsp请求路径的请求 
    --> 
    <url-pattern>/</url-pattern> 
</servlet-mapping>
  • b>扩展配置方式

可通过 init-param 标签设置 SpringMVC 配置文件的位置和名称,通过 load-on-startup 标签设置

SpringMVC 前端控制器 DispatcherServlet 的初始化时间

xml 复制代码
<!-- 配置SpringMVC的前端控制器,对浏览器发送的请求统一进行处理 -->
<servlet>
    <servlet-name>springMVC</servlet-name> 
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <!-- 通过初始化参数指定SpringMVC配置文件的位置和名称 -->
    <init-param> 
        <!-- contextConfigLocation为固定值 --> 
        <param-name>contextConfigLocation</param-name> 
        <!-- 
            使用classpath:表示从类路径查找配置文件,
            例如maven工程中的 src/main/resources 
        --> 
        <param-value>classpath:springMVC.xml</param-value> 
    </init-param>
    <!--
        作为框架的核心组件,在启动过程中有大量的初始化操作要做 
        而这些操作放在第一次请求时才执行会严重影响访问速度 
        因此需要通过此标签将启动控制DispatcherServlet的初始化时间提前到服务器启动时 
    -->
    <load-on-startup>1</load-on-startup> 
</servlet> 
<servlet-mapping> 
    <servlet-name>springMVC</servlet-name> 
    <!--
            设置springMVC的核心控制器所能处理的请求的请求路径 
            /所匹配的请求可以是/login或.html或.js或.css方式的请求路径 
            但是/不能匹配.jsp请求路径的请求
    --> 
    <url-pattern>/</url-pattern> 
</servlet-mapping>

注:

标签中使用 / 和 /* 的区别:

  • / 所匹配的请求可以是 /login 或 .html 或 .js 或 .css 方式的请求路径,但是 / 不能匹配 .jsp 请求路径的请求
    因此就可以避免在访问 jsp 页面时,该请求被 DispatcherServlet 处理,从而找不到相应的页面
  • /* 则能够匹配所有请求,例如在使用过滤器时,若需要对所有请求进行过滤,就需要使用 /* 的写法

4、创建请求控制器

由于前端控制器对浏览器发送的请求进行了统一的处理,但是具体的请求有不同的处理过程,因此需要创建处理具体请求的类,即请求控制器

请求控制器中每一个处理请求的方法成为控制器方法

因为 SpringMVC 的控制器由一个 POJO (普通的 Java 类)担任,因此需要通过 @Controller 注解将其标识为一个控制层组件,交给Spring 的IOC 容器管理,此时 SpringMVC 才能够识别控制器的存在

java 复制代码
@Controller 
public class HelloController{ 
 
}

5、创建springMVC的配置文件

xml 复制代码
<!--自动扫描包-->
<context:component-scan base-package="com.zhao.rest"></context:component-scan>
<!-- 配置Thymeleaf视图解析器 -->
<bean id="viewResolver"
      class="org.thymeleaf.spring5.view.ThymeleafViewResolver">
    <property name="order" value="1"/>
    <property name="characterEncoding" value="UTF-8"/>
    <property name="templateEngine">
        <bean class="org.thymeleaf.spring5.SpringTemplateEngine">
            <property name="templateResolver">
                <bean class="org.thymeleaf.spring5.templateresolver.SpringResourceTemplateResolver">
                    <!-- 视图前缀 -->
                    <property name="prefix" value="/WEB-INF/templates/"/>
                    <!-- 视图后缀 -->
                    <property name="suffix" value=".html"/>
                    <property name="templateMode" value="HTML5"/>
                    <property name="characterEncoding" value="UTF-8" />
                </bean>
            </property>
        </bean>
    </property>
</bean>
<!--开放对静态资源的访问-->
<!--
    处理静态资源,
    例如html、js、css、jpg 若只设置该标签,则只能访问静态资源,
    其他请求则无法访问
    此时必须设置<mvc:annotation-driven/>解决问题
-->
<mvc:default-servlet-handler />
<!--开启注解驱动-->
<mvc:annotation-driven />

6、测试HelloWorld

a>实现对首页的访问

在请求控制器中创建处理请求的方法

java 复制代码
@Controller
public class HelloController {
    // @RequestMapping注解:处理请求和控制器方法之间的映射关系
    // @RequestMapping注解的value属性可以通过请求地址匹配请求,/表示的当前工程的上下文路径
    // localhost:8080/springMVC/
    @RequestMapping("/")
    public String index(){
        //设置视图名称
        return "index";
    }

}

b>通过超链接跳转到指定页面

在主页index.html中设置超链接

使用thymeleaf视图技术需要在HTML头部添加如下命名空间

xml 复制代码
<!DOCTYPE html> 
<html lang="en" xmlns:th="http://www.thymeleaf.org"> 
<head>
    <meta charset="UTF-8"> 
    <title>首页</title> 
</head> 
<body>
    <h1>首页</h1> 
    <a th:href="@{/hello}">HelloWorld</a>
    <br/> 
</body> 
</html>

在请求控制器中创建处理请求的方法

java 复制代码
@RequestMapping("/hello") 
public String HelloWorld() { 
    return "target"; 
}

7、总结

流程梳理

  1. DispatcherServlet接收到URL请求index,结合@RequestMapping("/index")注解把该请求交给index业务方法进行处理
  2. 执行index业务方法,控制台打印日志,并且返回"index"字符串(逻辑视图).
  3. 结合springmvc.xml中的视图解析器配置,找到目标资源:/index.jsp,即根目录下的index.jsp文件,把该JSP资源返回给客户端完成响应。
  • 浏览器发送请求,若请求地址符合前端控制器的 url-pattern ,该请求就会被前端控制器DispatcherServlet 处理。
  • 前端控制器会读取 SpringMVC 的核心配置文件,通过扫描组件找到控制器,将请求地址和控制器中@RequestMapping 注解的 value 属性值进行匹配,若匹配成功,该注解所标识的控制器方法就是处理请求的方法。
  • 处理请求的方法需要返回一个字符串类型的视图名称,该视图名称会被视图解析器解析,加上前缀和后缀组成视图的路径,通过Thymeleaf 对视图进行渲染,最终转发到视图所对应页面
相关推荐
iQM753 小时前
Spring Boot集成RBloomFilter快速入门Demo
java·spring boot·spring
茶馆大橘6 小时前
Spring Validation —— 参数校验框架
java·后端·学习·spring
除了代码啥也不会9 小时前
springboot项目发送邮件
java·spring boot·spring
ModelBulider21 小时前
一、Spring入门
java·spring
水w21 小时前
Spring一共有几种注入方式?
java·后端·spring·ioc·di·aop
咕哧普拉啦1 天前
【AIGC】ChatGPT提示词Prompt高效编写模式:结构化Prompt、提示词生成器与单样本/少样本提示
java·人工智能·spring·chatgpt·tomcat·maven·hibernate
爱上语文1 天前
Springboot 阿里云对象存储OSS
java·开发语言·spring boot·后端·spring
草莓屁屁不酸1 天前
SpringMVC
java·开发语言·后端·spring·tomcat·idea
J老熊1 天前
Spring MVC的运行流程详解
java·后端·spring·面试·架构·系统架构·mvc