当前位置: 首页 > article >正文

【SSM详细教程】-12-一篇文章了解SpringMVC

 精品专题:

01.《C语言从不挂科到高绩点》课程详细笔记

https://blog.csdn.net/yueyehuguang/category_12753294.html?spm=1001.2014.3001.5482

02. 《SpringBoot详细教程》课程详细笔记

https://blog.csdn.net/yueyehuguang/category_12789841.html?spm=1001.2014.3001.5482

03.《SpringBoot电脑商城项目》课程详细笔记

https://blog.csdn.net/yueyehuguang/category_12752883.html?spm=1001.2014.3001.5482

04.《VUE3.0 核心教程》课程详细笔记

https://blog.csdn.net/yueyehuguang/category_12769996.html?spm=1001.2014.3001.5482

================================

||     持续分享系列教程,关注一下不迷路 ||

||                视频教程:墨轩大楼               ||

================================

1. Spring Web MVC 简介

1.1. 什么是MVC

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

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

V:View,视图层,指工程中的html或jsp等页面,作用是与用户进行交互,展示数据。

C:Controller,控制层,指工程中的servlet,作用是接收请求和响应浏览器

JavaBean分为两类:

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

MVC的工作流程:

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

1.2. 什么是Spring web MVC

Spring Web MVC 是Spring框架一个非常重要的功能模块,实现了MVC结构,便于简单、快速开发MVC结构的Web程序。Spring Web MVC 提供的API封装了Web开发中常用的功能,简化了Web过程。

SpringMVC的特点:

  1. Spring 家族原生产品,与IOC 容器等基础设施无缝对接
  2. 基于原生的Servlet,通过了功能强大的前端控制器DispatcherServlet,对请求和响应进行统一处理 .
  3. 表述层各细分领域需要解决的问题全方位覆盖,提供全面解决方案
  4. 代码清新简洁,大幅度提升开发效率
  5. 内部组件化程度高,可插拔式组件即插即用,想要什么功能配置相应组件即可
  6. 性能卓著,尤其适合现代大型、超大型互联网项目要求

1.3. Spring MVC 入门

首先我们先来搭一个简单的SpringMVC应用,来研究一下它的运行原理。

》》首先基于IDEA创建一个web应用,在pom.xml中添加Springmvc的依赖

 <dependencies>
        <!-- JSTL -->
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>jstl</artifactId>
            <version>1.2</version>
        </dependency>
        <!-- JSTL实现包 -->
        <dependency>
            <groupId>org.apache.taglibs</groupId>
            <artifactId>taglibs-standard-impl</artifactId>
            <version>1.2.5</version>
        </dependency>

        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
            <version>5.2.6.RELEASE</version>
        </dependency>
        <!-- 必须添加servlet依赖 -->
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
            <version>4.0.1</version>

            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
            <version>4.0.1</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>org.junit.jupiter</groupId>
            <artifactId>junit-jupiter-api</artifactId>
            <version>${junit.version}</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.junit.jupiter</groupId>
            <artifactId>junit-jupiter-engine</artifactId>
            <version>${junit.version}</version>
            <scope>test</scope>
        </dependency>
</dependencies>

》》 配置前端控制器

前端控制器(DispactcherServlet)是用来集中处理请求的,它负责接收所有的请求,再将对应的请求转发到其他程序处理,然后再接收处理后的结果。最终将处理好的结果返回给浏览器,其实他就是一个中央处理器,每次请求都需要经过它。

前端控制器需要配置在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>dispatcherServlet</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
            <!--前端控制器将所有的请求都交给springmvc.xml 去处理-->
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:springmvc.xml</param-value>
        </init-param>
    </servlet>
    <servlet-mapping>
        <servlet-name>dispatcherServlet</servlet-name>
        <!--配置接收所有的请求-->
        <url-pattern>/</url-pattern>
    </servlet-mapping>
</web-app>

》》 创建springMVC的配置文件

SpringMVC 配置管理文件,主要用来根据不同的请求转发到对应的业务逻辑类去处理,并获取处理结果返回给前端控制器,主要配置自动扫描注解以及视图解析器,其内容如下:

<?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 https://www.springframework.org/schema/context/spring-context.xsd">

    <!--    配置注解扫描: 扫描指定包下面所有的注解-->
    <context:component-scan base-package="com.moxuan.study"></context:component-scan>
    <mvc:annotation-driven/>
    <!--    配置视图解析器-->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <!--        在/WEB-INF/view/ 目录下,寻找后缀为.jsp的文件-->
        <property name="prefix" value="/WEB-INF/view/"></property>
        <property name="suffix" value=".jsp"></property>
    </bean>

</beans>

》》编写控制器

控制器主要作用是为了可以根据不同的URL请求进行相应的业务逻辑处理,控制器类需要创建在springmvc.xml配置的Controller包扫描路径内,这样才能被容器扫描到。

package com.moxuan.study.controller;

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

@Controller
public class MainController {
    /**
     * @ReuqestMapping  用于绑定客户端请求地址
     * 下面的配置,当客户端发送http://127.0.0.1:8080/hello时会执行此hello方法
     * @return
     */
    @RequestMapping("/hello")
    public ModelAndView hello(){
        System.out.println("hello,you listen to me! 攀哥 is very 帅");
        // 创建数据模型
        ModelAndView mv = new ModelAndView();
        // 向数据模型中绑定数据,
        mv.addObject("msg","攀哥 show");
        // 设置视图名字,用于响应用户请求
        mv.setViewName("hello");
        // 由于在springmvc.xml中配置了前缀和后缀
        // 视图解析器会将数据发向/WEB-INF/view/hello.jsp中

        // 将数据返回给视图解析器
        return mv;
    }
}

》》 编写视图页面

前面一步,我们将数据发送到了/WEB-INF/view/hello.jsp中,接下来我们需要编写这个hello.jsp

<%@taglib prefix="c" uri="http://java.sun.com/jstl/core" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
 hello,攀哥真帅
    <c:forEach begin="0" end="100">
        <h2 style="color:red">${msg}</h2>
    </c:forEach>

</body>
</html>

》》 运行效果:

2. SpringMVC的运行流程:

2.1. 流程图

2.2. 流程描述

  1. 浏览器向Spring发出请求,请求交给前端控制器DispatcherServlet处理。

  1. 控制器通过HandlerMapping找到相应的Controller组件处理请求。

  1. 执行Controller组件中约定的方法处理请求,在约定的方法中调用模型组件完成业务处理,约定方法可以返回一个ModelAndView对象,封装了处理结果数据和视图名称信息。

  1. 控制器接收ModelAndView之后,调用ViewResolver组件,定位view(例如:JSP)并传递数据信息,生成相应界面结果。

2.3. SpringMVC 核心组件

前端控制器DispatcherServlet

接收请求,响应结果,相当于转发器,中央处理器。有了dispatcherServlet减少了其它组件之间的耦合度。用户请求到达前端控制器,它就相当于mvc模式中的c,dispatcherServlet是整个流程控制的中心,由它调用其它组件处理用户的请求,dispatcherServlet的存在降低了组件之间的耦合性。

处理器映射器HandlerMapping

根据请求的url查找Handler,HandlerMapping负责根据用户请求找到Handler即处理器,springmvc提供了不同的映射器实现不同的映射方式,例如:配置文件方式,实现接口方式,注解方式等。

处理器适配器HandlerAdapter

按照特定规则(HandlerAdapter要求的规则)去执行Handler通过HandlerAdapter对处理器进行执行,这是适配器模式的应用,编写Handler时按照HandlerAdapter的要求去做,这样适配器才可以去正确执行Handler通过扩展适配器可以对更多类型的处理器进行执行。

处理器Handler

Handler 是继DispatcherServlet前端控制器的后端控制器,在DispatcherServlet的控制下Handler对具体的用户请求进行处理。由于Handler涉及到具体的用户业务请求,所以一般情况需要工程师根据业务需求开发Handler。

视图解析器ViewResolver

进行视图解析,根据逻辑视图名解析成真正的视图(view)。ViewResolver负责将处理结果生成View视图,ViewResolver首先根据逻辑视图名解析成物理视图名即具体的页面地址,再生成View视图对象,最后对View进行渲染将处理结果通过页面展示给用户。 springmvc框架提供了很多的View视图类型,包括:jstl View、freemarker View、pdf View等。


http://www.kler.cn/news/365972.html

相关文章:

  • 使用frp0.61.0透传局域网的https服务到自有域名
  • uniapp renderjs页面传值
  • TDengine 签约新奥新智:写入速度提升10倍,成本降低90%
  • webView 支持全屏播放
  • 微服务网关Zuul
  • vue3父组件控制子组件表单验证及获取子组件数值方法
  • 新手做私域学会这三步,一周时间营收翻倍
  • React五官方文档总结二状态管理
  • Java 集合框架:List、Set、Map 特性、创建方式与遍历方式总结
  • flask服务通过gunicorn启动
  • 深度学习模型入门教程:从基础到应用
  • Debian及其衍生系统安装Python
  • 「AIGC」n8n AI Agent开源的工作流自动化工具
  • C++学习,标准库 <climits>
  • LLM | 论文精读 | 基于大型语言模型的自主代理综述
  • 整合全文检索引擎 Lucene 添加站内搜索子模块
  • pytorh学习笔记——cifar10(四)用VGG训练
  • 【TabBar嵌套Navigation案例-常见问题按钮-获取数据 Objective-C语言】
  • Mysql主主互备配置
  • 全球著名哲学家思想家起名大师颜廷利:爱屋及乌背后的教育意义
  • 等保测评的主要内容
  • React 前端框架概述
  • 如何预防数据打架?数据仓库如何保持指标数据一致性开发指南(持续更新)
  • 短视频矩阵系统源码开发优势,短视频矩阵系统oem部署
  • 使用铭文思路对智能合约改进
  • 嵌入式开发--STM32用HAL库硬件I2C读取MPU6050的数据