springMVC 程序开发

目录

一. 认识 springMVC 

 spring,springBoot,springMVC的关系

二. springMVC 的连接和获取参数 

1. 注解分析(不带参数)

2. 获取参数 

3. 获取对象参数

4. 重命名功能

5. 获取 JSON 对象

6. 通过 path 文件路径来传递参数

7. 上传文件

8. 获取 cookie 和 header 中的某个信息

9. 获取 session 和存储 session 


一. 认识 springMVC 

springMVC 是基于 servlet API 构造的原始 Web 框架。

所谓 MVC,也就是 model,view,controller,把软件系统分为模型,视图,控制器三个基本部分;

1. 模型:使应用程序中处理数据逻辑的部分,通常会在数据库中存取数据;

2. 试图:是应用程序中处理数据显示的部分;

3. 控制器:是应用程序中处理用户交互的部分;

 MVC就是一种思想,而 springMVC 就是针对思想的具体实现。

 spring,springBoot,springMVC的关系

spring 指的是 core 框架,是spring中的最核心基础的框架,他不包含其他的模块,只包含一些核心基础的功能,不具备 http 通信功能;

springBoot 就是 快速开发 spring框架 的脚手架;

springMVC 就是 spring 整个体系中的 web 框架,可以进行 http 通信; 

 所以说对于 springMVC 的学习,就主要有三个方向:建立连接,获取参数,输出数据;

二. springMVC 的连接和获取参数 

1. 注解分析(不带参数)

1. @ResponseBody:表示返回非页面数据;

@ResponseBody 通常和 @Controller 合并为 @RestController ;

2. @RequestMapping:表示注册接口的路由映射;

这个注解支持 GET,也支持 POST,也可以通过 method = RequestMethod.GET 来限制只能用 GET 请求(POST同理);

路由映射通过 value="hello" ,value通常省略;

此注解的路由映射方式既可以加在 类上 ,也可以加在 方法上 ;

3. @GetMapping 和 @PostMapping :表示只支持 GET 或者 POST 请求;

2. 获取参数 

在 springMVC 框架中,获取参数很方便,一般直接在方法的参数中进行体现就行了。

但要求查询字符串中的 key 值要和方法中的参数值一一对应!!!

此处还有一个注意点:参数一般选择包装类型,不用基础数据类型,例如 int,当使用 Integer 的时候,它是一个对象,如果不传递参数的话,会以 null 作为代替,但是如果为 int ,会直接报错。所以一般建议使用包装类型进行接收。 

springMVC 是基于 servlet API 实现的,显然 servlet 的那套获取参数的方式依然是成立的;

HttpServletRequest 和 HttpServletResponse 就作为 springMVC 中隐藏的参数对象,可以使用。 

 3. 获取对象参数

当前端传递表单的时候,此时有两种方案去获取:

1. 以上述讲解的方式,采取多个参数获取;

2. 将表单封装成一个对象,来获取对象,此时框架会自动填充对象中的值; 

例如:发送请求,并针对以下这个对象来进行接收:

@RequestMapping("/reg")public Object register(Userinfo userinfo){   System.out.println(userinfo);return userinfo;           }

此处的返回类型定为 Object,返回时在系统中会进行判定,如果是一个自定义对象,那么会转换为 application/json 的形式进行返回,如果是 String 类型,且有 html 标签,那么会以 html 形式进行打印返回;

也就是框架会实现自动的参数映射;

@RequestMapping("/h1")public Object getH1(){return "<h1>我是h1</h1>";     // 此时经过识别后,Content-Type:text/html;}

 4. 重命名功能

当出现前端的命名和后端接口使用的命名不一样的时候,要用重命名来解决; 

使用 @RequestParam(value="前端传过来的名字",require="boolean") String name

此时前端传递的参数为 username 也是可以被接收的,也就是接收 username 来代替 name;

在@RequestParam中还有一个require方法,其值默认为 true,true的时候就表示前端必须传入 username 参数,否则会报错,也可以设为 false,也就会避免报错;

    // 重命名的功能:例如前端和后端接口使用的命名不一样,如何解决?@RequestMapping("/reg2")// 非必须传的参数的时候,required可以为falsepublic Object register2(@RequestParam(value = "username",required = false) String name , String password){    // 此时前端传递的参数名称为username也是可以的,@RequestParam中还有一个默认方法(默认为true):true的时候必须传入该参数(username),否则报错,也可以设为false,就可以避免这种情况了,但此时也拿不到name值了,因为name已经默认被usernamee替代了,只认username了return name + " : " + password;}

5. 获取 JSON 对象

当传递过来的是一个 JSON 对象的时候,此时需要进行额外的注解说明;

使用 @RequestBody 注解;

@RequestMapping("/reg3")public Object register3(@RequestBody Userinfo userinfo){return  userinfo;}

 6. 通过 path 文件路径来传递参数

使用 path 文件路径传递参数会让 url 更加简洁,适用于参数少的情况,且搜索引擎抓取关键字的权重更高;

需要在路由映射中对要传递参数的 key 值进行配置: 

@RequestMapping("/reg4/{key}/{key}/{key}") 

 对参数进行注解配置:

@PathVariable,这个注解同样有 重命名 的方法,也有 require 方法 

// 通过 path(url) 来传参 -> /user/12345      =     /user?uid=12345@RequestMapping("/reg4/{name}/{password}/{id}")      // 顺序要依次对应public Object register4(@PathVariable("password") String password1,@PathVariable String name,@PathVariable(required = false) Integer id){    //一样有上述的(required = false)限制return "name: "+name+" password: "+password1+" id: "+id;}

 7. 上传文件

在参数中要使用注解:@RequestPart("key值") 然后使用 MultipartFile 类型来接收;

可以创建一个新的文件,然后使用 transferTo 方法来进行存储;

    @RequestMapping("/myupload")public Object upload(@RequestPart("myimg2")MultipartFile file){      // 要用 MultipartFile 接收File saveFile = new File("D:\\test\\myimg.png");try {file.transferTo(saveFile);return true;} catch (IOException e) {e.printStackTrace();}return false;}

但是这种上传文件的方式并不符合生产环境,因为在每一次的上传中,都会覆盖上一次生成的文件,所以要解决文件覆盖的问题。可以从文件名上去解决问题,每一次存储的文件名都不一致的时候,就不会有文件覆盖的问题。

使用 UUID.randomUUID() 方法获取唯一名(UUID可以保证每一次获取到的文件名都是不重复的,指定文件名是根据网卡信息+时间戳+随机数),再用   file.getOriginalFilename().substring(file.getOriginalFilename().lastIndexOf(".") ) 来获取到 .后缀

    @RequestMapping("/myupload2")public Object upload2(@RequestPart("myfile")MultipartFile file){String fileName = UUID.randomUUID()+            // 文件名 + 原文件名后缀名 -> 拼一起就是文件名file.getOriginalFilename().substring(file.getOriginalFilename().lastIndexOf("."));  // 包含 .File saveFile = new File("D:\\test\\"+fileName);try {file.transferTo(saveFile);return true;} catch (IOException e) {e.printStackTrace();}return false;}

 此时进行三次文件传送,获取并存储的三个文件就不会有覆盖问题了,符合生产环境。

补充: 可以通过配置文件来设置文件的最大容量;

spring:servlet:multipart:max-file-size: 100MB

8. 获取 cookie 和 header 中的某个信息

获取 cookie 使用 @CookieValue(value="要获取的cookie名") 注解;

获取 header 中的信息使用 @RequestHeader(value="要获取的属性名") 注解;

两个注解同样都有 require 方法;

    @RequestMapping("/getck")public Object getck(@CookieValue(value = "java",required = false) String java){  // @CookieValue 参数为 cookie 名称return java;}

    @RequestMapping("/gethd")public Object getHeader(@RequestHeader(value = "Host",required = false) String host){  // @CookieValue 参数为 cookie 名称return host;}

此处也可以使用 servlet 的方式来进行:

获取cookie:Cookie[] cookies = request.getCookies();

获取header属性:String userAgent = request.getHeader("User-Agent");

9. 获取 session 和存储 session 

此处获取 session 的方式和 servlet 的方式是一致的; 

    private static final String SESSION_KEY = "USERINFO_SESSION_KEY";@RequestMapping("/setsess")public void setSession(HttpServletRequest request){HttpSession session = request.getSession(true);     // 没有 session 则创建一个session.setAttribute(SESSION_KEY,"zhangsan");}

获取 session 的时候使用注解 @SessionAttribute(key值)

 也可以使用 servlet 的方式:session.getAttribute("key值");

    @RequestMapping("/getsess")public Object getSession(@SessionAttribute(SESSION_KEY) String name){return name;}

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

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

相关文章

新版Android Studio模拟器浮动

&#xff08;水一篇&#xff0c;但其实很多入门同学不知道&#xff09; 安装新版Andorid Studio后会发现模拟器是内嵌在AS中的&#xff0c;如何让她浮动

[C++项目] Boost文档 站内搜索引擎(4): 搜索的相关接口的实现、线程安全的单例index接口、cppjieba分词库的使用、综合调试...

有关Boost文档搜索引擎的项目的前三篇文章, 已经分别介绍分析了: 项目背景: &#x1fae6;[C项目] Boost文档 站内搜索引擎(1): 项目背景介绍、相关技术栈、相关概念介绍…文档解析、处理模块parser的实现: &#x1fae6;[C项目] Boost文档 站内搜索引擎(2): 文档文本解析模块…

C++学习| MFC简单入门

前言&#xff1a;因为接手了CMFC的程序&#xff0c;所以需要对MFC编程方面有所了解。 C之MFC简单入门 MFC相关的概念MFCWIN32QT MFC项目基本操作MFC项目创建MFC项目文件解读界面和代码数据交互——加法器 MFC相关的概念 MFC MFC&#xff08;Microsoft Foundation Classes微软…

MySQL中基础查询语句

用户表user数据如下&#xff1a; iddevice_idgenderageuniversityprovince12138male21北京大学Beijing23214male复旦大学Shanghai36543famale20北京大学Deijing42315female 23 浙江大学ZheJiang55432male25山东大学Shandong 1&#xff0c;写出ddl语句创建如上表&#xff0c;…

CEC2013(MATLAB):淘金优化算法GRO求解CEC2013的28个函数

一、淘金优化算法GRO 淘金优化算法&#xff08;Gold rush optimizer&#xff0c;GRO&#xff09;由Kamran Zolf于2023年提出&#xff0c;其灵感来自淘金热&#xff0c;模拟淘金者进行黄金勘探行为。淘金优化算法&#xff08;Gold rush optimizer&#xff0c;GRO&#xff09;提…

centos7实现负载均衡

目录 一、基于 CentOS 7 构建 LVS-DR 集群。 1.1 配置lvs负载均衡服务 1.1.1 下载ipvsadm 1.1.2 增加vip 1.1.3 配置ipvsadm 1.2 配置rs1 1.2.1 编写测试页面 1.2.2 手工在RS端绑定VIP、添加路由 1.2.3 抑制arp响应 1.3 配置rs2 1.4 测试 二、配置nginx负载…

AMEYA360:尼得科科宝旋转型DIP开关系列汇总

旋转型DIP开关 S-4000 电路&#xff1a;BCD(十进制) 代码格式&#xff1a;实码 安装类型&#xff1a;表面贴装 调整位置&#xff1a;顶部 可水洗&#xff1a;无 端子类型&#xff1a;J 引线, 鸥翼型 旋转型DIP开关 SA-7000 电路&#xff1a;BCD(十进制), BCH(十六进制) 代码格式…

Java线程池

线程池 1. 概念2. 工作流程3. ThreadPoolExecutor参数 1. 概念 线程池是一种利用池化技术思想来实现的线程管理技术&#xff0c;主要是为了复用线程、便利地管理线程和任务、并将线程的创建和任务的执行解耦开来。我们可以创建线程池来复用已经创建的线程来降低频繁创建和销毁…

Detector定位算法在FPGA中的实现——section1 原理推导

关于算法在FPGA中的实现&#xff0c;本次利用业余的时间推出一个系列章节&#xff0c;专门记录从算法的推导、Matlab的实现、FPGA的移植开发与仿真做一次完整的FPGA算法开发&#xff0c;在此做一下相关的记录和总结&#xff0c;做到温故知新。 这里以Detector在Global Coordina…

Ansible从入门到精通【六】

大家好&#xff0c;我是早九晚十二&#xff0c;目前是做运维相关的工作。写博客是为了积累&#xff0c;希望大家一起进步&#xff01; 我的主页&#xff1a;早九晚十二 专栏名称&#xff1a;Ansible从入门到精通 立志成为ansible大佬 ansible templates 模板&#xff08;templa…

利用状态监测和机器学习提高冷却塔性能的具体方法

在现代工业生产中&#xff0c;冷却塔扮演着至关重要的角色&#xff0c;它们的性能直接影响着工艺流程的稳定性和效率。为了确保冷却塔的正常运行和减少系统故障&#xff0c;状态监测和机器学习成为了关键技术。 图.冷却塔&#xff08;PreMaint&#xff09; 在前文《基于人工智…

MySQL_约束、多表关系

约束 概念&#xff1a;就是用来作用表中字段的规则&#xff0c;用于限制存储在表中的数据。 目的&#xff1a;保证数据库中数据的正确性&#xff0c;有效性和完整性。 约束演示 #定义一个学生表&#xff0c;表中要求如下&#xff1a; #sn 表示学生学号&#xff0c;要求使用 …

Python测试框架pytest:常用参数、查找子集、参数化、跳过

Pytest是一个基于python的测试框架&#xff0c;用于编写和执行测试代码。pytest主要用于API测试&#xff0c;可以编写代码来测试API、数据库、UI等。 pytest是一个非常成熟的全功能的Python测试框架&#xff0c;主要有以下几个优点&#xff1a; 简单灵活&#xff0c;容易上手。…

【input】关于input 元素的type类型及相关作用

传统类型&#xff1a; text&#xff1a;用于输入单行文本。 <input type"text" name"username">password&#xff1a;用于输入密码&#xff0c;输入的内容会被隐藏。 <input type"password" name"password">checkbox&a…

React Native 样式布局基础知识

通过此篇笔记能够学习到如下的几个知识点 在 React Native 中使用样式的一些细节了解 React Native 的 Flex 布局概念了解 React Native 的 flex 布局属性React Native 如何添加多样式属性React Native 中绝对布局和相对布局 React Native 中的 Flex 布局概念 1、主轴和交叉…

树莓派命令行运行调用音频文件的函数,不报错,没有声音解决办法

树莓派接上音频首先需要切换音频不是HDMI&#xff0c;然后可以双击运行wav文件可以播放&#xff0c;但是&#xff1a; 命令行直接运行wav文件报错&#xff1a; Playing WAVE twzc.wav : Signed 16 bit Little Endian, Rate 16000 Hz, Mono命令行运行main方法也是无法播放&am…

用excel格式书写的接口用例执行脚本

创建测试用例和测试结果集文件夹&#xff1a; excel编写的接口测试用例如下&#xff1a; 1 encoding 响应的编码格式。所测项目大部分是utf-8&#xff0c;有一个特殊项目是utf-8-sig 2 params 对应requests的params 3 data&#xff0c;对应requests的data 有些参数是动态的&a…

java+springboot+mysql小区宠物管理系统

项目介绍&#xff1a; 使用javaspringbootmysql开发的小区宠物管理系统&#xff0c;系统包含超级管理员&#xff0c;系统管理员、用户角色&#xff0c;功能如下&#xff1a; 超级管理员&#xff1a;管理员管理&#xff1b;用户管理&#xff1b;宠物分类&#xff1b;宠物管理&…

自建机房还是选择云服务器?以腾讯云为例

大企业是选择自购服务器自建机房还是使用腾讯云服务器&#xff1f;都说企业上云是趋势&#xff0c;自建机房是一次性支出&#xff0c;上云租赁云服务器等产品需要年年续费&#xff0c;大型企业有必要把数据中心迁移上云吗&#xff1f;腾讯云服务器网想说&#xff0c;自建机房购…