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

SpringMVC(1)

Web项目:基于HTTP协议,当一个用户从浏览器上面输入URL地址之后,URL能够和我们的程序映射起来,可以让用户的请求触达到后端程序里面,并且根据程序的处理,把结果返回浏览器;

Spring MVC要进行学习的内容:

1)连接的功能:将用户浏览器和Java程序进行连接起来,也就是说访问一个url地址可以调用到我们的Spring程序,能够匹配到相应的方法,实现用户到程序的映射;

2)获取参数:用户访问的时候会带一些参数,要想办法在程序中获取到这些参数,表单文件,Header里面的参数,服务器端要获取到用户的请求参数;

3)输出数据的功能:执行了业务逻辑之后,服务器端要把程序执行的结果返回给用户前端

Spring框架是一个大的体系,SpringWebMVC只是Spring体系中的一个WEB模块,之前在去学习Spring的时候,是没有通过浏览器来访问我们的Spring程序的,而是通过Application中的main方法去执行Spring框架的,因为之前创建的是一个SpringCore项目,不是一个SpringWEBMVC项目,就不可以通过浏览器访问;

SpringWebMVC

Spring和SpringMVC诞生的历史比较久远,在他们之后才有SpringBoot

1)SpringMVC框架是基于ServletAPI和MVC设计思想构建的原始Web框架,但是从一开始就包含在Spring框架里面,Spring框架是一个大的体系,Spring MVC只是属于Spring这个体系的Web框架模块SpringMVC其实就是Spring中的一个模块,主要处理Web开发的路径映射和视图渲染,属于Spring框架中Web层开发的一部分;

2)SpringBoot脚手架是为了快速开发Spring框架而诞生的一种框架一种技术,就是为了让大家用Spring用的比较爽的一个框架,就是一个壳,核心还是开发Spring,SpringBoot是spring提供的一个快速开发工具包,让程序员能更方便、更快速的开发spring和springmvc应用,简化了配置约定了默认配置,是最后诞生的,出生比较晚,有单独创建框架的一种模式;

3)我们既可以根据Spring创建一个Spring Core项目,也是可以根据Spring创建一个Spring Web项目;

4)他的全称为Spring Web MVC是基于Servlet API构建的原始Web框架,但是他一开始就包含在Spring框架里面,是SpringBoot的一个WEB模块,Spring MVC是一个Web框架,Spring MVC是基于Servlet API进行实现的,MVC和SpringMVC的关系就类似于IOC和DI的关系;

5)我们在进行创建SpringBoot项目的时候,我们进行勾选的Spring Web选项其实就是Spring MVC框架,我们可以看到从pom.xml里面就可以看到spring-boot-starter-web

我们加上Spring Boot DevTools是为了可以完成热部署的;

1)SpringMVC是一个基于MVC设计模式思想和ServletAPI接口实现的一个web框架,同时SpringMVC又是Spring框架中的一个web模块,是随着Spring的诞生而存在的一个Web框架

2)现在市面上面的绝大多数Spring项目都是基于SpringBoot,通过自己创建的main方法启动一个Spring框架或者是SpringCore项目,而Spring的核心就是SpringMVC,所以说SpringMVC的项目是基于SpringBoot来进行更简便的开发的,我们基于Spring Boot框架添加一个Spring Web依赖,此时的项目就变成了Spring MVC项目;

3)MVC架构分层的主要作用是解耦,采用分层架构的好处,普遍接受的是系统分层有利于系统的维护,系统的扩展,就是增强系统的可维护性和可扩展性;

MVC通常是Model View Controller,它是软件工程中的一种常见的设计模式,他把软件项目分为模型,视图和控制器三个部分

1)控制器(Controller):通常是应用程序中用来处理用户交互的部分,并向数据模型层发送数据,类似于保安,验证用户合法性和用户传递参数合法性,因为模型层把结果数据传输给Controller层之后,Controller层是不可以直接把从数据库查询出的数据传输给用户的,因为浏览器看不懂,要把数据传输给服务器端的视图层;

2)模型(Model):是应用程序中用于处理应用程序数据逻辑的部分,通常模型对象负责在数据库中存储数据和拉取数据,调用数据库;

3)视图(View):是应用程序中用于处理数据显示的部分,当Controller把数据传送到视图层的时候,这里面是服务器端的视图会将数据和服务器端的模板,叫做显示层,主要是显示数据,把浏览器能够解析的html返回给客户端;

服务器端的模板:模板引擎和JSP;

4)Controller在收到模型层处理完的用户数据之后,会直接将数据发送给视图层,咱们的视图层会将数据和服务器端的模板(JSP,摸板引擎,HTML)结合,会将数据加上服务器端的模板,就比如说v-for,循环渲染之后,再把最终整合成的标签,比如说三个h1返回给客户端的视图,客户端的视图在进行拼接v-for分解之后和渲染然后展示在浏览器上面,这样就可以保证用户拿到看到的数据是经过服务器端执行和渲染之后的一个结果了

视图分为两种:一种是服务器端的视图(v-for),一种是客户端的视图(浏览器直接解析)

1)MVC是一种思想,Spring MVC是一个专门的技术实现手段框架和是对MVC思想的实现,是一种MVC模式,并继承了Servlet API的WEB框架,既然是WEB框架,那么用户在浏览器上面输入了url之后,我们的SpringMVC框架就可以进行感知用户的请求;

在application.properties写上这段代码:debug=true;

2)路由映射:就是当用户访问一个url的时候,将用户的某个请求对应到程序中的某个类的某个方法的过程中就叫做路由映射;

3)现在绝大多数的项目都是基于Spring项目的,而Spring的核心就是SpringMVC,也就是说SpringMVC框架是Spring框架的核心模块,而SpringBoot又是Spring的脚手架,因此现在市面上面的JAVA项目就等同于SpringMVC项目;

4)SpringMVC项目可以是基于SpringBoot创建,也就是创建一个SpringBoot项目,勾选上SpringWEB项目,这时就从一个普通的SpringBoot项目变成了WEB项目,就是类似于maven项目变成了Servlet项目;

5)SpringMVC项目创建:基于SpringBoot框架加上一个SpringWEB也就是SpringMVC依赖,此时项目就变成了SpringMVC项目;

一)实现程序到用户之间的映射: 

输入一个127.0.0.1:8080/Java200就可以访问这个页面

我们在Main目录下的resorces的static里面创建了一个html文件下面我们来改一下后端代码:

在浏览器上面输入:http://localhost:8080/java200这个地址就可以访问到Text.html这个页面了

1)@RequestMappering的作用就是用来注册一个URL路由,通过这个路由,就可以进行实现前端的请求和后端程序的交互了但是@RequestMappering这个注解实际可以修饰方法也是可以修饰类的@RequestMapping和@ResponseBody注解既是可以修饰类也是可以修饰方法的

 2)我们在默认情况下使用@RequestMappering会返回一个html静态界面,但是加上

@RsponseBody就会返回一个非页面的数据了,而不是返回的是一个页面地址

3)当我们使用@RequestBody来进行修饰一个类的时候,这就表示当前类中的所有方法会返回一个非页面的数据

4)同样我们还可以进行指定发送请求的类型:

@RequestMappping的参数扩展只是支持某种类型的请求方式比如说POST类型的请求方式

@RequestMapping(value="/Java200",method= RequestMethod.GET)
如果说我们在Postman上面发送了一个POST请求,就会出现405的报错信息
Controller
public class UserController {@RequestMapping(value="/Java",method=RequestMethod.GET)@ResponseBodypublic String start(String name){return name+"要你管";}
}

5)@RequestMappering在不进行指定任何参数的情况下,只进行设置路由地址,那么此方法是即支持GET请求又是支持POST请求的,但是当我们给@RequestMapping设置了Method属性之后,那么它只能支持设置的请求类型,其他类型时会报错的(405)

6)我们可以通过更详细的注解比如说@GetMapping(指定路由地址)和@PostMapping(指定路由地址)来进行决定访问那一个方法;

为什么RequestMapping默认情况下会返回一个静态页面呢?

这还是历史的原因,因为SpringMVC是和Spring一起创建起来的,Spring,2002年创建的,20年前开发是前后端部分里的时间段,JAVA程序员既要写后端代码也要写前端的一个页面,模板引擎用的非常多,返回的一定是静态页面,但是在今天,格局已经变了,我们是可以返回一个数据了,@ResponseBody返回的是一个非静态页面的数据了;

1)@RequestMapping:支持任意一种请求类型(get/post),既能修饰方法又是可以修饰类的

2)@GetMapping:只是支持get方式的请求(不能修饰类)

3)@PostMapping:只是支持post方式的请求(不能修饰类)

下面的这两种方法只能修饰方法,是不可以进行修饰类的

1)SpringBoot热加载进行配置,每一次修改Idea代码的时候不需要进行重启运行,每一次我进行修改源代码的时候,都会实时编译.class文件,会自动重启SpringBoot项目:

2)可能我们修改JAVA代码的时候,可能不能实时的生成target目录,热部署会自动的获取到修改代码事件,然后热部署会自动的重启程序,我们需要做的事情只是需要等一会,还要添加框架支持,新项目直接勾选,老项目直接generate;

3)IDEA热部署也就是热加载:会自动的帮助开发者重启IEAD,重启SpringBoot项目,为了达到修改代码之后能够实时的看到新效果的目的;

 

1)在SpringBoot项目的POM.XML里面引入Spring dev-Tools框架,引入框架,检测当前项目有没有修改原代码

2)在Setting里面开启项目自动编译,众所周知咱们的Idea是由两个Settings,一个就是叫做Settings,一个就是叫做new ProjectSettings,一个是针对当前项目,一个是针对以后new出来的新项目

打开settings,点击Bulid里面的Compiler进行选中

3)点击选择按钮:Build project automatically,选中项目自动编译,开启项目自动编译

 

开启程序运行的热部署:

4)点击全局搜索,按两下shift就可以了,然后在搜索框里面进行搜索reg,得到选项Registry,然后进行双击下面这个东西,就可以了

compiler.automake.allow.when.app.running

 

有一个value属性进行选中

5)点击程序运行debug按钮就可以开启热部署,注意一定不要点击Restore Defaults,这是默认恢复原来的默认选项,我们在这里直接就进行点击close就可以了

获取用户传递过来的参数

1)传递单个参数,我们在SpingMVC里面可以直接通过方法中的参数来实现传参

1)我们通过前端传递的querystring参数Key必须要和后端的方法里面的参数保持一致,否则是不能正常地进行获取到参数的;

2)我们要尽量使用包装类来进行接收前端传递过来的参数,包装类因为是可以接受null值的,如果使用普通数据类型(int),前端没有传递这个id参数,那么后端接收id不到参数,就说明程序会出错,程序会报一个500的错误异常,但是使用包装类就可以解决这个问题Integer直接接受为空,这样可以更好地定位问题;

3)上面地址的URL是可以进行调换位置的,表单传参和直接输入url是一样的;

4)当有多个参数的时候,前后端进行参数匹配的时候,是以参数的名称进行匹配的,因此参数的位置是不会影响到后端获取参数的结果;

5)但是如果说我们前端传递过来的参数实在是太多了,难道我要在方法里面写成百上千个参数吗,这显然是很不现实的,工作量极大,效率极低修改成本也是特别高的,所以我们要使用对象的方式来进行接收,美观性和可维护性都是特别差的,但是我们使用一个类来接收,这是如果URL参数变化了,我们只需要修改类中的属性就可以了,SpringBoot不光会自动给你设置返回的字符编码,接收参数爷会根据参数来匹配,如果你接受的是一个对象,那么会将URl中的queryString中的值自动填充到对象里面,就是按照属性名和前端传递名字相等的进行赋值;

6)下面的路由要变成小写;

7)SpringBoot或者是SpringMVC项目会自动根据你返回的数据来决定你返回的类型是什么以及字符编码格式,ContentType和ContentEncoding是由我们的框架设置的;

2)根据对象来进行接收

1)我们在浏览器上面输入一个这样的地址:
localhost:8080/Java100/GetUser?username=%E6%9D%8E%E4%BD%B3%E4%BC%9F&password=12503487&ClassID=1&UserID=9
此时返回的就是一个JSON的数据(会自动设置ContentType)
会自动的给对象的属性填充数据,会自动的检查返回的数据

2)设置返回的对象的类一定要加上Getter和Setter方法
 

1.我们先进行创建一个User类,来进行接收前端的参数
注意这里面的User类一定要写上Getter和Setter方法:
@Setter
@Getter
public class User {public String username;public String password;public int ClassID;public int UserID;
}
2.我们再写出UserController里面的代码:
@Controller
@RequestMapping("/Java100")
@ResponseBody
public class UserController {@RequestMapping("/GetUser")public User start(User user){return user;}
}

 注意:接受方法的参数一定要和前端传递的参数名字保持一致否则就获取不到参数的值了

后端参数重命名:

1)在某一些情况下,前端传递过来的参数Key和我们后端接收过来的Key是不一致的,比如说前端传递了一个time给后端,而后端有时使用createtime字段来进行接收的,这样就会出现参数接收不到的情况,如果出现了这种情况,我们就可以使用@RequestParam来进行重命名前后端的参数值;

2)但是如果说进行全部替换的方式有很麻烦因为这里面的后端参数createtime的参数太多了

@Controller
@ResponseBody
public class UserController {@RequestMapping("/Java100")public Object start(@RequestParam("name") String username)//接受前端的对象{return "name"+username;}
我们可以直接进行访问:http://localhost:8080/Java100?name=128.1

1)出现这种情况是很少的:@RequestParam("time"),这个注解的作用就是把前端为time的key赋值给后端的createtime变量;

2)除此之外,它既可以进行重命名请求,又能保证此参数是必传参数,如果说你使用了这个注解之后@RequestParam注解之后,我们在这里填的参数必须是必填的,required属性默认是true,如果前端没有传这个参数,程序就会出现报错;

@Controller
@ResponseBody
public class UserController {@RequestMapping("/Java100")public Object start(@RequestParam(value="name",required = false) String username)//接受前端的对象{return "name"+username;}
}

3)@RequestParam中的参数required=false,这就表示当前的参数非必传参数,如果我们不进行设置此属性,那么它的默认值是true,就表示此参数是必传项,属性在对象里面就不可以实现重命名了,后端在数据库里面(MYBATIS)-----也可以实现重命名

@RequestParam的注意事项:

如果说我们在参数中添加@RequestParam注解,那么前端一定要传递此参数,否则就会报错,如果说想要解决这个问题,那么就需要在@RequestParam里面添加required=false

 

相关文章:

SpringMVC(1)

Web项目:基于HTTP协议,当一个用户从浏览器上面输入URL地址之后,URL能够和我们的程序映射起来,可以让用户的请求触达到后端程序里面,并且根据程序的处理,把结果返回浏览器; Spring MVC要进行学习的内容: 1)连…...

珠海先达MES系统六大功能解决电子组装行业可视化问题

电子组装行业的发展背景: 在日益激烈的市场环境中,降低成本,加快交付周期,提高产品质量已经成为了制造业发展的重要目标。企业关注的是产品的生产周期,客户关注的是产品的质量。如何在企业和消费者达成平衡&#xff0c…...

获取本机的IP地址,看似简单的获取,实则蕴含非常多的操作

这篇文章讲述了PowerJob获取本地IP离奇曲折的经过,以及开放了诸多的可配置参数,打开了我新世界的大窗户。求个关注,求个点赞,求一个评论。 获取地址的操作,本来不应该作为什么重点,但是因为一点小小的意外&…...

【SSM】篇一:初试Spring--Ioc与Bean

文章目录1、Spring2、SpringFramework系统架构3、BeanBean的配置Bean的实例化Bean的生命周期4、依赖注入DIsetter注入和构造器注入依赖自动装配5、集合注入1、Spring Spring地址:https://spring.io Spring技术的优点: Spring家族(Spring全家…...

华为OD机试真题Python实现【出租车计费】真题+解题思路+代码(20222023)

🔥系列专栏 华为OD机试(Python)真题目录汇总华为OD机试(JAVA)真题目录汇总华为OD机试(C++)真题目录汇总华为OD机试(JavaScript)真题目录汇总文章目录 🔥系列专栏题目输入输出示例一输入输出说明示例二输入输出说明...

Elasticsearch:如何修改 nested 字段的值

Nested 类型是 object 数据类型的特殊版本,它允许对象数组以一种可以彼此独立查询的方式进行索引。在内部,嵌套对象将数组中的每个对象索引为单独的隐藏文档,这意味着每个嵌套对象都可以使用 nested query 独立于其他对象进行查询。每个 nest…...

【JAVA】jdk8 Stream 排序精通

背景 jdk8的stream流能方便的排序,但是每次都要查资料,非常不方便,不确定,所以这次直接弄懂,不再迷茫。 转载请注明来源,创作不易,请多多支持。 基础排序 stream流 大家应该都比较熟悉了&…...

python的opencv操作记录12——Canny算子使用

文章目录Canny算子非极大值抑制非极大值抑制中的插值滞后阈值实际应用直接使用Canny算子使用膨胀先阈值分割Canny算子 上一篇说到,我在一个小项目里需要在一幅图像中提取一根试管里的两种液体的截面。为了达到这个目的使用传统图像里的区域分割技术,实际…...

Spark on hive Hive on spark

文章目录Spark on hive & Hive on sparkHive 架构与基本原理Spark on hiveHive on sparkSpark on hive & Hive on spark Hive 架构与基本原理 Hive 的核心部件主要是 User Interface(1)和 Driver(3)。而不论是元数据库&a…...

【MySQL】子查询

这里写自定义目录标题子查询1、子查询的基本使用2、 单行子查询2.1、单行比较查询2.2、HAVING 中的子查询2.3、CASE中的子查询3、多行子查询4、相关子查询5、EXISTS 与 NOT EXISTS关键字子查询 子查询指一个查询语句嵌套在另一个查询语句内部的查询,这个特性从MySQ…...

Day889.MySQL高可用 -MySQL实战

MySQL高可用 Hi,我是阿昌,今天学习记录的是关于MySQL高可用的内容。 正常情况下,只要主库执行更新生成的所有 binlog,都可以传到备库并被正确地执行,备库就能达到跟主库一致的状态,这就是最终一致性。但是…...

剑指 Offer 24. 反转链表

⭐简单说两句⭐ CSDN个人主页:后端小知识 🔎GZH:后端小知识 🎉欢迎关注🔎点赞👍收藏⭐️留言📝 题目: 剑指 Offer 24. 反转链表 ,我们今天还是来看一道easy的题目吧&…...

“黑铁时代”,地产人如何以客户视角加速房企数字化转型

本文从行业洞察、业务设计、数据建设以及实践探索四个部分详细阐述地产行业数字化的实践、思考和理解。点击文末“阅读原文”,观看完整版直播回放并下载演讲文档。一、洞察:房企经营思路的变化企业的转型都是围绕着业务经营变化进行的,房企数…...

零入门kubernetes网络实战-14->基于veth pair、namespace以及路由技术,实现跨主机命名空间之间的通信测试案例

《零入门kubernetes网络实战》视频专栏地址 https://www.ixigua.com/7193641905282875942 本篇文章视频地址(稍后上传) 本篇文章继续提供测试案例: 基于veth pair、namespace以及路由技术,实现跨主机命名空间之间的通信 1、网络拓扑如下 2、网络拓扑构建…...

【pytorch框架】对模型知识的基本了解

文章目录TensorBoard的使用1、TensorBoard启动:2、使用TensorBoard查看一张图片3、transforms的使用pytorch框架基础知识1 nn.module的使用2 nn.conv2d的使用3、池化(MaxPool2d)4 非线性激活5 线性层6 Sequential的使用7 损失函数与反向传播8 优化器9 对现有网络的使…...

SUP桨板电动气泵方案——鼎盛合方案

SUP桨板是现时最热门的水上运动之一,它的全称是Stand Up Paddle,简称SUP。这项运动近几年在我国三亚等地区风靡一时,在网上经常看到一些运动博主或者明星网红晒出冲浪视频,刺激又惊险。SUP桨板为充气式桨板,需要通过充…...

小白系列Vite-Vue3-TypeScript:011-登录界面搭建及动态路由配置

前面几篇文章我们介绍的都是ViteVue3TypeScript项目中环境相关的配置,接下来我们开始进入系统搭建部分。本篇我们来介绍登录界面搭建及动态路由配置,大家一起撸起来......搭建登录界面登陆接口api项目登陆接口是通过mockjs前端来模拟的模拟服务接口Login…...

C语言( 缓冲区和重定向)

一.缓冲输入,无缓存输入 while((chgetchar()) ! #) putchar(ch); 这里getchar(),putchar()每次只处理一个字符(这里只是知道就好了),而我们使用while循环,当读到#字符时停止 而看到输出例子,第一行我们输入…...

编程思想、方法论和架构的类型及应用

概要编程思想是指在编写代码时所采用的基本思维方式和方法论。分类编程思想编程思想为软件开发提供了思维范式和指导思路,例如面向对象思想、函数式编程思想等,它们帮助程序员更好地抽象问题、组织代码、提高代码复用性和可维护性,包括一下几…...

【OA办公】OA流程审批大揭秘,带你看遍所有基础流程

流程审批,是所有企业的OA办公系统重要组成部分,是任何OA办公系统都不可缺少的。比起传统的纸张传阅、签批的审批模式浪费了大量的时间和成本,因此越来越多的企业采用OA这种全新的、高效的、智能的审批模式。流程审批除了这些好处,…...

基于ASP.NET+ SQL Server实现(Web)医院信息管理系统

医院信息管理系统 1. 课程设计内容 在 visual studio 2017 平台上,开发一个“医院信息管理系统”Web 程序。 2. 课程设计目的 综合运用 c#.net 知识,在 vs 2017 平台上,进行 ASP.NET 应用程序和简易网站的开发;初步熟悉开发一…...

java 实现excel文件转pdf | 无水印 | 无限制

文章目录 目录 文章目录 前言 1.项目远程仓库配置 2.pom文件引入相关依赖 3.代码破解 二、Excel转PDF 1.代码实现 2.Aspose.License.xml 授权文件 总结 前言 java处理excel转pdf一直没找到什么好用的免费jar包工具,自己手写的难度,恐怕高级程序员花费一年的事件,也…...

DIY|Mac 搭建 ESP-IDF 开发环境及编译小智 AI

前一阵子在百度 AI 开发者大会上,看到基于小智 AI DIY 玩具的演示,感觉有点意思,想着自己也来试试。 如果只是想烧录现成的固件,乐鑫官方除了提供了 Windows 版本的 Flash 下载工具 之外,还提供了基于网页版的 ESP LA…...

【单片机期末】单片机系统设计

主要内容:系统状态机,系统时基,系统需求分析,系统构建,系统状态流图 一、题目要求 二、绘制系统状态流图 题目:根据上述描述绘制系统状态流图,注明状态转移条件及方向。 三、利用定时器产生时…...

AspectJ 在 Android 中的完整使用指南

一、环境配置(Gradle 7.0 适配) 1. 项目级 build.gradle // 注意:沪江插件已停更,推荐官方兼容方案 buildscript {dependencies {classpath org.aspectj:aspectjtools:1.9.9.1 // AspectJ 工具} } 2. 模块级 build.gradle plu…...

HDFS分布式存储 zookeeper

hadoop介绍 狭义上hadoop是指apache的一款开源软件 用java语言实现开源框架,允许使用简单的变成模型跨计算机对大型集群进行分布式处理(1.海量的数据存储 2.海量数据的计算)Hadoop核心组件 hdfs(分布式文件存储系统)&a…...

免费PDF转图片工具

免费PDF转图片工具 一款简单易用的PDF转图片工具,可以将PDF文件快速转换为高质量PNG图片。无需安装复杂的软件,也不需要在线上传文件,保护您的隐私。 工具截图 主要特点 🚀 快速转换:本地转换,无需等待上…...

2025年渗透测试面试题总结-腾讯[实习]科恩实验室-安全工程师(题目+回答)

安全领域各种资源,学习文档,以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各种好玩的项目及好用的工具,欢迎关注。 目录 腾讯[实习]科恩实验室-安全工程师 一、网络与协议 1. TCP三次握手 2. SYN扫描原理 3. HTTPS证书机制 二…...

CSS | transition 和 transform的用处和区别

省流总结: transform用于变换/变形,transition是动画控制器 transform 用来对元素进行变形,常见的操作如下,它是立即生效的样式变形属性。 旋转 rotate(角度deg)、平移 translateX(像素px)、缩放 scale(倍数)、倾斜 skewX(角度…...

LabVIEW双光子成像系统技术

双光子成像技术的核心特性 双光子成像通过双低能量光子协同激发机制,展现出显著的技术优势: 深层组织穿透能力:适用于活体组织深度成像 高分辨率观测性能:满足微观结构的精细研究需求 低光毒性特点:减少对样本的损伤…...