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(默认):请求访问路径

@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协议中两种最常被使用的请求方法,它们在原理、使用、速度和安全性等方面都有所区别。具体来说:

  1. 参数传递方式:GET方法将参数包含在URL中,而POST方法通过request body传递参数。这意味着,使用GET提交的数据会显示在URL上,而POST提交的数据则不会显示在URL上。

  2. 数据用途:GET请求通常用于从服务器获取数据,而POST请求则主要用于向服务器提交数据,例如提交表单数据。

  3. 缓存与历史记录:GET请求可以被浏览器缓存,同时也会保存在浏览器的历史记录中。相反,POST请求不会被缓存,且不会保存在历史记录中。

  4. 安全性:由于GET请求将参数直接暴露在URL中,因此可能存在安全隐患。相反,POST请求通过加密的request body传递参数,因此在安全性方面相对较高。

  5. 数据量限制:GET方法由于数据量受限于URL的长度,因此对于大量数据的提交不太适用。而POST方法没有这方面的限制。

  6. 影响刷新和回退:当使用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 注解可以将请求参数的值绑定到方法的参数上

它有以下两个参数:

  1. required:布尔类型,表示该参数是否为必传参数。如果设置为 true,则在请求中必须包含该参数;如果设置为 false,则可以不包含该参数,此时参数的默认值为 null

  2. 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;
}

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

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

相关文章

【JaveSE】:认识异常

异常 一.异常的概念二.异常的体系结构1.基础结构2.异常分类 三.异常的处理1.防御式编程2.异常的抛出3.异常捕获4.try-catch捕获并处理5.finally 四.异常处理流程五.自定义异常 一.异常的概念 在Java中&#xff0c;将程序执行过程中发生的不正常行为称为异常。 算术异常 数组越界…

推荐一款手持式ECU刷写设备,国产软件配合使用

同星智能开发的一款手持式ECU刷写工具——TF1011&#xff0c;在TSMaster中导入诊断流程即可离线一键刷写。在 PC 端完成配置后&#xff0c;在设备可以在手持式离线场景下实现&#xff1a;基于 UDS 协议的诊断和基于 UDS 协议的 Flash Bootloader 程序更新功能。 产品简介—TF10…

Spring 面试题——事务

目录 1.谈谈对 Spring 事务的理解。2.Spring 管理事务的方式有哪几种&#xff1f;3.✨Spring 事务底层源码是如何实现的&#xff1f;3.1.后置处理3.2.事务执行3.3.总结 4.Transactional 注解有什么作用&#xff1f;它的常用属性有哪些&#xff1f;5.✨Spring 事务中的传播行为是…

ansible常用模块介绍

ansible运行模块的两种方式 Ad - Hoc 利用 ansible 命令直接完成管理 &#xff0c; 主要用于临时命令使用场景 ansible westos -m shell -a ls /mnt playbook ansible 脚本 &#xff0c; 主要用于大型项目场景 &#xff0c; 需要前期的规划 vim test.yml - hosts: all task…

【栈】车队

题目&#xff1a; /** 单调栈&#xff1a;存储到终点的时间&#xff0c;需要考虑浮点数* 思路&#xff1a;首先按照距离进行排序&#xff08;目的&#xff1a;如果离终点远的车辆用时比前面的车辆用时短&#xff0c;则是一个车队)* 排序后计算每一辆车辆的时间如果用…

web:[SUCTF 2019]CheckIn(一句话木马,.user.ini)

题目 页面显示 上传文件&#xff0c;随便上传一个文件试试 上传了一个文本&#xff0c;显示失败&#xff0c;不是图片 那就换图片马上传试试 不能包含<?,换一种写法&#xff0c;需要加上GIF89a&#xff0c;进行exif_imagetype绕过 上传成功 这里用.user.ini或者用post传参…

甘草书店:#8 2023年11月22日 星期三「“说一套做一套”的甘草与麦田」

最近与甘草书店的投资方和意向投资方沟通&#xff0c;听取了来自不同领域不同人群的观点。他们讲的都有道理&#xff0c;但他们说的都不是甘草。就像“麦田”成立之前&#xff0c;世间没有“麦田”一样&#xff1b;“甘草”出现之前&#xff0c;世间没有也没有“甘草”。 故事…

力扣116. 填充每个节点的下一个右侧节点指针(详细讲解root根节点的理解)

题目&#xff1a; 给定一个 完美二叉树 &#xff0c;其所有叶子节点都在同一层&#xff0c;每个父节点都有两个子节点。二叉树定义如下&#xff1a; struct Node {int val;Node *left;Node *right;Node *next; } 填充它的每个 next 指针&#xff0c;让这个指针指向其下一个右…

220V工频正弦波逆变器设计

摘 要 与传统逆变器相比&#xff0c;工频正弦波逆变器具有电容电压应力低的优点。但是工频正弦波逆变器存在开关器件电压应力大和开关频率高的缺陷。将SPWM调制策略应用于工频正弦波逆变器&#xff0c;并在不产生电流纹波的条件下实现了最大调制度&#xff0c;不仅能够减小开关…

05.开闭原则(Open Closed Principle)

“你这个人怎么这么轴&#xff1f;让你改改以前的代码怎么和要了你命似的&#xff1f;难道你的能力仅限于此吗&#xff1f;” “你懂什么&#xff1f;我有我的原则&#xff01;我有我的信仰&#xff01;” 一言 开闭原则即&#xff1a;对扩展开放&#xff0c;对修改关闭&#…

D. In Love

贪心&#xff0c;维护最靠左的右端点以及最靠右的左端点 // Problem: D. In Love // Contest: Codeforces - Codeforces Round 905 (Div. 3) // URL: https://codeforces.com/contest/1883/problem/D // Memory Limit: 256 MB // Time Limit: 2000 ms // // Powered by CP Edi…

【从0配置JAVA项目相关环境1】jdk + VSCode运行java + mysql + Navicat + 数据库本地化 + 启动java项目

从0配置JAVA项目相关环境 写在最前面一、安装Java的jdk环境1. 下载jdk2. 配置jdk3. 配置环境变量 二、在vscode中配置java运行环境1. 下载VSCode2. 下载并运行「Java Extension Pack」 三、安装mysql1.官网下载MySQL2.开始安装如果没有跳过安装成功 3.配置MySQL Server4.环境变…

【爬虫】自动下载指定网站全部图片(Java版)

爬虫是一种自动化程序&#xff0c;能够模拟人类的浏览行为&#xff0c;访问网络资源并提取所需数据。它可以通过发送HTTP请求获取网页内容&#xff0c;并对网页进行解析和数据提取。 在大多数时候&#xff0c;提到爬虫我们就会想到 Python&#xff0c;其实 Java 也是可以实现爬…

判断完数(写出部分函数)

例如&#xff1a;本题要求实现一个函数&#xff0c;判断一个自然数是否是完数。如果一个自然数除自身之外的因子和等于它自己&#xff0c;则称该数为完数。例如 6 1 2 3&#xff1b;则6是完数。 函数接口定义&#xff1a; 在这里描述函数接口。&#xff1a;int isPerfect (…

ApplicationContextAware 类

优质博文&#xff1a;IT-BLOG-CN 需求&#xff1a; 使用autowired注入一些对象&#xff0c;但发现不可以直接使用Autowired&#xff0c;因为方法是static的&#xff0c;要使用该方法当前对象也必须是static&#xff0c;正常情况下Autowired无法注入静态的bean&#xff0c;于是…

数据结构与算法编程题44

有向无权图邻接矩阵表示 //参考博客&#xff1a;https://blog.csdn.net/qq_54162207/article/details/117414707#include <iostream> using namespace std;#define Maxsize 100 #define VertexmMaxNum 20 #define ERROR 0 #define OK 1 typedef string VertexType; …

img标签禁止右键点击复制图片等功能

场景描述&#xff1a;在网页中显示图片&#xff0c;但是不想让其他人右键保存图片 会用到一个新的属性&#xff1a;oncontextmenu 代码如下 <img src"./123.png" alt"" oncontextmenu"return false">这样虽然能解决不在当前页右键保存图片…

微信玩具小程序商城开发技巧

小程序已成为许多企业和个人开展业务的重要工具之一。如果你想在玩具行业中打造一个小程序商城&#xff0c;但又没有相关的编程经验&#xff0c;不用担心&#xff01;本文将通过乔拓云平台提供的简单操作步骤&#xff0c;分享给你玩具行业小程序平台搭建的教程。 首先&#xff…

DriveWorks——参数化设计非标定制利器

DriveWorks基本介绍 DriveWorks是一套被 SOLIDWORKS 认可为金牌合作伙伴产品的设计自动化软件。DriveWorks 可自动创建特定于订单的销售文档和 SOLIDWORKS 制造数据。减少重复性任务&#xff0c;消除错误&#xff0c;增加销售额&#xff0c;并在创纪录的时间内交付定制产品。 为…

Linux下的查看文件的命令

1. tail 命令 tail 命令是在 Linux 和类 Unix 系统上用来显示文件末尾内容的命令。它最常用于查看文件的末尾几行内容&#xff0c;通常在日志文件或其他不断更新的文件中使用。 以下是 tail 命令的常用选项和用法&#xff1a; 1.1. 基本用法 tail file_name这将默认显示文件…