目录
[案例:访问 OrderController类的pirntUser方法报错:java.lang.IllegalStateException:映射不明确](#案例:访问 OrderController类的pirntUser方法报错:java.lang.IllegalStateException:映射不明确)
[一 ,常见的字符串和数字类型的参数接收方式](#一 ,常见的字符串和数字类型的参数接收方式)
[1.1 请求路径的参数名和业务方法中的参数名保持一致的情况](#1.1 请求路径的参数名和业务方法中的参数名保持一致的情况)
[1.2 请求路径参数名和业务方法中参数不同名的情况](#1.2 请求路径参数名和业务方法中参数不同名的情况)
springmvc处理请求映射路径
场景 :在实际的应用开发中,需要写不同的模块,在这些模块中,不同的方法可能具有相同的映射路径如 订单模块,用户登录模块,他们在方法上映射路径都是/user 。 这就会导致无法准确找到目标方法报错。
案例:访问 OrderController类的pirntUser方法报错:java.lang.IllegalStateException:映射不明确
UserController类
java
package controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
@Controller
public class UserController {
/*
在Java的Spring MVC中,如果返回的字符串在浏览器中显示为乱码(如三个问号),通常是因为响应内容的字符编码设置不正确。
设为utf-8
1 在@RequestMapping中指定produces属性 设置为utf-8
2 使用@RestController注解 默认使用utf-8编码
*/
@RequestMapping(value = "/user",produces = "text/plain;charset=utf-8")
@ResponseBody
public String printloginInfo(){
System.out.println("打印登录用户信息。。。。");
return "打印登录用户信息。。。。。";
}
}
OrderController类
java
package controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
@Controller
public class OrderController {
@RequestMapping(value = "/user", produces = "text/plain;charset=utf-8")
@ResponseBody
public String pirntUser(){
System.out.println("打印订单中顾客信息。。。。");
return "正在打印订单中顾客信息....";
}
}
测试:报500服务器内部错误!

核心错误信息
java
/*
原因:java.lang.IllegalStateException:映射不明确。无法映射"userController"方法
控制器。用户控制器#登录(字符串,String)
对于{[/user],生成[text/plain;charset=utf-8]}:已经存在'orderController'bean方法
*/
Caused by: java.lang.IllegalStateException: Ambiguous mapping. Cannot map 'userController' method
controller.UserController#login(String, String)
to { [/user], produces [text/plain;charset=utf-8]}: There is already 'orderController' bean method
**解决办法:**在controller类上使用@RequestMapping("类路径"),进一步区分不同模块的方法
这里在OrderController类上,添加一级目录,进一步完善对方法的访问
注意:我把写在类上的@RequestMapping 称为 "一级目录";写在方法上的称为"二级目录"

测试:
访问OrderController类的方法成功!

访问UserController类方法成功!

springmvc接收参数
一下案例,皆使用Apifox,模拟请求发送
一 ,常见的字符串和数字类型的参数接收方式
1.1 请求路径的参数名和业务方法中的参数名保持一致的情况
案例


测试结果

1.2 请求路径参数名和业务方法中参数不同名的情况
大家,请看,如果修改请求参数名,当请求参数与映射参数不一致时,就会报错!


测试

解决办法:使用@RequestParam 注解,写在参数上
@RequestParam:给映射参数写别名


测试

二,请求路径传参是实体对象时
场景1:访问printUser1方法返回user对象
在这一个过程中,我出现的问题(可选):
1 一直无法将user对象转成json格式
1.1 添加json格式依赖
1.2 springmvc 消息转成器 配置类
1.3 在springmvc配置类中加载config所在包
1.4 在RequestMapping注解 要求user对象使用json格式
----------解决:springmvc工程 响应时,将实体类对象 转换成json格式数据-CSDN博客
User实体类

使用Apifox发送请求

java
//传递对象
@RequestMapping(value = "/user2", produces = "application/json")
public User printUser1(User user) {
System.out.println(user);
return user;
}
测试

三,请求路径传参的实体对象中还有实体对象
java
// 传递 对象嵌套
@RequestMapping("/user3")
public User printUser2(User user) {
System.out.println(user);
return user;
}


测试

四,接收数组类型的参数
java
// 传递数组
@RequestMapping("/user4")
public String printUser3(String[] name) {
for (String s : name) {
System.out.println(s);
}
return "success";
}
测试


五,接收集合类型的参数
java
//传递集合
@RequestMapping("/user5")
public String printUser4(@RequestParam List<String> name){
for (String s : name) {
System.out.println(s);
}
return "success";
}
测试

六,接收json格式的参数
须知:客户端向服务器,发送数据都是以json格式传递的
如果要使用json格式接收请求参数要求:
1 引用json格式依赖
java
<!-- Jackson核心库 -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.13.0</version>
</dependency>
<!-- Jackson数据绑定库 -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.13.4.2</version>
</dependency>
2 使用@EnableWebMvc 注解,开启json

3在controller类方法上使用@RequestBody注解
@RequestBody注解作用
1 将json数据实现对实体类对象的转换
6.1,json转成实体对象
java
//json格式传递对象
@RequestMapping("/user6")
public User printUser5(@RequestBody User user){
System.out.println(user);
return user;
}
测试

6.2,json转成集合对象
java
//json格式传递集合
@RequestMapping("/user7")
public String printUser6(@RequestBody List<String> name){
for (String s : name) {
System.out.println(s);
}
return "success";
}
测试


6.3,json转成集合对象,集合中存放的是实体对象
java
//json格式对象嵌套传递
@RequestMapping("/user8")
public User printUser7(@RequestBody User user) {
System.out.println(user);
return user;
}
七,日期类型参数传递
当日期类型的格式是年/月/日这种时,只需要用Date类对象接收就可以了,
但是当格式是年-月-日这种时,就需要用注解@DateTimeFormat(pattern = "yyyy-MM-dd")来进行处理才不会报错。具体案例看下图:
总结
@DateTimeFormat注解作用:将传入的字符串参数转换为 Date 类型
按照指定格式输出 Date 对象,就得运用 SimpleDateFormat 类来进行格式化
java
@RequestMapping("/user9")
public String printUser8(Date date1,@DateTimeFormat(pattern = "yyyy-MM-dd")
Date date2, @DateTimeFormat(pattern = "yyyy/MM/dd HH:mm:ss") Date date3) {
System.out.println("date1"+date1);
System.out.println("date2"+date2);
System.out.println("date3"+date3);
return "success"+date1+date2+date3;
测试

控制台输出:
