框架学习之SpringMVC学习笔记(一)

一、SpringMVC简介

1-介绍

Spring Web MVC是基于Servlet API构建的原始Web框架,从一开始就包含在Spring Framework中。正式名称“Spring Web MVC”来自其源模块的名称( spring-webmvc ),但它通常被称为“Spring MVC”。

在控制层框架历经Strust、WebWork、Strust2等诸多产品的历代更迭之后,目前业界普遍选择了SpringMVC作为Java EE项目表述层开发的首选方案。之所以能做到这一点,是因为SpringMVC具备如下显著优势:

  • Spring 家族原生产品,与IOC容器等基础设施无缝对接

  • 表述层各细分领域需要解决的问题全方位覆盖,提供全面解决方案

  • 代码清新简洁,大幅度提升开发效率

  • 内部组件化程度高,可插拔式组件即插即用,想要什么功能配置相应组件即可

  • 性能卓著,尤其适合现代大型、超大型互联网项目要求

原生的Servlet API开发代码片段 

protected void doGet(HttpServletRequest request, HttpServletResponse response) 
                                                        throws ServletException, IOException {  
    String userName = request.getParameter("userName");
    
    System.out.println("userName="+userName);
}

 基于SpringMVC开发代码片段

更加专注的进行业务逻辑的开发

@RequestMapping("/user/login")
public String login(@RequestParam("userName") String userName, Integer id){
    
    log.debug("userName="+userName);
    
    return "result";
}

 2-主要作用以及优点

1)主要作用

SSM框架构建起单体项目的技术栈需求!其中的SpringMVC负责表述层(控制层)实现简化!

SpringMVC的作用主要覆盖的是表述层,例如:

最终总结:

1.  简化前端参数接收(形参列表)
2.  简化后端数据响应(在返回值中体现)
3.  以及其他......

 2)优点

1.基于MVC架构

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

2.容易理解,上手快;使用简单。

就可以开发一个注解的SpringMVC项目,SpringMVC也是轻量级的,jar很小。不依赖的特定的接口和类。

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

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

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

3-核心组件以及调用流程理解

1)SpringMVC含义

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

  • M: Model:模型层,指工程中的JavaBean,作用是处理数据。JavaBean分为两类:实体类Bean:专门存储业务数据的,如 Student、User 等业务处理Bean:指Service或Dao对象,专门用于处理业务逻辑和数据访问。
  • V: View:视图层,指工程中的html或jsp等页面,作用是与用户进行交互,展示数据
  • C: Controller:控制层,指工程中的servlet,作用是接收请求和响应浏览器

Spring MVC与许多其他Web框架一样,是围绕前端控制器模式设计的,其中中央 `Servlet`  `DispatcherServlet` 做整体请求处理调度!

除了`DispatcherServlet`SpringMVC还会提供其他特殊的组件协作完成请求处理和响应呈现。

 2)完整流程表述:

(1)客户端发起请求:用户通过浏览器或其他客户端想服务器发起http请求

你在浏览器中,输入了一个网址,发起了一个请求

(2)请求到达前端控制器(DispatcherServlet):请求首先被DispatcherServlet接收,它是SpringMVC的前端控制器,是整个流程的起点。

请求到达了SpringMVC的 总指挥(DispatcherServlet)。

(3)处理器映射器(Handler Mapping)确定处理器: DispatcherServlet使用处理器映射器来确定请求应该由哪个控制器(Handler)处理。处理器映射器根据配置或注解找到匹配的处理器。

DispatcherServlet 找到了一个处理器(Controller)来处理你的请求。

(4)控制器处理请求:找到匹配的控制器后,控制器执行相应的方法来处理请求。这个方法可能包含业务逻辑、数据处理等。

这个处理器(Controller)执行一些操作,可能涉及到数据库查询、数据处理等。

(5)模型处理数据: 控制器可以与模型(Model)交互,进行数据处理和业务逻辑。模型通常包含应用程序的数据和业务规则。

处理器(Controller)把需要显示的数据交给了一个“视图”(View)。

(6)视图解析器(View Resolver)确定视图: 控制器处理完请求后,它返回一个逻辑视图的名称。视图解析器将逻辑视图名称解析为实际的视图(View),这可以是JSP、Thymeleaf等。

视图(View)的任务是把数据渲染成最终的页面内容。

(7)视图渲染: 视图负责将模型中的数据渲染到视图中,生成最终的响应内容。这可以是HTML、JSON等格式。 

最终,渲染好的页面通过 DispatcherServlet 返回给你的浏览器。

 (8)响应发送到客户端: 渲染后的视图作为响应发送回DispatcherServlet。

 返回 ing 。

 (9)响应返回客户端: DispatcherServlet将最终的响应返回给客户端,完成了整个请求-响应的循环。

好了 , 你在浏览器上看到了页面的内容。

3)SpringMVC涉及组件理解

DispatcherServlet : SpringMVC提供,我们需要使用web.xml配置使其生效,它是整个流程处理的核心,所有请求都经过它的处理和分发![ CEO ]

HandlerMapping : SpringMVC提供,我们需要进行IoC配置使其加入IoC容器方可生效,它内部缓存handler(controller方法)和handler访问路径数据,被DispatcherServlet调用,用于查找路径对应的handler![秘书]

HandlerAdapter : SpringMVC提供,我们需要进行IoC配置使其加入IoC容器方可生效,它可以处理请求参数和处理响应数据数据,每次dispatcherServlet都是通过handlerAdapter间接调用handler,他是handler和dispatcherServlet之间的适配器![经理]

Handler : handler又称处理器,他是Controller类内部的方法简称,是由我们自己定义,用来接收参数,向后调用业务,最终返回响应结果![打工人]

ViewResovler : SpringMVC提供,我们需要进行IoC配置使其加入IoC容器方可生效!视图解析器主要作用简化模版视图页面查找的,但是需要注意,前后端分离项目,后端只返回JSON数据,不返回页面,那就不需要视图解析器!所以,视图解析器,相对其他的组件不是必须的![财务]

 3)图解说明

 

4-问题与思考

1、什么是MVC架构,它的核心思想是什么?

MVC(模型-视图-控制器)是一种软件设计模式,将应用程序分为三个部分,分别是模型(负责处理数据和业务逻辑)、视图(负责显示用户界面)、控制器(负责处理用户输入和管理流程)。MVC的核心思想是分离关注点,使得各部分可以独立开发和维护。

2、在没有MVC之前,Web应用是如何组织和开发的?存在哪些问题?

在没有MVC之前,Web应用通常采用紧密耦合的设计,HTML、业务逻辑和数据处理混合在一起,导致难以维护和扩展。

3、为什么MVC成为一种流行的设计模式,而且在Web开发中得到广泛应用?MVC架构解决了那些方面的问题?

MVC架构的引入解决了分离关注点、提高可维护性、降低耦合度的问题。它使得开发者可以更好地组织代码,降低了变更一个部分对其他部分的影响,提高了代码的可重用性和可测试性。

4、所以什么是 SpringMVC ?

SpringMVC是Spring框架中的一个模块,用于支持基于模型-视图-控制器(MVC)设计模式的Web应用程序开发。它提供了一种结构化的方式来组织和开发Web应用,使得代码更加模块化、可维护,并且易于扩展。SpringMVC是建立在核心Spring框架之上的,因此可以很好地集成Spring的其他模块。

二、SpringMVC快速体验

1-体验场景需求

2-配置分析

1.  DispatcherServlet,在web.xml配置!设置处理所有请求!
2.  HandlerMapping,HandlerAdapter,Handler需要加入到IoC容器,供DS调用!
3.  Handler需要配置到HandlerMapping中供DS查找!

3-准备项目

1)创建项目

   springmvc-base-quick

   注意:需要转成maven/web程序!!

2)导入依赖

<properties>
    <spring.version>6.0.6</spring.version>
    <maven.compiler.source>17</maven.compiler.source>
    <maven.compiler.target>17</maven.compiler.target>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>

<dependencies>
    <!-- springioc相关依赖  -->
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-context</artifactId>
        <version>${spring.version}</version>
    </dependency>

    <!-- web相关依赖  -->
    <!-- 在 pom.xml 中引入 Jakarta EE Web API 的依赖 -->
    <!--
        在 Spring Web MVC 6 中,Servlet API 迁移到了 Jakarta EE API,因此在配置 DispatcherServlet 时需要使用
         Jakarta EE 提供的相应类库和命名空间。错误信息 “‘org.springframework.web.servlet.DispatcherServlet’
         is not assignable to ‘javax.servlet.Servlet,jakarta.servlet.Servlet’” 表明你使用了旧版本的
         Servlet API,没有更新到 Jakarta EE 规范。
    -->
    <dependency>
        <groupId>jakarta.platform</groupId>
        <artifactId>jakarta.jakartaee-web-api</artifactId>
        <version>9.1.0</version>
        <scope>provided</scope>
    </dependency>

    <!-- springwebmvc相关依赖  -->
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-webmvc</artifactId>
        <version>${spring.version}</version>
    </dependency>

</dependencies>

 3)Controller声明

@Controller
public class HelloController {

    //handlers

    /**
     * handler就是controller内部的具体方法
     * @RequestMapping("/springmvc/hello") 就是用来向handlerMapping中注册的方法注解!
     * @ResponseBody 代表向浏览器直接返回数据!
     */
    @RequestMapping("/springmvc/hello")
    @ResponseBody
    public String hello(){
        System.out.println("HelloController.hello");
        return "hello springmvc!!";
    }
}

4)SpringIoC配置

<?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">
        <!-- 扫描controller对应的包,将handler加入到ioc-->
    <context:component-scan base-package="com.atguigu.controller" />

    <!-- 方案1: 手动配置handlerMapping 和 handlerAdapter -->
    <!-- handlerMapping
         RequestMappingHandlerMapping 就是springmvc提供的组件
         支持@RequestMapping方式注册的handler
    -->
    <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping" />
    <!-- handlerAdapter
         RequestMappingHandlerAdapter 就是springmvc提供的组件
         支持@RequestMapping方式注册的handler
    -->
    <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter" />
    <!-- 方案2: 不配置
         解释: springmvc会在启动的时候,如果发现我们没有配置handlerMapping,handlerAdapter,viewResolver
         就会加载spring-webmvc包下的配置DispatcherServlet.properties下的组件!
         DispatcherServlet.properties:
           org.springframework.web.servlet.HandlerMapping=org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping,\
                org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping,\
                org.springframework.web.servlet.function.support.RouterFunctionMapping

            org.springframework.web.servlet.HandlerAdapter=org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter,\
                org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter,\
                org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter,\
                org.springframework.web.servlet.function.support.HandlerFunctionAdapter
            ........

         所以,我们可以不同写,也会默认加载! 注意: 一旦你配置了,就不会加载对应的默认组件切记!!!
    -->

     <!-- viewResolver 不需要配置,因为我们不需要查找逻辑视图!!! -->

</beans>

 5)web.xml配置

在一个MVC框架中,首要任务是有效地接收并处理请求。

为了实现这一目标,框架通常会设计一个前端控制器。

这个前端控制器位于框架的最前沿,负责接收所有进入系统的请求。

选择在Servlet或者Filter中实现这一前端控制器。

这个前端控制器的任务不仅仅是作为请求的第一站,更是核心调度管理的关键组件。

这样,它在整个MVC框架中既是前端的门卫,又是核心的调度者。

在Spring MVC中,前端控制器是由DispatcherServlet来实现的。

<?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中负责处理请求的核心Servlet,也被称为SpringMVC的前端控制器 -->
  <servlet>
    <servlet-name>DispatcherServlet</servlet-name>
    <!-- DispatcherServlet的全类名 -->
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <!-- 通过初始化参数指定SpringMVC配置文件位置 -->
    <init-param>
      <!-- 如果不记得contextConfigLocation配置项的名称,可以到DispatcherServlet的父类FrameworkServlet中查找 -->
      <param-name>contextConfigLocation</param-name>
      <!-- 使用classpath:说明这个路径从类路径的根目录开始才查找 -->
      <param-value>classpath:spring-mvc.xml</param-value>
    </init-param>
    <!-- 作为框架的核心组件,在启动过程中有大量的初始化操作要做,这些操作放在第一次请求时才执行非常不恰当 -->
    <!-- 我们应该将DispatcherServlet设置为随Web应用一起启动 -->
    <load-on-startup>1</load-on-startup>

  </servlet>

  <servlet-mapping>
    <servlet-name>DispatcherServlet</servlet-name>
    <!-- 对DispatcherServlet来说,url-pattern有两种方式配置 -->
    <!-- 方式一:配置“/”,表示匹配整个Web应用范围内所有请求。这里有一个硬性规定:不能写成“/*”。
      只有这一个地方有这个特殊要求,以后我们再配置Filter还是可以正常写“/*”。 -->
    <!-- 方式二:配置“*.扩展名”,表示匹配整个Web应用范围内部分请求 -->
    <url-pattern>/</url-pattern>
  </servlet-mapping>

</web-app>

在 SpringBoot 中传统的web.xml进行Servlet配置的方式已经不需要了。Spring Boot提供了默认的Servlet配置,并通过自动检测和配置,使得大部分情况下无需手动干预。(默认不用配置) 

4-测试成功

 5-总结

        浏览器发送请求,若请求地址符合前端控制器的url-pattern,该请求就会被前端控制器DispatcherServlet处理。前端控制器会读取SpringMVC的核心配置文件,通过扫描组件找到控制器,将请求地址和控制器中@RequestMapping注解的value属性值进行匹配,若匹配成功,该注解所标识的控制器方法就是处理请求的方法。处理请求的方法需要返回一个字符串类型的视图名称,该视图名称会被视图解析器解析,加上前缀和后缀组成视图的路径,通过Thymeleaf对视图进行渲染,最终转发到视图所对应页面

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/638191.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

中文信息期刊投稿邮箱

《中文信息》杂志是国家新闻出版总署批准的国家级刊物&#xff08;月刊&#xff09;&#xff0c;国内外公开发行&#xff0c;大十六开印刷。本刊主要反映我国中文信息处理的学术水平&#xff0c;重点刊登科技、经济、教育等领域的基础理论、科研与应用技术的学术论文&#xff0…

DSPF网络类型实验1

对R6配置 对R1配置 对R2 对R3 对R4 对R5 对R1R2R3R4R5加用户 环回处理 然后开始配置缺省 R1有两个下一跳 3&#xff0c;4&#xff0c;5同R2 然后对R1 dynamic动态 对R2 手写 把注册加上 register R3同R2处理

webgl入门-矩阵变换

矩阵变换 前言 变换有三种状态&#xff1a;平移、旋转、缩放。 当我们变换一个图形时&#xff0c;实际上就是在移动这个图形的所有顶点。 课堂目标 掌握图形变换的三种方式。可以对图像进行复合变换。 知识点 平移旋转缩放 第一章 平移 对图形的平移就是对图形所有顶点…

双向链表C++,C#,Java版,这些程序大多已经过测试,一直在用。

先C版吧&#xff0c;我最先用的是C#,后来是Java&#xff0c;后来改用C版的&#xff0c;因为现在一直在用C&#xff0c;单链 表一直没写上去&#xff0c;因为我很少用&#xff0c;用的是双链表。 执行代码例子1&#xff1a; int main() { _DList<_string> s…

手机相册怎么恢复?如何挽救误删的照片?

手机相册成为我们存储和分享照片的主要途径&#xff0c;这些照片可能代表着我们的美好回忆、重要时刻或珍贵的瞬间。然而&#xff0c;有时候我们会因为误操作或一时冲动&#xff0c;将一些珍贵的照片误删&#xff0c;并且很难找回来。手机相册怎么恢复呢&#xff1f;本文将为你…

有效的变位词

如果哈希表的键的取值范围是固定的&#xff0c;并且范围不是很大&#xff0c;则可以用数组来模拟哈希表。数组的下标和哈希表的键相对应&#xff0c;而数组的值和哈希表的值相对应。 英文小写字母只有26个&#xff0c;因此可以用一个数组来模拟哈希表。 class Solution {publi…

【软考中级 软件设计师】数据结构

数据结构是计算机科学中一个基础且重要的概念&#xff0c;它研究数据的存储结构以及在此结构上执行的各种操作。在准备软考中级-软件设计师考试时&#xff0c;掌握好数据结构部分对于通过考试至关重要。下面是一些核心知识点概览&#xff1a; 基本概念&#xff1a; 数据结构定义…

算法入门----小话算法(1)

下面就首先从一些数学问题入手。 Q1&#xff1a; 如何证明时间复杂度O(logN) < O(N) < O(NlogN) < O(N2) < O(2N) < O(N!) < O(NN)? A&#xff1a; 如果一个以整数为参数的不等式不能很容易看出不等的关系&#xff0c;那么最好用图示或者数学归纳法。 很显…

一文深度剖析 ColBERT

近年来&#xff0c;向量搜索领域经历了爆炸性增长&#xff0c;尤其是在大型语言模型&#xff08;LLMs&#xff09;问世后。学术界开始重点关注如何通过扩展训练数据、采用先进的训练方法和新的架构等方法来增强 embedding 向量模型。 在之前的文章中&#xff0c;我们已经深入探…

python文件名通常以什么结尾

python文件后缀一般有两个&#xff0c;分别是.py和.pyw。视窗用 python.exe 运行 .py&#xff0c;用 pythonw.exe 运行 .pyw 。 这纯粹是因为安装视窗版Python时&#xff0c;扩展名 .py 自动被登记为用 python.exe 运行的文件&#xff0c;而 .pyw 则被登记为用 pythonw.exe 运…

Stanford-Coursera 算法Week1 笔记

题外话&#xff1a;全文免费放心食用&#xff0c;作者在此求个 三连关注 1. Integer Multiplication&#xff08;引入&#xff09; &#xff08;很小的时候我们就学过&#xff1a;两个数字相乘的算法——将输入(两个数字)转换为输出(它们的乘积)的一组定义良好的规则&#xf…

5.23.9 TransUNet:Transformers 为医学图像分割提供强大的编码器

TransUNet&#xff0c;它兼具 Transformers 和 U-Net 的优点&#xff0c;作为医学图像分割的强大替代方案。一方面&#xff0c;Transformer 对来自卷积神经网络 (CNN) 特征图的标记化图像块进行编码&#xff0c;作为用于提取全局上下文的输入序列。另一方面&#xff0c;解码器对…

Nginx-负载均衡

Nginx 简介 Nginx概述 Nginx ("engine x")是一个高性能的HTTP和反向代理服务器特点是占有内存少&#xff0c;并发能力强&#xff0c;事实上nginx 的并发能力确实在同类型的网页服务器中表现较好&#xff0c;中国大陆使用nginx网站用户有&#xff1a;百度、京东、新浪…

若依微服务整合knife4j

在Spring Cloud的微服务架构下&#xff0c;每个微服务并不需要引入前端的ui资源&#xff0c;因此在每个微服务的Spring Boot项目下&#xff0c;引入ruoyi-common-swagger提供的starter即可。 1、在ruoyi-gateway网关模块下&#xff0c;把knife4j依赖资源引入 <!-- knife4j…

Html基础笔记

Html超文本标记语言 (HyperText Markup Language) 超文本 指的是网页中可以显示的内容(图片,超链接,视频,) 标记语言 标记–>标签(标注) 例如:买东西的时候—>商品具有标签,看到标签就知道商品的属性(价格,材质,型号等,) 标记语言就是提供了很多的标签,不同的标签…

CSS基础(第二天)

Emmet语法 快速生成HTML结构语法 1. 生成标签 直接输入标签名 按tab键即可 比如 div 然后tab 键&#xff0c; 就可以生成 <div></div> 2. 如果想要生成多个相同标签 加上 * 就可以了 比如 div*3 就可以快速生成3个div 3. 如果有父子级关系的标签&#xff0c;可以…

CGAN|生成手势图像|可控制生成

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f366; 参考文章&#xff1a;TensorFlow入门实战&#xff5c;第3周&#xff1a;天气识别&#x1f356; 原作者&#xff1a;K同学啊|接辅导、项目定制 CGAN&#xff08;条件生成对抗网络&#xf…

影视解说5.0版零基础视频课程

课程简介 现在还能做解说吗、不会写解说文案怎么解决、不会配音怎么解决、如何找到合适的素材资源、如何变现…这是很多想做解说的伙伴最关心的几大问题。比如文案&#xff0c;我们推荐一个网站&#xff0c;10分钟搞定一篇文案&#xff0c;配音可以真人配音也可以软件配音。5.…

代码随想录算法训练营第三天| 203.移除链表元素、 707.设计链表、 206.反转链表

203.移除链表元素 题目链接&#xff1a; 203.移除链表元素 文档讲解&#xff1a;代码随想录 状态&#xff1a;没做出来&#xff0c;做题的时候定义了一个cur指针跳过了目标val遍历了一遍链表&#xff0c;实际上并没有删除该删的节点。 错误代码&#xff1a; public ListNode re…

Leecode热题100---45:跳跃游戏②

题目&#xff1a; 给定一个长度为 n 的 0 索引整数数组 nums。初始位置为 nums[0]。 每个元素 nums[i] 表示从索引 i 向前跳转的最大长度。 返回到达 nums[n - 1] 的最小跳跃次数。 思路&#xff1a; 如果某一个作为 起跳点 的格子可以跳跃的距离是 3&#xff0c;那么表示后面…