Spring MVC程序开发(三大功能)
文章目录
- 一、什么是Spring MVC?
- 1.MVC定义
- 2.MVC与Spring MVC的关系
- 3.创建方式
- 二、Spring MVC的核心功能
- 1.连接功能
- 浏览器获取前端接口和后端程序连接功能实现
- get和post的区别
- Spring Boot热部署
- 2.获取参数
- (1)传递单个参数
- (2)传递对象
- (3)后端重命名:@RequestParam
- (4)接收JSON对象:@RequestBody
- (5)获取URL中的参数:@PathVariable
- (6)上传文件:@RequestPart
- (7)获取Cookie:@CookieValue
- (8)获取header:@RequestHeader
- (9)设置和获取Session:@SessionAttribute
- 3.输出数据
- (1)返回静态页面
- (2)返回text/html
- (3)返回JSON对象
- (4)请求转发或请求重定向
一、什么是Spring MVC?
(1)构建在Servlet(API)之上的。
(2)是一个Web框架(HTTP)
(3)来自于Spring webMVC模块。
需要掌握:
(1)连接的功能:将用户(浏览器)和Java程序连接起来。
(2)获取参数的功能:用户访问的时候会带一些参数,在程序中要想办法获取参数。
(3)输出数据的功能:要把程序执行的结果返回给用户。
1.MVC定义
Model(模型)是应用程序中用于处理应用程序逻辑的部分。通常模型对象负责在数据库中取数据。
View(视图)是应用程序中处理数据显示的部分。通常视图是依据模型数据创建的。
Controller(控制器)是应用程序中处理用户交互的部分。通常控制器负责从视图读取数据,控制用户输入,并向模型发送数据。
2.MVC与Spring MVC的关系
MVC是一种思想,而Spring MVC是对MVC思想的具体实现。
3.创建方式
(1)使用Maven方式创建Spring MVC(已过时)。
(2)使用Spring Boot添加Spring Web模块(Spring MVC)。
[和SpringBoot创建方式一样。]勾选的Spring Web框架其实就是Spring MVC框架。
(https://blog.csdn.net/qq_45283185/article/details/129388891?spm=1001.2014.3001.5501)
二、Spring MVC的核心功能
1.连接功能
浏览器获取前端接口和后端程序连接功能实现
@RequestMapping(“/xxx”)既能修饰类又能修饰方法。
性能:及支持GET方式的请求又支持POST方式的请求。
方式一:@RequestMapping(value = "/xxx",method = RequestMethod.POST)方式二:@PostMapping("/xxx")@GetMapping("/xxx")
get和post的区别
相同:
get请求和post请求底层都是基于TCP/IP协议实现的,两者都可以实现客户端与服务端的双向交互。
不同:
get和post最本质的区别是“约定和规范”上的区别,在规范中,定义get请求是用来获取资源的,也就是进行查询操作的,而post请求是用来传输实体对象的,因此会使用post来进行添加、修改和删除等操作。按照约定来说,get和post的参数传递也是不同的,get请求时将参数拼加到url上进行参数传递的,而post是将请求参数写入到请求body中传递的。
Spring Boot热部署
idea社区版(2021.2)部署:
(1)添加热部署框架;
(2)设置settings和new projects setup。
(3)开启运行中热部署。
settings和new projects setup都需要勾选。
idea专业版部署:
(1)引入devtools框架;
(2)在运行那块通过启动文件进行配置。
2.获取参数
(1)传递单个参数
//@RequestMapping(value = "/hi",method = RequestMethod.POST)//@PostMapping("/hi")@GetMapping("/hi")public String sayHi(String name) {return "hello,"+name;}
注:在Spring Boot(Spring MVC)中传参一定要传包装类型
,而非基础类型。
(2)传递对象
可以通过对象传递多个参数。
@GetMapping("/user")public String showUser(User user) {return user.toString();}
(3)后端重命名:@RequestParam
required表示该参数可以为空,默认为true。
@GetMapping("/time")public String showTime(@RequestParam(value = "t",required = false) String startTime,@RequestParam("t2") String endTime) {return "开始时间:"+startTime + " | 结束时间:"+endTime;}
(4)接收JSON对象:@RequestBody
@PostMapping("/json-user")public String showJSONUser(@RequestBody User user) {return user.toString();}
(5)获取URL中的参数:@PathVariable
@RequestMapping("/login/{username}/{password}")public String showURL(@PathVariable("username") String username,@PathVariable("password") String password) {return username+":"+password;}
(6)上传文件:@RequestPart
固定文件保存路径:
//上传文件@RequestMapping("/upfile")public String upFile(@RequestPart("myfile")MultipartFile file) throws IOException {String path = "D:\\Picture\\img.png";//保存文件file.transferTo(new File(path));return path;}
可变的文件保存名:
@RequestMapping("/myupfile")public String myUpFile(@RequestPart("myfile")MultipartFile file) {//根目录+唯一文件名+文件后缀String path = "D:\\Picture\\";path += UUID.randomUUID().toString().replace("-","");path += file.getOriginalFilename().substring(file.getOriginalFilename().lastIndexOf("."));return path;}
使用PostMan构造发送请求。
(7)获取Cookie:@CookieValue
方式一:通过之前的servlet获取(获取的是所有Cookie)
//获取Cookie@RequestMapping("/getck")public String getCookie(HttpServletRequest req) {//servlet的方式是得到所有的cookieCookie[] cookies = req.getCookies();for (Cookie cookie : cookies) {log.error(cookie.getName()+":"+cookie.getValue());}return "get cookie";}
方式二:通过@CookieValue可以获取单个参数
//可以获得单个Cookie@RequestMapping("/getck2")public String getCookie2(@CookieValue("zhangsan") String value) {return "Cookie value:"+value;}
(8)获取header:@RequestHeader
//获取header@RequestMapping("/getua")public String getUA(@RequestHeader("User-Agent") String userAgent) {return userAgent;}
(9)设置和获取Session:@SessionAttribute
方式一:servlet方式
//设置和获取session@RequestMapping("/setsess")public String setSession(HttpServletRequest request) {HttpSession session = request.getSession();session.setAttribute("userinfo","userinfo");return "Set Session Success";}@RequestMapping("/getsess")public String getSession(HttpServletRequest request) {HttpSession session = request.getSession(false);if (session!=null && session.getAttribute("userinfo")!=null) {return (String)session.getAttribute("userinfo");} else {return "暂无 session 信息";}}
方式二:@SessionAttribute
@RequestMapping("/getsess2")public String getSession2(@SessionAttribute(value = "userinfo",required = false)String userinfo) {return userinfo;}
3.输出数据
(1)返回静态页面
不需要加@ResponseBody
@Controller
public class SendController {@RequestMapping("/index")public String getIndex() {return "/index.html";}
}
(2)返回text/html
@ResponseBody
(3)返回JSON对象
@RequestMapping("/json")public HashMap<String,String> jsonBean() {HashMap<String,String> map = new HashMap<>();map.put("java","new");map.put("mysql","数据库");map.put("cpp","++");return map;}
通过fiddler抓包:
(4)请求转发或请求重定向
//请求重定向@RequestMapping("/index1")public String index1() {return "redirect:/index.html";}//请求转发@RequestMapping("/index2")public String index2() {return "forward:/index.html";}
forward(请求转发),redirect(请求重定向)
区别:
1.请求重定向将请求重新定位到资源;请求转发服务器端转发。
2.请求重定向地址发生变化,请求转发地址不发生变化。
3.请求重定向与直接访问新地址效果一致,不存在原来的外部资源不能访问;请求转发服务器端转发有可能造成原外部资源不能访问。
相关文章:

Spring MVC程序开发(三大功能)
文章目录一、什么是Spring MVC?1.MVC定义2.MVC与Spring MVC的关系3.创建方式二、Spring MVC的核心功能1.连接功能浏览器获取前端接口和后端程序连接功能实现get和post的区别Spring Boot热部署2.获取参数(1)传递单个参数(2)传递对…...

stack,queue
stack,queuestack的介绍和使用介绍使用模拟实现queue的介绍和使用介绍使用模拟实现priority_queue的介绍和使用介绍使用模拟实现容器适配器概念标准库中stack,queue的底层结构介绍deque原理缺陷deque作为stack,queue底层默认容器stack的介绍和使用 介绍 stack是适…...

shiro反序列化
shiro550反序列化 | 清风的博客这个看着更舒服点 环境搭建 JDK:1.7 Tomcat:8.5.83 shiro源码:下载地址:https://codeload.github.com/apache/shiro/zip/shiro-root-1.2.4 shiro war包:下载地址SHIRO-550/samples-…...
【GoF 23 概念理解】IoC/DI(控制反转/依赖注入)
搞清楚以下几个问题你就明白什么是 IoC/DI 了: 参与者都有谁?依赖:谁依赖于谁?为什么要依赖?注入:谁注入于谁?到底注入什么?控制反转:谁控制谁?控制什么&…...

stm32外设-GPIO
0. 写在最前 本栏目笔记都是基于stm32F10x 1. GPIO基本介绍 GPIO—general purpose intput output 是通用输入输出端口的简称,简单来说就是软件可控制的引脚, STM32芯片的GPIO引脚与外部设备连接起来,从而实现与外部通讯、控制以及数据采集的…...

AfxMessageBox 自定义封装
一般情况下AfxMessageBox是系统提供的一个对话框,若要做这种效果的,必须重写。 实例1: void test_SgxMemDialog_AutoSize() { //使用给定大小的对话框 CSgxMemDialog dlg(180, 60); dlg.SetWindowTitle(_T(" SegeX - CT&qu…...

登入vCenter显示503,证书过期解决办法
登入vCenter显示503 原因:当安全令牌服务 (STS) 证书已过期时,会出现这些问题。这会导致内部服务和解决方案用户无法获取有效令牌,从而导致无法按预期运行(证书两年后就会过期)。 解决办法&…...

设计模式(十九)----行为型模式之命令模式
1、概述 日常生活中,我们出去吃饭都会遇到下面的场景。 定义: 将一个请求封装为一个对象,使发出请求的责任和执行请求的责任分割开。这样两者之间通过命令对象进行沟通,这样方便将命令对象进行存储、传递、调用、增加与管理。命…...

【数据库】数据库基础架构
数据库架构 数据库对于后端程序员来说是每天都需要打交道的系统,因此了解并掌握MySQL底层原理是必须的。 基础架构图 MySQL内部分为两层,一个是Server层,另一个是存储引擎层,而我们常用的就是MyISAM、InnoDB,主要负…...
English Learning - L2 语音作业打卡 双元音 [ɔɪ] [ɪə] Day16 2023.3.8 周三
English Learning - L2 语音作业打卡 双元音 [ɔɪ] [ɪə] Day16 2023.3.8 周三💌发音小贴士:💌当日目标音发音规则/技巧:🍭 Part 1【热身练习】🍭 Part2【练习内容】🍭【练习感受】🍓元音 [ɔ…...

C++语法规则4(C++面向对象)
接口(抽象类) 接口描述了类的行为和功能,而不需要完成类的特定实现。C 接口是使用抽象类来实现的,抽象类与数据抽象互不混淆,数据抽象是一个把实现细节与相关的数据分离开的概念。 如果类中至少有一个函数被声明为纯虚…...

【Spring 深入学习】AOP的前世今生之后续
AOP的前世今生之后续 1. 概述 上篇文章【Spring 深入学习】AOP的前世今生之代理模式我们讲述了代理模式。而我们今天的主人公AOP就是基于代理模式实现的,所以我们今天会简单学习下AOP 2. 什么是AOP 是面向切面编程,一般可以帮助我们在不修改现有代码的情…...

软考高项——配置管理
配置管理配置管理配置管理6个主要活动配置项配置基线配置项的状态配置库配置库权限管理配置审计配置管理 配置管理的总线索包括: 1)配置管理6个主要活动 2)配置项 3)配置基线 4)配置项的状态 5)配置库 6&a…...
网站SEO优化,网站TDK三大标签SEO优化,LOGO SEO优化
SEO(Search Engine Optimization)汉译为搜索引擎优化,是一种利用搜索引擎的规则提高网站在有关搜索 引擎内自然排名的方式。 SEO 的目的是对网站进行深度的优化,从而帮助网站获取免费的流量,进而在搜索引擎上提升网站的…...
select查询语句
worker表的字段有id, d_id, name, sex, birthday, salary, address 编号,部门号,姓名,性别,出生日期,工资,家庭住址 department表的字段有d_id, d_name, function, address 部门号,部门名,部门职能,部门位置 (1)查询worker表的所有记录(用*表示)。 select * fro…...

没有对象感,沟通太费劲
沟通中最重要的感觉:对象感! 要沟通的是谁?以啥方式最好? 趣讲大白话:蹲着跟小孩说话 【趣讲信息科技100期】 ******************************* 对象感是沟通者必须训练和提升的 是换位思考的一种能力 以便跟沟通对象进…...

智能优化算法之遗传算法
该算法已被很多篇文章讲解,本文将会去除很多较简单的内容,挑选认为重点核心部分进行讲述,内容中有属于信息的收集整理部分,也有属于自己理解的部分。 1、遗传算法概述 遗传算法是一类借鉴生物界的进化规律演化而来的随机化搜索方…...

【rabbitmq 实现延迟消息-插件版本安装(docker环境)】
一:插件简介 在rabbitmq 3.5.7及以上的版本提供了一个插件(rabbitmq-delayed-message-exchange)来实现延迟队列功能。同时插件依赖Erlang/OPT 18.0及以上。 二:插件安装 1:选择适合自己安装mq 版本的插件࿱…...
【大数据】HDFS管理员 HaAdmin 集群高可用命令详细使用说明
高可用HaAdmin使用概览使用说明checkHealth查看NameNode的状态所有NN的服务状态查询指定NN的服务状态failovertransitionToActive概览 HDFS高可用特性解决了集群单点故障问题,通过提供了两个冗余的NameNode以主动或被动的方式用于热备,使得集群既可以从…...
京区航天研究所 哪些比较好的研究所?
第一梯队:一院一部、战术武器部、10所、12所、研发部、空天部,五院501所(总体设计部)、502所、通导部、遥感部、钱室(所人均年薪35w-50w级别) 第二梯队:一院14所、15所,二院未来实验…...
【网络】每天掌握一个Linux命令 - iftop
在Linux系统中,iftop是网络管理的得力助手,能实时监控网络流量、连接情况等,帮助排查网络异常。接下来从多方面详细介绍它。 目录 【网络】每天掌握一个Linux命令 - iftop工具概述安装方式核心功能基础用法进阶操作实战案例面试题场景生产场景…...

手游刚开服就被攻击怎么办?如何防御DDoS?
开服初期是手游最脆弱的阶段,极易成为DDoS攻击的目标。一旦遭遇攻击,可能导致服务器瘫痪、玩家流失,甚至造成巨大经济损失。本文为开发者提供一套简洁有效的应急与防御方案,帮助快速应对并构建长期防护体系。 一、遭遇攻击的紧急应…...
模型参数、模型存储精度、参数与显存
模型参数量衡量单位 M:百万(Million) B:十亿(Billion) 1 B 1000 M 1B 1000M 1B1000M 参数存储精度 模型参数是固定的,但是一个参数所表示多少字节不一定,需要看这个参数以什么…...

高等数学(下)题型笔记(八)空间解析几何与向量代数
目录 0 前言 1 向量的点乘 1.1 基本公式 1.2 例题 2 向量的叉乘 2.1 基础知识 2.2 例题 3 空间平面方程 3.1 基础知识 3.2 例题 4 空间直线方程 4.1 基础知识 4.2 例题 5 旋转曲面及其方程 5.1 基础知识 5.2 例题 6 空间曲面的法线与切平面 6.1 基础知识 6.2…...

如何将联系人从 iPhone 转移到 Android
从 iPhone 换到 Android 手机时,你可能需要保留重要的数据,例如通讯录。好在,将通讯录从 iPhone 转移到 Android 手机非常简单,你可以从本文中学习 6 种可靠的方法,确保随时保持连接,不错过任何信息。 第 1…...

C++ 求圆面积的程序(Program to find area of a circle)
给定半径r,求圆的面积。圆的面积应精确到小数点后5位。 例子: 输入:r 5 输出:78.53982 解释:由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982,因为我们只保留小数点后 5 位数字。 输…...
现有的 Redis 分布式锁库(如 Redisson)提供了哪些便利?
现有的 Redis 分布式锁库(如 Redisson)相比于开发者自己基于 Redis 命令(如 SETNX, EXPIRE, DEL)手动实现分布式锁,提供了巨大的便利性和健壮性。主要体现在以下几个方面: 原子性保证 (Atomicity)ÿ…...
Docker拉取MySQL后数据库连接失败的解决方案
在使用Docker部署MySQL时,拉取并启动容器后,有时可能会遇到数据库连接失败的问题。这种问题可能由多种原因导致,包括配置错误、网络设置问题、权限问题等。本文将分析可能的原因,并提供解决方案。 一、确认MySQL容器的运行状态 …...
MFE(微前端) Module Federation:Webpack.config.js文件中每个属性的含义解释
以Module Federation 插件详为例,Webpack.config.js它可能的配置和含义如下: 前言 Module Federation 的Webpack.config.js核心配置包括: name filename(定义应用标识) remotes(引用远程模块࿰…...
上位机开发过程中的设计模式体会(1):工厂方法模式、单例模式和生成器模式
简介 在我的 QT/C 开发工作中,合理运用设计模式极大地提高了代码的可维护性和可扩展性。本文将分享我在实际项目中应用的三种创造型模式:工厂方法模式、单例模式和生成器模式。 1. 工厂模式 (Factory Pattern) 应用场景 在我的 QT 项目中曾经有一个需…...