SpringMVC修炼之旅(2)基础入门
一、第一个程序
1.1环境配置
略
1.2代码实现
package com.itheima.controller;import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;//定义表现层控制器bean
@Controller
public class UserController {//设置映射路径为/save,即外部访问路径@RequestMapping("/save")//设置当前操作返回结果为指定json数据(本质上是一个字符串信息)@ResponseBodypublic String save(){System.out.println("user save ...");return "{'info':'springmvc'}";}//设置映射路径为/delete,即外部访问路径@RequestMapping("/delete")@ResponseBodypublic String delete(){System.out.println("user save ...");return "{'info':'springmvc'}";}
}
1.3注解解析
@Controller
类型:类注解
位置:SpringMVC控制器类定义上方
作用:用于标记控制器类。当一个类被
@Controller
注解标记时,Spring会自动将该类识别为一个控制器类,并负责处理与该类相关的HTTP请求。
@Controller
public class UserController
{}
@RequestMapping
类型:方法注解
位置:SpringMVC控制器方法定义上方
作用:用于映射HTTP请求到特定的处理方法。它可以应用于类、方法或参数上。当一个类被
@RequestMapping
注解标记时,Spring会自动将该类中的所有带有@RequestMapping
注解的方法识别为处理特定URL路径的处理器。:
@Controller
public class UserController {@RequestMapping(value = "/save")public void save() {System.out.println("user save ...");}
}
相关属性 value(默认):请求访问路径
method:http请求动作,标准动作(GET/POST/PUT/DELETE)
@ResponseBody
类型:方法注解
位置:SpringMVC控制器方法定义上方
作用:用于将控制器方法的返回值直接写入HTTP响应体中。这样,当客户端发起请求时,服务器端会将处理结果以指定的格式(如JSON、XML等)发送给客户端
1.4bean加载控制
Spring控制的bean
- 业务bean(Service)
- 功能bean(DataSource等)
@Configuration
`@Configuration`注解是Spring框架中的一个注解,用于标记一个类作为配置类。配置类通常用于定义Bean的创建和依赖关系,以便在应用程序中进行依赖注入。
@ComponentScan
类型:类注解
位置:应该放在Spring配置文件的类上,通常是在配置类中
作用:用于指定要扫描的包路径,以便自动注册该包及其子包中的组件。当使用@ComponentScan注解时,Spring会自动扫描指定的包路径下的所有类,并将带有@Component、@Service、@Repository或@Controller等注解的类注册为Spring容器中的Bean。
@Configuration
@ComponentScan(value = "com.com.example",excludeFilters = @ComponentScan.Filter(type = FilterType.ANNOTATION,classes = Controller.class)
)
public class SpringConfig {
}
excludeFilters:排除扫描路径中加载的bean,需要指定类别(type)与具体项(classes) includeFilters:加载指定的bean,需要指定类别(type)与具体项(classes)
@EnableAutoConfiguration
是Spring Boot框架提供的一个注解,用于自动配置Spring应用程序的配置。它会根据应用程序的依赖和配置自动配置Spring应用程序的配置。这样可以减少开发人员的配置工作,提高开发效率。@EnableAutoConfiguration注解通常与@SpringBootApplication注解一起使用,用于启用Spring Boot自动配置功能。
@SpringBootApplication
`@SpringBootApplication`注解是Spring Boot框架中的一个注解,用于标记`@SpringBootApplication`注解是Spring Boot框架中的一个注解,用于标记一个类作为Spring Boot应用程序的主入口。它包含了`@Configuration`、`@EnableAutoConfiguration`和`@ComponentScan`三个注解的组合,可以自动配置Spring Boot应用程序的组件扫描路径、自动配置和其他相关设置。
二、请求和响应
2.1请求映射路径
多个控制器类处理相同的请求路径
可以通过以下方法解决
使用@RequestMapping注解的value属性指定请求路径的具体值,可以在不同的控制器类中使用不同的请求路径来区分不同的处理方法。
@Controller
@RequestMapping("/example")
public class ExampleController1 {@RequestMapping("/test")public String test() {//处理逻辑return "test";}
}@Controller
@RequestMapping("/example2")
public class ExampleController2 {@RequestMapping("/test")public String test() {//处理逻辑return "test2";}
}
使用@RequestMapping注解的params属性来区分不同的请求处理方法,可以根据请求参数的不同来调用不同的处理方法。
@Controller
@RequestMapping("/example")
public class ExampleController {@RequestMapping(value = "/test", params = "param1")public String test1() {//处理逻辑return "test1";}@RequestMapping(value = "/test", params = "param2")public String test2() {//处理逻辑return "test2";}
}
使用@RequestMapping注解的headers属性来区分不同的请求处理方法,可以根据请求头的不同来调用不同的处理方法。
@Controller
@RequestMapping("/example")
public class ExampleController {@RequestMapping(value = "/test", headers = "header1=value1")public String test1() {//处理逻辑return "test1";}@RequestMapping(value = "/test", headers = "header2=value2")public String test2() {//处理逻辑return "test2";}
}
2.2请求方式
- Get请求
- Post请求
Get请求传参
普通参数:url地址传参,地址参数名与形参变量名相同,定义形参即可接收参数
@RequestMapping("/commonParam")@ResponseBodypublic String handleCommonParam(String name,Integer age) {System.out.println("Name: " + name + ", age: " + age);return "{'module':'common param'}";}
GET http://localhost:8080/commonParam?name=11&age=11
Post请求参数
POST http://localhost:8080/commonParam
Content-Type: application/x-www-form-urlencodedname=11&age=18
Get请求和 Post请求的区别
GET和POST是HTTP协议中两种最常被使用的请求方法,它们在原理、使用、速度和安全性等方面都有所区别。具体来说:
参数传递方式:GET方法将参数包含在URL中,而POST方法通过request body传递参数。这意味着,使用GET提交的数据会显示在URL上,而POST提交的数据则不会显示在URL上。
数据用途:GET请求通常用于从服务器获取数据,而POST请求则主要用于向服务器提交数据,例如提交表单数据。
缓存与历史记录:GET请求可以被浏览器缓存,同时也会保存在浏览器的历史记录中。相反,POST请求不会被缓存,且不会保存在历史记录中。
安全性:由于GET请求将参数直接暴露在URL中,因此可能存在安全隐患。相反,POST请求通过加密的request body传递参数,因此在安全性方面相对较高。
数据量限制:GET方法由于数据量受限于URL的长度,因此对于大量数据的提交不太适用。而POST方法没有这方面的限制。
影响刷新和回退:当使用GET请求时,刷新页面或回退操作不会影响之前的数据。但是,使用POST请求时,回退可能会导致数据被重新提交。
2.3请求参数
参数种类
- 普通参数
- POJO类型参数
- 嵌套POJO类型参数
- 数组类型参数
- 集合类型参数
普通参数:
- url地址传参,地址参数名与形参变量名相同,定义形参即可接收参数
- 请求参数名与形参变量名不同,使用@RequestParam绑定参数关系
@RequestMapping("/commonParam")@ResponseBodypublic String handleCommonParam(@RequestParam("name") String name1,Integer age) {System.out.println("Name: " + name1 + ", age: " + age);return "{'module':'common param'}";}
@RequestParam 注解
类型:形参注解
位置:SpringMVC控制器方法形参定义前面
作用:用于将请求参数绑定到方法的参数上。它可以用于处理 GET 和 POST 请求中的查询参数和表单数据。使用
@RequestParam
注解可以将请求参数的值绑定到方法的参数上它有以下两个参数:
required
:布尔类型,表示该参数是否为必传参数。如果设置为true
,则在请求中必须包含该参数;如果设置为false
,则可以不包含该参数,此时参数的默认值为null
。
defaultValue
:字符串类型,表示当请求中没有提供该参数时使用的默认值。如果不设置此参数,或者设置为空字符串,那么在请求中没有提供该参数时,参数的值将为null
。
@RequestMapping("/commonParam")@ResponseBodypublic String handleCommonParam(@RequestParam(value = "name", required = false, defaultValue = "defaultValue1") String name1,Integer age) {System.out.println("Name: " + name1 + ", age: " + age);return "{'module':'common param'}";}
POJO参数:
请求参数名与形参对象属性名相同,定义POJO类型形参即可接收参数
pojo类
@RequestMapping("/pojoParam")@ResponseBodypublic String pojoParam(User user){System.out.println("pojo参数传递 user ==> "+user);return "{'module':'pojo param'}";}
嵌套POJO参数:
POJO对象中包含POJO对象
请求参数名与形参对象属性名相同,按照对象层次结构关系即可接收嵌套POJO属性参数
@RequestMapping("/pojoContainPojoParam")@ResponseBodypublic String pojoContainPojoParam(User user){System.out.println("pojo嵌套pojo参数传递 user ==> "+user);return "{'module':'pojo contain pojo param'}";}
GET http://localhost:8080//pojoContainPojoParam?name1=11&age=11&Address.province=12&Address.city=12
数组参数:
同名请求参数可以直接映射到对应名称的形参数组对象中
//数组参数:同名请求参数可以直接映射到对应名称的形参数组对象中@RequestMapping("/arrayParam")@ResponseBodypublic String arrayParam(String[] likes){System.out.println("数组参数传递 likes ==> "+ Arrays.toString(likes));return "{'module':'array param'}";}
GET http://localhost:8080/arrayParam?likes=1&likes=2
集合保存普通参数:
请求参数名与形参集合对象名相同且请求参数为多个,@RequestParam绑定参数关系
//集合参数:同名请求参数可以使用@RequestParam注解映射到对应名称的集合对象中作为数据@RequestMapping("/listParam")@ResponseBodypublic String listParam(@RequestParam List<String> likes){System.out.println("集合参数传递 likes ==> "+ likes);return "{'module':'list param'}";}
集合参数:json格式
@RequestMapping("/listParamForJson")@ResponseBodypublic String listParamForJson(@RequestBody List<String> likes){System.out.println("list common(json)参数传递 list ==> "+likes);return "{'module':'list common for json param'}";}
POST http://localhost:8080//listParamForJson
Content-Type: application/json["like1", "like2", "like3"]
POJO参数:json数据
json数据与形参对象属性名相同,定义POJO类型形参即可接收参数
@RequestMapping("/pojoParamForJson")@ResponseBodypublic String pojoParamForJson(@RequestBody User user){System.out.println("pojo(json)参数传递 user ==> "+user);return "{'module':'pojo for json param'}";}
POST http://localhost:8080/pojoParamForJson
Content-Type: application/json{
"name": "John Doe", "age": 25,"address": {"province": "Ontario", "city": "Toronto"}
}
POJO集合参数:json
json数组数据与集合泛型属性名相同,定义List类型形参即可接收参数
//集合参数:json格式//1.开启json数据格式的自动转换,在配置类中开启@EnableWebMvc//2.使用@RequestBody注解将外部传递的json数组数据映射到形参的保存实体类对象的集合对象中,要求属性名称一一对应@RequestMapping("/listPojoParamForJson")@ResponseBodypublic String listPojoParamForJson(@RequestBody List<User> list){System.out.println("list pojo(json)参数传递 list ==> "+list);return "{'module':'list pojo for json param'}";}
POST http://localhost:8080/listPojoParamForJson
Content-Type: application/json[{"name": "John Doe", "age": 25,"address": {"province": "Ontario", "city": "Toronto"}},{"name": "John Doe", "age": 25,"address": {"province": "Ontario", "city": "Toronto"}}
]
@RequestBody与@RequestParam区别
区别
- @RequestParam用于接收url地址传参,表单传参【application/x-www-form-urlencoded】
- @RequestBody用于接收json数据【application/json】
应用
- 后期开发中,发送json格式数据为主,@RequestBody应用较广
- 如果发送非json格式数据,选用@RequestParam接收请求参数
日期类型参数传递
//日期参数
//使用@DateTimeFormat注解设置日期类型数据格式,默认格式yyyy/MM/dd
@RequestMapping("/dataParam")
@ResponseBody
public String dataParam(Date date,@DateTimeFormat(pattern="yyyy-MM-dd") Date date1,@DateTimeFormat(pattern="yyyy/MM/dd HH:mm:ss") Date date2){System.out.println("参数传递 date ==> "+date);System.out.println("参数传递 date1(yyyy-MM-dd) ==> "+date1);System.out.println("参数传递 date2(yyyy/MM/dd HH:mm:ss) ==> "+date2);return "{'module':'data param'}";
GET http://localhost:8080/dataParam?date1=2023-12-06&date2=2023/12/06 10:10:10
想要将日期作为查询参数传递,因此你应该使用GET请求而不是POST请求。此外,由于日期值需要按照指定的格式进行设置,你需要对日期2的值进行编码,因为URL中的空格是不允许的
2.4响应
响应页面
@RequestMapping("/toJumpPage")
public String toJumpPage(){System.out.println("跳转页面");return "redirect:/page.jsp";
}
响应数据
- 文本数据
- json数据
文本数据
//响应文本数据//返回值为String类型,设置返回值为任意字符串信息,即可实现返回指定字符串信息,需要依赖@ResponseBody注解@RequestMapping("/toText")@ResponseBodypublic String toText(){System.out.println("返回纯文本数据");return "response text";}
json数据
@RequestMapping("/toJsonPOJO")@ResponseBodypublic User toJsonPOJO(){System.out.println("返回json对象数据");User user = new User();user.setName("itcast");user.setAge(15);return user;}
@RequestMapping("/toJsonList")@ResponseBodypublic List<User> toJsonList(){System.out.println("返回json集合数据");User user1 = new User();user1.setName("烟雨");user1.setAge(15);User user2 = new User();user2.setName("平生");user2.setAge(12);List<User> userList = new ArrayList<User>();userList.add(user1);userList.add(user2);return userList;}
HttpMessageConverter接口
// 定义一个名为HttpMessageConverter的接口,泛型参数为T
public interface HttpMessageConverter<T> {// 判断是否可以读取指定类型的数据,参数为类对象和媒体类型(可以为空)boolean canRead(Class<?> clazz, @Nullable MediaType mediaType);// 判断是否可以写入指定类型的数据,参数为类对象和媒体类型(可以为空)boolean canWrite(Class<?> clazz, @Nullable MediaType mediaType);// 获取支持的媒体类型列表List<MediaType> getSupportedMediaTypes();// 从输入消息中读取指定类型的数据,参数为类对象和输入消息对象T read(Class<? extends T> clazz, HttpInputMessage inputMessage)throws IOException, HttpMessageNotReadableException;// 将指定类型的数据写入输出消息,参数为数据对象、内容类型(可以为空)和输出消息对象void write(T t, @Nullable MediaType contentType, HttpOutputMessage outputMessage)throws IOException, HttpMessageNotWritableException;
}
相关文章:

SpringMVC修炼之旅(2)基础入门
一、第一个程序 1.1环境配置 略 1.2代码实现 package com.itheima.controller;import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.ResponseBody;//定义…...

matlab 最小二乘拟合空间直线(方法二)
目录 一、算法原理1、算法过程2、参考文献二、代码实现三、结果展示四、相关链接本文由CSDN点云侠原创,原文链接。如果你不是在点云侠的博客中看到该文章,那么此处便是不要脸的爬虫与GPT。 一、算法原理...

ASPICE-汽车软件开发能力评级
Automotive SPICE(简称A-SPICE 或 ASPICE),全称是“Automotive Software Process Improvement and Capacity dEtermination”,即“汽车软件过程改进及能力评定”模型框架。 常被用于评估一家汽车软件供应商的软件开发能力&#x…...

准确!!!在 CentOS 8 上配置 PostgreSQL 14 的主从复制
在 CentOS 8 上配置 PostgreSQL 14 的主从复制,并设置 WAL 归档到特定路径 /home/postgres/archive 的步骤如下: 主服务器配置(主机) 配置 PostgreSQL: 编辑 postgresql.conf 文件: vim /data/postgres/p…...

leetcode 1466
leetcode 1466 使用dfs 遍历图结构 如图 node 4 -> node 0 -> node 1 因为节点数是n, 边长数量是n-1。所以如果是从0出发的路线,都需要修改,反之,如果是通向0的节点,例如节点4,则把节点4当作父节点的节点&…...

想学编程,但不知道从哪里学起,应该怎么办?
怎样学习任何一种编程语言 我将教你怎样学习任何一种你将来可能要学习的编程语言。本书的章节是基于我和很多程序员学习编程的经历组织的,下面是我通常遵循的流程。 1.找到关于这种编程语言的书或介绍性读物。 2.通读这本书,把…...

Python数据科学视频讲解:Python概述
2.1 Python概述 视频为《Python数据科学应用从入门到精通》张甜 杨维忠 清华大学出版社一书的随书赠送视频讲解2.1节内容。本书已正式出版上市,当当、京东、淘宝等平台热销中,搜索书名即可。内容涵盖数据科学应用的全流程,包括数据科学应用和…...

数据结构之内部排序
目录 7-1 直接插入排序 输入格式: 输出格式: 输入样例: 输出样例: 7-2 寻找大富翁 输入格式: 输出格式: 输入样例: 输出样例: 7-3 PAT排名汇总 输入格式: 输出格式: 输入样例: 输出样例: 7-4 点赞狂魔 输入格式: 输出格式: 输入样例&a…...

软考高级备考-系统架构师(机考后新版教材的备考过程与资料分享)
软考高级-系统架构设计师 考试复盘1.考试结果2.备考计划3.个人心得 资料分享 考试复盘 1.考试结果 三科压线过,真是太太太太太太太幸运了。上天对我如此眷顾,那不得不分享下我的备考过程以及一些备考资料,帮助更多小伙伴通过考试。 2.备考…...

Spring Boot 整合kafka:生产者ack机制和消费者AckMode消费模式、手动提交ACK
目录 生产者ack机制消费者ack模式手动提交ACK 生产者ack机制 Kafka 生产者的 ACK 机制指的是生产者在发送消息后,对消息副本的确认机制。ACK 机制可以帮助生产者确保消息被成功写入 Kafka 集群中的多个副本,并在需要时获取确认信息。 Kafka 提供了三种…...

Java+Swing: 主界面组件布局 整理9
说明:这篇博客是在上一篇的基础上的,因为上一篇已经将界面的框架搭好了,这篇主要是将里面的组件完善。 分为三个部分,北边的组件、中间的组件、南边的组件 // 放置北边的组件layoutNorth(contentPane);// 放置中间的 Jtablelayou…...

pytorch:YOLOV1的pytorch实现
pytorch:YOLOV1的pytorch实现 注:本篇仅为学习记录、学习笔记,请谨慎参考,如果有错误请评论指出。 参考: 动手学习深度学习pytorch版——从零开始实现YOLOv1 目标检测模型YOLO-V1损失函数详解 3.1 YOLO系列理论合集(Y…...

YOLOv8配置文件yolov8.yaml解读
🍨 本文为🔗365天深度学习训练营 中的学习记录博客🍖 原作者:K同学啊 | 接辅导、项目定制 位置 该文件的位置位于 ./ultralytics/cfg/models/v8/yolov8.yaml 模型参数配置 # Parameters nc: 80 # number of classes scales: #…...

4-Tornado高并发原理
核心原理就是协程epoll事件循环,再使用协程之后,开销是特别的小,那具体如何提供高并发的呢? 异步非阻塞IO 这意味我们整套开发的模式不在与原来一样,正因为不再一样,所以有时我们在理解代码时就有可能会比…...

基于以太坊的智能合约开发Solidity(事件日志篇)
//声明版本号(程序中的版本号要和编译器版本号一致) pragma solidity ^0.5.17; //合约 contract EventTest {//状态变量uint public Variable;//构造函数constructor() public{Variable 100;}event ValueChanged(uint newValue); //事件声明event Log(…...

【BME2112】w11 notes
下周做老鼠实验 group analysis SPM group analysis 数据地址resting state 可以分析:correlation 计算两个脑区的相关性 静息态实验简单functional 成功的实验能看到激活区不成功的实验:比如被试头动太大,不是健康的被试 Spontaneous brain…...

Flutter笔记:滑块及其实现分析1
Flutter笔记 滑块分析1 作者:李俊才 (jcLee95):https://blog.csdn.net/qq_28550263 邮箱 :291148484163.com 本文地址:https://blog.csdn.net/qq_28550263/article/details/134900784 本文从设计角度&#…...

【React Hooks】useReducer()
useReducer 的三个参数是可选的,默认就是initialState,如果在调用的时候传递第三个参数那么他就会改变为你传递的参数,实际开发不建议这样写。会增加代码的不可读性。 使用方法: 必须将 useReducer 的第一个参数(函数…...

如何把kubernetes pod中的文件拷贝到宿主机上或者把宿主机上文件拷贝到kubernetes pod中
1. 创建一个 Kubernetes Pod 首先,下面是一个示例Pod的定义文件(pod.yaml): cat > nginx.yaml << EOF apiVersion: v1 kind: Pod metadata:name: my-nginx spec:containers:- name: nginximage: nginx EOF kubectl app…...

Android 13 - Media框架(20)- ACodec(二)
这一节开始我们就来学习 ACodec 的实现 1、创建 ACodec ACodec 是在 MediaCodec 中创建的,这里先贴出创建部分的代码: mCodec mGetCodecBase(name, owner);if (mCodec NULL) {ALOGE("Getting codec base with name %s (owner%s) failed", n…...

TCP单聊和UDP群聊
TCP协议单聊 服务端: import java.awt.BorderLayout; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintWriter; import java.net.ServerSocket; import java.net.Socket; import java.util.V…...

智能优化算法应用:基于鲸鱼算法3D无线传感器网络(WSN)覆盖优化 - 附代码
智能优化算法应用:基于鲸鱼算法3D无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用:基于鲸鱼算法3D无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.鲸鱼算法4.实验参数设定5.算法结果6.参考文献7.MA…...

TortoiseGit 小乌龟svn客户端软件查看仓库地址
进入代码路径...

uniapp微信小程序分包,小程序分包
前言,都知道我是一个后端开发、所以今天来写一下uniapp。 起因是美工给我的切图太大,微信小程序不让了,在网上找了一大堆分包的文章,我心思我照着写的啊,怎么就一直报错呢? 错误原因 tabBar的页面被我放在分…...

『Linux升级路』进度条小程序
一、预备知识 在编写『Linux升级路』进度条小程序之前,我们需要了解一些预备知识。本文将详细介绍缓冲区和回车换行的概念。 1.1 缓冲区 缓冲区是计算机内存中的一块区域,用于临时存储数据。在编程中,我们经常使用缓冲区来临时保存数据&am…...

使用rust slint开发桌面应用
安装QT5,过程省略 安装rust,过程省略 创建工程 cargo new slint_demo 在cargo.toml添加依赖 [dependencies] slint "1.1.1" [build-dependencies] slint-build "1.1.1" 创建build.rs fn main() {slint_build::compile(&quo…...

Flutter桌面应用程序定义系统托盘Tray
文章目录 概念实现方案1. tray_manager依赖库支持平台实现步骤 2. system_tray依赖库支持平台实现步骤 3. 两种方案对比4. 注意事项5. 话题拓展 概念 系统托盘:系统托盘是一种用户界面元素,通常出现在操作系统的任务栏或桌面顶部。它是一个水平的狭长区…...

docker:安装mysql以及最佳实践
文章目录 1、拉取镜像2、运行容器3、进入容器方式一方式二方式三容器进入后连接mysql和在宿主机连接mysql的区别 持久化数据持久化数据最佳实践 1、拉取镜像 docker pull mysql2、运行容器 docker run -d -p 3307:3306 --name mysql-container -e MYSQL_ROOT_PASSWORD123456 …...

uniapp实战 —— 自定义顶部导航栏
效果预览 下图中的红框区域 范例代码 src\pages.json 配置隐藏默认顶部导航栏 "navigationStyle": "custom", // 隐藏默认顶部导航src\pages\index\components\CustomNavbar.vue 封装自定义顶部导航栏的组件(要点在于:获取屏幕边界…...

中国移动频段划分
1、900MHz(Band8)上行:889-904MHz,下行:934-949MHz,带宽共计15MHz,目前部署:2G/NB-IoT/4G 2、1800MHz(Band3)上行:1710-1735MHz,下行…...