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所,二院未来实验…...

Nacos配置拉取及配置动态刷新原理【源码阅读】
Nacos配置拉取及配置刷新原理 一、初始化时获取配置文件 背景 SpringCloud项目中SpringBoot在启动阶段除了会创建SpringBoot容器,还会通过bootstrap.yml构建一个SpringCloud容器,之后会在准备上下文阶段通过SPI加载实现类后,会进行配置合并…...

第十届省赛——9等差数列(集合做法)
题目:试题 I: 等差数列时间限制: 1.0s 内存限制: 512.0MB 本题总分:25 分【问题描述】数学老师给小明出了一道等差数列求和的题目。但是粗心的小明忘记了一部分的数列,只记得其中 N 个整数。现在给出这 N 个整数,小明想知道包含这…...

《数据分析-JiMuReport03》JiMuReport报表设计入门介绍-新建报表
报表设计 1 新建报表 1.1 创建新的数据报表 以数据报表为例,简单介绍创建报表的过程 1.2 进入报表设计页面 如下图可见,主要分为四个模块: 模块一(左) 数据集管理报表信息数据字典 模块二(右) 这部分是对数据报表的进一步优化 模块三(上…...

从功能测试进阶自动化测试,爆肝7天整理出这一份超全学习指南【附网盘资源】
因为我最近在分享自动化测试技术,经常被问到:功能测试想转自动化,请问应该怎么入手?有没有好的资源推荐?那么,接下来我就结合自己的经历聊一聊我是如何在工作中做自动化测试的。(学习路线和网盘…...

CNN神经网络——手写体识别
目录 Load The Datesets Defining,Training,Measuring CNN Algorithm Datasets GRAET HONOR TO SHARE MY KNOWLEDGE WITH YOU This paper is going to show how to use keras to relize a CNN model for digits classfication Load The Datesets The datasets files are …...

python调试模块ipdb
1. 调试python ipdb是用来python中用以交互式debug的模块,可以直接利用pip安装; 其功能类似于pycharm中 python控制台, 而使用ipdb 的优点,便是直接在代码中调试, 避免了在python控制台,或者重新设置一些简单变量。…...

【数据库】聊聊MySQL的日志,binlog、undo log、redo log
日志 在数据库中,如何保证数据的回滚,以及数据同步,系统宕机后可以恢复到原来的状态,其实就是依靠日志。 其中bin log是Server层特有的,redo log是Innodb存储引擎特有的。 bin log 是逻辑日志,主要记录这条…...

aws dynamodb java低等级api和高级客户端api的使用
参考资料 https://docs.amazonaws.cn/zh_cn/sdk-for-java/latest/developer-guide/setup-project-maven.html 初始化环境 创建maven项目 mvn org.apache.maven.plugins:maven-archetype-plugin:3.1.2:generate \-DarchetypeArtifactId"maven-archetype-quickstart&quo…...

Kafka中那些巧妙的设计
一、kafka的架构 Kafka是一个分布式、多分区、基于发布/订阅模式的消息队列(Message Queue),具有可扩展和高吞吐率的特点。 kafka中大致包含以下部分: Producer: 消息生产者,向 Kafka Broker 发消息的客户…...

《JavaEE》进程和线程的区别和联系
👑作者主页:Java冰激凌 📖专栏链接:JavaEE 目录 进程是什么? 线程是什么? 进程和线程之间的联系~ ps1:假设我们当前的大兴国际机场有一条登机口可以登入飞机 ps2:我们为…...