her~~llo,我是你们的好朋友Lyle,是名梦想成为计算机大佬的男人!
博客是为了记录自我的学习历程,加强记忆方便复习,如有不足之处还望多多包涵!非常欢迎大家的批评指正。
今天主要学习关于请求与响应的知识。
目录
普通参数请求参数名和形参名不同,使用@RequestParam
1.4@RequestBody与@RequestParam区别
一、请求
1.1请求映射路径
团队多人开发,每人设置不同的请求路径,万一冲突,如何解决?
设置模块名作为请求路径前缀。
名称:@RequestMapping
类型:方法注解、类注解
位置: SpringMVC控制器方法定义上方
作用:设置当前控制器方法请求访问路径,如果设置在类上统一设置当前控制器方法请求访问路径前缀范例:
@Controller @RequestMapping("/user")//定义整个模块的请求路径前缀 public class UserController { @RequestMapping("/save")//设置当前操作的访问路径 @ResponseBody //设置当前操作的返回值类型 public String save(){ System.out.println("user save.."); return "{'module':'user save'}"; } }
属性:
value(默认)︰请求访问路径,或访问路径前缀
1.2请求方式
Get请求
- 普通参数: url地址传参,地址参数名与形参变量名相同,定义形参即可接收参数,localhost:8080/user/save?name=Lyle&age=20
@RequestMapping("/save") @ResponseBody public String save(String name, int age) { System.out.println("user save.." + name + age); return "{'module':'user save'}" + name + age; }
- pojo参数:请求参数名与形参对象属性名相同,定义PO3o类型形参即可接收参数,例如User中有name和age属性,要这样请求localhost:8080/user/pojoParam?name=Lyle&age=20
@RequestMapping("/pojoParam") @ResponseBody public String pojo(User user) { System.out.println("pojo参数.." + user); return "{'module':'pojo参数'}" + user; }
- pojo嵌套参数:POJO对象中包含POJO对象,请求参数名与形参对象属性名相同,按照对象层次结构关系即可接收嵌套POJO属性参数,例如User中有name和age属性,还有address对象属性,address里又有province和city属性,要这样请求localhost:8080/user/pojoContainPojoParam?name=Lyle&age=20&address.city=邢台&address.province=河北
@RequestMapping("/pojoContainPojoParam") @ResponseBody public String pojoContainPojo(User user) { System.out.println("pojo嵌套pojo.." + user); return "{'module':'pojo嵌套'}" + user; }
- 数组请求:数组参数:请求参数名与形参对象属性名相同且请求参数为多个,定义数组类型形参即可接收参数,例:形参中有likes字符串数组,传多个likes参数,不一样就接受不到,要这样请求localhost:8080/user/arrayParam?likes=music&likes=game
@RequestMapping("/arrayParam") @ResponseBody public String array(String[] likes) { System.out.println("数组参数.." + Arrays.toString(likes)); return "{'module':'数组参数'}" + Arrays.toString(likes); }
- 集合请求:请求参数名与形参集合对象名相同且请求参数为多个,@RequestParam绑定参数关系,还是用likes做示范,但是这个要特殊一些,在形参前加@RequestParam,不加的话,它会以为List是一个POJO对象进行处理。
@RequestMapping("/listParam") @ResponseBody public String array(@RequestParam List<String> likes) { System.out.println("集合参数.." + likes); return "{'module':'集合参数'}" + likes; }
Post请求(参照Get请求)
- 普通参数:
- pojo参数
- pojo嵌套参数
- 数组参数
- 集合参数
普通参数请求参数名和形参名不同,使用@RequestParam
@Controller @RequestMapping("/brand") public class BrandController { @RequestMapping("/save")//设置当前操作的访问路径 @ResponseBody //设置当前操作的返回值类型 public String save(@RequestParam("name") String brandName){//此时brandName就不能用了 System.out.println("brand save.."+brandName); return "{'module':'brand save'}"+brandName; } }
此时就可以用name来请求。
名称:@RequestParam
类型:形参注解
位置:SpringMVC控制器方法形参定义前面作用:绑定请求参数与处理器方法形参间的关系
参数:
required:是否为必传参数defaultValue:参数默认值
需要注意的是:此时形参brandName就不能用了。
Post请求中文乱码处理
在SpringMvcConfig中为web容器添加过滤器并指定字符集,Spring-web包中提供了专用的字符过滤器
//处理中文乱码 @Override protected Filter[] getServletFilters() { CharacterEncodingFilter filter = new CharacterEncodingFilter(); filter.setEncoding("UTF-8"); return new Filter[]{filter}; }
1.3请求参数(传递json数据)
第一步:导入坐标
<dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.13.3</version> </dependency>
第二步:在SpringMvcConfig中开启自动转换json数据的支持(@EnableWebMvc注解功能强大,该注解整合了多个功能,此处仅使用其中一部分功能,即json数据进行自动类型转换)
@Configuration @ComponentScan("test.controller") @EnableWebMvc public class SpringMvcConfig { }
名称: @EnablewebMvc
类型:配置类注解
位置: SpringMVC配置类定义上方作用:开启springMVC多项辅助功能
由于json数据是在Body里的,因此在形参前要加上@RequestBody注解
名称:@RequestBody
类型:形参注解
位置: SpringMVC控制器方法形参定义前面
作用:将请求中请求体所包含的数据传递给请求参数,此注解一个处理器方法只能使用一次json数组
@RequestMapping("/listParamForJson") @ResponseBody public String listParamForJson(@RequestBody List<String> likes){ System.out.println("list json.."+likes); return "{'module':'list json'}"+likes; }
json对象(POJO)
@RequestMapping("/pojoParamForJson") @ResponseBody public String pojoParamForJson(@RequestBody User user){ System.out.println("pojo json .."+user); return "{'module':'pojo json'}"+user; }
json数组(POJO)
@RequestMapping("/listPojoParamForJson") @ResponseBody public String listPojoParamForJson(@RequestBody List<User> userList){ System.out.println("list json.."+userList); return "{'module':'list json'}"+userList; }
1.4@RequestBody与@RequestParam区别
区别
- @RequestParam用于接收url地址传参,表单传参【application/x-www-form-urlencoded】
- @RequestBody用于接收json数据【application/json】
应用
- 后期开发中,发送json格式数据为主,@RequestBody应用较广
- 如果发送非json格式数据,选用@RequestParam接收请求参数
1.5日期类型参数传递
日期类型数据基于系统不同格式也不尽相同:
- 2088-08-18
- 2088/08/18
- 08/18/2088
@RequestMapping("/dateParam")//设置当前操作的访问路径 @ResponseBody //设置当前操作的返回值类型 public String dataParam(Date date1, @DateTimeFormat(pattern = "yyyy-MM-dd") Date date2, @DateTimeFormat(pattern = "yyyy/MM/dd HH:mm:ss") Date date3){ System.out.println("date param.."+date1+date2+date3); return "{'module':'data param'}"+date1+date2+date3; }
名称:@DateTimeFormat
类型:形参注解
位置: SpringMVC控制器方法形参前面作用:设定日期时间型数据格式
属性: pattern:日期时间格式字符串字符串格式转化内部如何工作的呢?
类型转换器
Converter接口
public interface Converter<S,T> { @Nullable T convert(s var1); }
- 请求参数年龄数据(String→Integer)
- 日期格式转换(String → Date)
如果不能进行类型转化一定要把@EnablewebMvc开启。
@EnableWebMvc功能之一:根据类型匹配对应的类型转换器
请求的学习目前到这里,那么接下来进入到响应的学习。
二、响应
2.1响应页面
//响应页面 @RequestMapping("/toJumpPage") public String toJumpPage() { System.out.println("跳转页面"); return "page.jsp"; }
2.2响应数据(都需要加@ResponseBody)
文本数据
//响应文本数据 @RequestMapping("/toText") @ResponseBody public String toText() { System.out.println("返回纯文本数据"); return "response text"; }
json数据
//响应Json对象 @RequestMapping("/toJsonPOJO") @ResponseBody public User toJsonPOJO() { System.out.println("响应json对象数据"); User user= new User(); user.setAge(20); user.setName("Lyle"); return user; } //响应POJO集合对象 @RequestMapping("/toJsonList") @ResponseBody public List<User> toJsonList() { User user1 = new User(); User user2 = new User(); user1.setAge(20); user1.setName("Lyle"); user2.setAge(20); user2.setName("ylm"); List<User> userList = new ArrayList<>(); userList.add(user1); userList.add(user2); System.out.println("响应POJO集合对象"); return userList; }
名称:@ResponseBody
类型:方法注解
位置: SpringMVC控制器方法定义上方
作用(在这换了):设置当前控制器返回值作为响应体,实现类型自动转化新接口帮忙实现转换。
类型转换器:HttpMessageConverter接口
结语:
SpringMVC请求与响应的学习到此结束,我是Lyle,我们下次继续深入学习SpringMVC。