重生之我在地球当程序员-SpringMVC篇

重生之我在地球当程序员-SpringMVC篇

本篇主要讲述了SpringMVC框架的使用,以及SpringMVC相关知识点的介绍

SpringMVC 是应用web层的 基于MVC设计模式的轻量级的web框架。 对Servlet封装,支持restful风格

MVC概念和三层架构

MVC

Spring MVC中,MVC 是指「模型-视图-控制器」(Model-View-Controller)设计模式。这是一个广泛应用在现代Web应用程序中的设计模式,它将应用程序分为三个核心部分:

(1)模型(Model):负责处理业务逻辑,包括数据的存储和处理。在Spring MVC中,模型通常
使用Spring的数据访问框架(如JdbcTemplate、Hibernate等)来实现。
(2)视图(View):负责展示模型中的数据。在Spring MVC中,视图通常使用JSP
(JavaServer Pages)或者Thymeleaf等模板引擎来实现。
(3)控制器(Controller):负责接收用户的请求,调用模型进行数据处理,然后将结果传递给
视图进行展示。在Spring MVC中,控制器通常使用Spring的控制器接口(如Controller
或@RequestMapping)来实现。Spring MVC利用这些组件来简化Web应用程序的开发,提供了一种更加模块化、可测试和可维护的方式来进行Web开发。
三层架构

包括:表现层(web)、业务层(service)、持久层(dao),三层架构在我们的实际开发中使用的非常多。

三层架构中,每一层各司其职,接下来我们就说说每层都负责哪些方面:
(1)表现层(表示层,web):也就是我们常说的web层。它负责接收客户端请求,向客户端
响应结果,通常客户端使用http协议请求web 层,web 需要接收 http 请求,完成 http 响应。
表现层包括展示层和控制层:控制层负责接收请求,展示层负责结果的展示。
SpringMVC位于该层
(2)业务层:也就是我们常说的 service 层。它负责业务逻辑处理,和我们开发项目的需求息
息相关。	  spring框架: IOC提供对象, 声明式事务~ 
(3)持久层(Dao data access  object):也就是我们是常说的 dao 层。负责数据持久化,
和数据库做交互。Mybatis DButils JdbcTemplate Jdbc | Mybatis-plus | mapper 
Hibernate JPA 

SpringMVC 是 Spring Framework 中的一个重要模块,它提供了构建 Web 应用程序的全功能 MVC 框架。MVC(Model-View-Controller)是一种常用的软件设计模式,它将应用程序的输入、处理和输出分开,使得应用程序更加模块化、可重用和可维护。

核心配置

SpringMVC重点:
一个中心:根据请求路径找到对应的servlet,负责调度。
三个基本点:处理器映射器(对应着controller层的类)、处理器适配器(对应着控制类里面具体的一个方法)、视图解析器(根据适配器传的数据进行解析然后组装成视图)
导入依赖

<dependency><groupId>org.springframework</groupId><artifactId>spring-webmvc</artifactId><version>5.2.5.RELEASE</version>
</dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>5.2.5.RELEASE</version>
</dependency>

配置web.xml

<!-- 配置Spring MVC的DispatcherServlet -->
<servlet><servlet-name>springmvc1</servlet-name><servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class><!-- 指定Spring MVC的配置文件位置 springmvc.xml为位置--><init-param><param-name>contextConfigLocation</param-name><param-value>classpath:springmvc.xml</param-value></init-param>
</servlet><!-- 将Spring MVC的DispatcherServlet映射到根URL -->
<servlet-mapping><servlet-name>springmvc1</servlet-name><url-pattern>/</url-pattern>
</servlet-mapping>

springmvc1名字随意,<servlet>标签主要是定义一个servlet对应,当有请求的时候会根据路径<url-pattern>的参数进行匹配,根据名字寻找对应servlet,而servlet加载的过程中会根据<servlet-class>进行加载控制器。DispatcherServlet是SpringMVC内部封装的一个servlet类,该类是属于

配置springmvc.xml

 	<!-- 扫描指定包下的组件,将带有@Controller和@RestController注解的类注册为Spring的Bean -->
<context:component-scan base-package="com.test.controller"></context:component-scan><!-- 配置处理器映射器,用于将请求映射到控制器方法  根据请求 -->
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping"></bean><!-- 配置处理器适配器,用于将控制器方法适配到处理器映射器所需的格式 -->
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"></bean><!-- 配置视图解析器,用于解析控制器返回的视图名称 -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"><!-- 设置视图前缀,用于拼接控制器返回的视图名称 --><property name="prefix" value="/"></property><!-- 设置视图后缀,用于拼接控制器返回的视图名称 --><property name="suffix" value=".jsp"></property>
</bean>

Spring MVC 配置,用于配置 Spring MVC 的基本组件。具体说明如下:

<context:component-scan>:
指定需要扫描的基础包,Spring 会在这些包及其子包下查找带有 @Controller 和 
@RestController 注解的类,并将它们注册为 Spring 的 Bean。<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping"></bean>:
配置请求映射处理器,用于将请求映射到相应的控制器方法。 负责处理 HTTP 请求到控制器方
法的映射。换句话说,它决定了哪个 URL 应该调用哪个控制器方法。<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"></bean>:配置请求处理适配器,用于将控制器方法适配到请求映射处理器所需的格式。<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">:
配置视图解析器,用于解析控制器返回的视图名称,然后将其解析为具体的视图资源。prefix 属性:设置视图名称的前缀,通常是视图资源的基础路径。
suffix 属性:设置视图名称的后缀,通常是视图资源的文件扩展名。
SpringMVC 的主要组件:

Model(模型):
代表应用程序的数据和业务逻辑。
通常,模型是 POJO(Plain Old Java Object)或 JavaBean,包含应用程序的持久化实体和业务服务。
SpringMVC 支持多种数据绑定技术,如注解、数据绑定器等,将 HTTP 请求参数绑定到模型对象。
View(视图):
负责显示模型数据给用户。
在 SpringMVC 中,视图可以是 JSP、Thymeleaf、FreeMarker 等模板引擎,也可以是 JSON、XML 等数据格式。
SpringMVC 支持多种视图解析技术,如 JSP 视图解析器、Thymeleaf 视图解析器等。
Controller(控制器):
负责处理用户请求,调用业务逻辑,并选择合适的视图进行渲染。
在 SpringMVC 中,控制器是处理 HTTP 请求的 Java 类,通常使用 @Controller 注解进行标记。
控制器方法可以使用 @RequestMapping 注解来映射 HTTP 请求到具体的方法。
DispatcherServlet(前端控制器):
是 SpringMVC 的核心组件,负责接收所有的 HTTP 请求。
当一个请求到达时,DispatcherServlet 会根据请求的 URL 和配置的映射信息找到对应的控制器方法,并调用该方法。
控制器方法执行完毕后,DispatcherServlet 会根据返回的视图名称和配置的视图解析器找到具体的视图进行渲染。
HandlerMapping(处理器映射器):
负责根据请求的 URL 找到对应的控制器方法。
SpringMVC 提供了多种处理器映射器实现,如 SimpleUrlHandlerMapping、BeanNameUrlHandlerMapping 等。
在大多数情况下,开发人员不需要直接配置处理器映射器,因为 SpringMVC 提供了默认的处理器映射器实现。
HandlerAdapter(处理器适配器):
负责调用控制器方法,并将请求参数绑定到控制器方法的参数上。
SpringMVC 提供了多种处理器适配器实现,用于支持不同的控制器类型和方法签名。
ViewResolver(视图解析器):
负责将视图名称解析为具体的视图对象,方法会返回一个逻辑视图名,而不是一个具体的视图对象。视图解析器负责根据这个逻辑视图名来查找对应的实际视图对象。
SpringMVC 提供了多种视图解析器实现,如 InternalResourceViewResolver(用于解析 JSP 视图)、ThymeleafViewResolver(用于解析 Thymeleaf 视图)等。
Handler(处理器)
它就是我们开发中要编写的具体业务控制器。由 DispatcherServlet 把用户请求转发到 Handler。由Handler 对具体的用户请求进行处理。
Interceptor(拦截器):
在请求处理过程中提供额外的功能,如日志记录、身份验证、权限检查等。
开发人员可以自定义拦截器类,并使用 @Component 或 @Bean 注解将其注册到 Spring 容器中。
通过配置拦截器的映射路径和顺序,可以控制哪些请求需要被拦截以及拦截器的执行顺序。
ModelAndView(模型视图)
控制器处理请求后,通常会返回一个 ModelAndView 对象,Spring MVC 将会根据 ModelAndView 中的视图名称去寻找对应的视图解析器,并将模型数据传递给该视图进行渲染。模型数据(Model Data):即控制器处理方法要传递给视图的数据,通常以键值对的形式存储在 ModelAndView 中的 Model 部分。视图名称(View Name):指定要渲染的视图的逻辑名称,通常以字符串的形式存储在 ModelAndView 中的 View 部分。
数据绑定和校验:
SpringMVC 支持自动将 HTTP 请求参数绑定到控制器方法的参数上,并提供了强大的数据校验功能。
可以使用 JSR 303/JSR 380 注解(如 @NotNull、@Size 等)对请求参数进行校验,并自定义校验失败时的处理逻辑。

SpringMVC执行过程
首先由用户使用浏览器进行访问发送请求,http://localhost:8080/user/insert进行访问,
根据8080后面的/匹配对应的DispatcherServlet(前端控制器),前端控制器将请求交给处理器
映射器(HandlerMapping)进行映射路径并且返回映射结果给前端控制器(根据路径找@RequestMapping("user")的
控制器(Handler)),然后根据处理器适配器(HandlerAdapter)找到对应的方法,最后方法返回
的结果由前端控制器交给视图解析器(ViewResolver)来处理,找到对应的结果视图,渲染视图,
将结果返回给浏览器,用户看到带有数据的网页。
Tomcat免配置插件

需要在pom里面配置

 <build><plugins><plugin><groupId>org.apache.tomcat.maven</groupId><artifactId>tomcat7-maven-plugin</artifactId><version>2.2</version><configuration><!--指定编码格式--><uriEncoding>utf-8</uriEncoding><!--指定项目启动后的访问路径--><path>/</path><!--指定访问端口号--><port>8888</port></configuration></plugin></plugins></build>
POST编码问题

POST 请求的编码问题,要在web.xml文件中配置编码过滤器:

<filter><filter-name>characterEncodingFilter</filter-name><filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class><init-param><param-name>encoding</param-name><param-value>utf-8</param-value></init-param></filter><filter-mapping><filter-name>characterEncodingFilter</filter-name><url-pattern>/*</url-pattern></filter-mapping>
/*和/、@RequestMapping(“user”)和@RequestMapping(“/user”)

在中,/ 和 /* 之间的区别在于它们的匹配规则:

/:当一个Servlet被配置了 / 时,它会匹配Web应用的根路径。
例如,如果你的Servlet配置了 /,那么只有当请求的URL为根路径时(例如 http://example.com/),才会被映射到这个Servlet。
/:当一个Servlet被配置了 / 时,它会匹配以其配置的路径开头的所有URL。
例如,如果你的Servlet配置了 /*,那么所有的请求都会被映射到这个Servlet,包括根路径以及根路径下的所有子路径(例如 http://example.com/、http://example.com/foo、http://example.com/foo/bar 等)。
总的来说,/ 匹配根路径,而 /* 匹配根路径及其所有子路径。选择哪种URL模式取决于你想要的映射行为,是只希望处理根路径下的请求,还是希望处理整个Web应用的所有请求。
@RequestMapping(“/user”):这种写法表示绝对路径,即请求路径必须精确匹配 /user。
当一个请求到达时,如果请求路径为 /user,则该注解匹配成功;但如果请求路径为 /user/add 或者其他除了 /user 之外的路径,则不会匹配成功。
@RequestMapping(“user”):这种写法表示相对路径,即请求路径只需匹配末尾为 /user 的路径即可。
当一个请求到达时,如果请求路径为 /user 或者 /user/,则该注解匹配成功;而如果请求路径为 /user/add 或者其他以 /user 开头但不是完全匹配 /user 的路径,则不会匹配成功。
因此,主要区别在于绝对路径需要完全匹配指定的路径,而相对路径只需要匹配路径的末尾部分。根据具体的业务需求和路径规则,选择合适的写法来定义@RequestMapping可以更好地匹配请求。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

高亚科技签约山东亿海兰特,打造合同及项目一体化管理平台!

近日&#xff0c;中国企业管理软件资深服务商高亚科技与山东亿海兰特通信科技有限公司&#xff08;以下简称“山东亿海兰特”&#xff09;正式签约&#xff0c;依托8Manage PM业务项目管理软件&#xff0c;打造集客户、合同、项目、交付于一体的运营平台&#xff0c;提升企业全…

对文本框做字数限制

效果图 实现步骤 其中绝对布局根据需求自行调整 <!--单文本输入框--> <div class"form-group"><label class"col-sm-2 control-label is-required">面试公司&#xff1a;</label><div class"col-sm-9"><input …

前端崽的java study笔记

文章目录 basic1、sprint boot概述2、sprint boot入门3、yml 配置信息书写和获取 持续更新ing~ basic 1、sprint boot概述 sprint boot特性&#xff1a; 起步依赖&#xff08;maven坐标&#xff09;&#xff1a;解决配置繁琐的问题&#xff0c;只需要引入sprint boot起步依赖的…

对关系型数据库管理系统的介绍

1.数据库的相关介绍 关系型数据库管理系统&#xff1a;&#xff08;英文简称&#xff1a;RDBMS&#xff09; 为我们提供了一种存储数据的特定格式&#xff0c;所谓的数据格式就是表&#xff0c; 在数据库中一张表就称为是一种关系. 在关系型数据库中表由两部分组成&#xf…

大企业总部与分部组网方案

在全球化的经济环境中&#xff0c;大企业往往设有总部和多个地理分散的分部。为了确保信息的快 速流通、资源的优化配置以及管理的高效运作&#xff0c;构建一个稳定、安全且高效的组网方案显 得尤为重要。本文将探讨大企业如何通过技术手段和管理策略&#xff0c;实现总部与分…

Java练习题(一)

1、关于finally,下面哪个描述正确? &#xff08;B&#xff09; A.在catch块之前但在try块之后执行finally块 B.finally块会被执行无论是否抛出异常 C.只有在执行catch块之后才执行finally块 D.都不是 在Java的异常处理机制中&#xff0c;finally块是一个非常重要的部分&#…

学习古琴律学的好东西,帮您从基因里学古琴

《从基因里学懂古琴》是一本关于古琴律学的著作&#xff0c;作者通过基因的角度来解读古琴音乐的奥秘和美妙。古琴作为我国传统文化的瑰宝之一&#xff0c;具有悠久的历史和独特的音乐风格&#xff0c;但其律学原理一直以来都是一个谜。本书从基因的角度探讨了古琴音乐的律学特…

独立游戏《星尘异变》UE5 C++程序开发日志0——游戏介绍

一.游戏简介 《星尘异变》是一款由来自中国传媒大学的6名在校学生制作的一款星际题材模拟经营游戏&#xff0c;在游戏中&#xff0c;玩家需要扮演一个宇宙中的“神”&#xff0c;开采宇宙中分布在“星云”内部的“星尘”&#xff0c;消耗“星尘”来建造“天体”作为生产更多“…

DigitalOcean 的PostgreSQL、MySQL、Redis、Kafka托管数据库,现已支持自定义指标收集功能

近期&#xff0c;我们的几个托管数据库&#xff08;PostgreSQL、MySQL、Redis和Kafka&#xff09;引入了自定义数据指标功能&#xff08;scrapable metrics&#xff09;。这些指标使您更具体、更细致地了解数据库的性能&#xff0c;包括延迟、资源利用率和错误率。然后&#xf…

vuex的基本认知

目录 一、什么是vuex 二、vuex的应用场景 三、vuex的优势 一、什么是vuex Vuex是一个vue的状态管理工具&#xff0c;状态就是数据。 进一步解释&#xff1a;vuex是一个插件&#xff0c;可以帮助我们管理vue通用的数据&#xff08;多组件共享的数据&#xff09; 二、vuex的…

Git 分支命令操作详解

目录 1、分支的特点 2、分支常用操作 3、分支的使用 3.1、查看分支 3.2、创建分支 3.3、修改分支 3.4、切换分支 3.5、合并分支 3.6、产生冲突 3.7、解决冲突 3.8、创建分支和切换分支说明 1、分支的特点 同时并行推进多个功能开发&#xff0c;提高开发效率。各个分…

C# 在Excel中添加筛选器并执行筛选 (日期筛选、文本筛选、数字筛选)

自动筛选器是 Excel 中的一个基本但极其有用的功能&#xff0c;它可以让你根据特定的条件来自动隐藏和显示你的数据。当有大量的数据需要处理时&#xff0c;这个功能可以帮你快速找到你需要的信息&#xff0c;从未更加有效地分析和处理相关数据。 下面将介绍如何使用免费.NET …

5.14(Vue2)

1.单页应用程序是指所有功能都在一个html页面上 单页面应用程序&#xff0c;之所以开发效率高&#xff0c;性能好&#xff0c;应用体验好&#xff0c;最大的原因就是&#xff1a;页面按需更新。 2.Vue中的路由 路径和组件的映射关系 Vue中的路由插件&#xff1a;VueRouter&…

对于负载均衡算法的一些思考

碎碎念 最近在看一本关于架构的书&#xff0c;其中牵扯到分布式、自动伸缩、集群相关一定会提到负载均衡&#xff0c;随即写下这篇文章 负载均衡的基石 主要参考&#xff1a; https://www.cloudflare.com/learning/performance/what-is-load-balancing/ https://aws.amazon.c…

传感数据分析——加速度、速度与位移

传感数据分析——加速度、速度与位移 在许多科学和工程应用中&#xff0c;传感器数据的分析是一项至关重要的任务。特别是在运动、运输、结构监测等领域&#xff0c;传感器能够提供有关物体运动和变形的宝贵信息。本文将介绍如何利用Python进行传感器数据分析&#xff0c;重点…

TCP/UDP通信中的部分函数

UDP&#xff08;User Datagram Protocol&#xff0c;用户数据报协议&#xff09;和TCP&#xff08;Transmission Control Protocol&#xff0c;传输控制协议&#xff09;是互联网协议套件中最常用的两种传输层协议&#xff0c;它们负责在互联网中端到端地传输数据。尽管它们服务…

leetcode题目1

两数之和 简单 给定一个整数数组 nums 和一个整数目标值 target&#xff0c;请你在该数组中找出 和为目标值 target 的那 两个 整数&#xff0c;并返回它们的数组下标。 你可以假设每种输入只会对应一个答案。但是&#xff0c;数组中同一个元素在答案里不能重复出现。 你可以…

Laravel中使用MinIO进行文件操作及ZIP解压

Laravel中使用MinIO进行文件操作及ZIP解压指南 介绍 在本指南中&#xff0c;我们将详细介绍如何在laravel框架中操作minio&#xff0c;包含方法有&#xff1a;桶列表&#xff0c;创建桶&#xff0c;修改桶&#xff0c;上传文件&#xff0c;删除文件&#xff0c;生成直传链接&…

Linux系统编程:进程控制

1.进程创建 1.1 fork函数 fork&#xff08;&#xff09;通过复制调用进程来创建一个新进程。新进程称为子进程&#xff0c;是调用进程的精确副本 进程&#xff0c;但以下几点除外&#xff1a; 子进程有自己的PID&#xff0c;此PID与任何现有进程组的ID不匹配子进程的父进程ID…

Uncaught InternalError: too much recursion

今天在敲代码的时候偶然间发现项目因为一次操作导致浏览器变得非常卡&#xff0c;而且控制台还报错了 Uncaught InternalError: too much recursior 页面截图如下 &#xff1a; 突如起来的报错和页面异常卡顿给我整不会了ovo&#xff0c;点开报错的地方&#xff0c;直接跳转到对…