请求
提出问题,当SpringMVC管理的bean,也就是controller包下被@Controller注解的类,当两个不同业务的Controller有一个相同的方法时,这里两个方法名一样没事,主要是请求路径一样,会冲突,
例如
@Controller
public class UserController {
@RequestMapping("/save")
@ResponseBody
public String save(){
System.out.println("user save ...");
return "{'info':'springmvc':'User'}";
}
}
public class BookController {
@RequestMapping("/save")
@ResponseBody
public String save(){
System.out.println("book save ...");
return "{'info':'springmvc' :'BOOK'}";
}
}
解决方式一,设置模块名作为请求路径
@Controller
public class UserController {
@RequestMapping("/user/save")//改动处
@ResponseBody
public String save(){
System.out.println("user save ...");
return "{'info':'springmvc':'User'}";
}
}
public class BookController {
@RequestMapping("/book/save")
@ResponseBody
public String save(){
System.out.println("book save ...");
return "{'info':'springmvc' :'BOOK'}";
}
}
解决方式二,使用@RequestMapping注解设置类的前缀
//方式二
@RequestMapping("/user")
public class UserController {
@RequestMapping("/save")
@ResponseBody
public String save(){
System.out.println("user save ...");
return "{'info':'springmvc':'User'}";
}
}
@RequestMapping("/user")代表请求路径前缀
@RequestMapping("/save")代表请求路径后缀
GET请求和POST请求发送普通参数
使用插件postman
GET请求
使用pastman对web服务器发送GET请求,并携带请求参数name = tishicha
在对应的commonParam方法形参列表中直接使用对应类型接收即可,例如
@Controller
public class User1Controller {
@RequestMapping("/commonParam")
@ResponseBody
public String commonParam(String name,int age){
System.out.println("已接收到普通参数...");
System.out.println(name);
System.out.println(age);
return "{'module';'common Param'}";
}
}
POST请求
post请求发送普通参数也是一样,只需要让请求体里的参数和bean里方法形参列表一致即可
需要注意的是Body中form-data和x-www-form-urlencoded的区别在于前者可以发送文件类型的参数
解决get或post请求参数中带有中文,接收会乱码问题
在web配置文件中,重写getServletFilters()方法,让后返回一个过滤器数组,例如
@Override
protected Filter[] getServletFilters() {
return new Filter[]{};
}
SpringMVC提供了一种获取过滤器的方式,如下
@Override
protected Filter[] getServletFilters() {
CharacterEncodingFilter filter = new CharacterEncodingFilter();
filter.setEncoding("UTF-8");
return new Filter[]{filter};
}
}
new一个CharacterEncodingFilter()示例,就可以得到一个过滤器,再为过滤器设置编码,为返回的过滤器集合赋值就可以了
需要注意的是,不管是get请求还是post请求,请求的key值必须和接收请求参数方法中形参列表里的形参名一一对应,才能把请求参数映射进方法里。但是有方法可以解决耦合问题,使用@RequestParam注解将绑定请求key值和接收方法中的形参绑定,形参名就可以随意定义
@Controller
public class User1Controller {
@RequestMapping("/commonParam")
@ResponseBody
public String commonParam(@RequestParam("name") String name1,@RequestParam("age") int age1){
System.out.println("已接收到普通参数...");
System.out.println(name1);
System.out.println(age1);
return "{'module';'common Param'}";
}
}
pojo参数请求
是指web服务器接收的参数类型是一个对象类型,接收的参数key名要和一个实体类中的成员变量名一致即可,示例如下
@Controller
public class User1Controller {
@RequestMapping("/pojoParam")
@ResponseBody
public String pojoParam( User user) {
System.out.println("pojo参数请求收到" + user);
return "'module':'pojo param'";
}
}
只需要形参列表中的User类中有name和age这两个成员变量即可实现接收pojo类型参数
当User类中有别的成员变量时,就形成了pojo参数嵌套,例如
此时请求参数应该用user1.成员变量名的方式传参数
数组参数请求
当需要接收一个数组类型的参数时
@Controller
public class User2Controller {
@RequestMapping("/arrayParam")
@ResponseBody
public String arrayParam(String[] likes) {
System.out.println("array参数请求收到" + Arrays.toString(likes));
return "'module':'array param'";
}
}
参数请求格式是,数组名对应一个value,key值都是数组名
集合参数请求
如何接收一个集合请求参数
@Controller
public class User2Controller {
@RequestMapping("/listParam")
@ResponseBody
public String listParam(@RequestParam List<String > likes) {
System.out.println("list参数请求收到" + likes);
return "'module':'list param'";
}
}
和数组类似,只是要使用@RequestParam注解,把参数给到集合里,不加会将集合看成一个pojo,从而报错。
传递json数据
在SpringMVC配置文件上使用注解@EnableWebMvc让SpringMVC能将json数据转换成对象的功能
- 接收集合String类型的Json
-
@Controller public class User3Controller { @RequestMapping("/jsonParam") @ResponseBody public String jsonListParam( @RequestBody List<String > likes) { System.out.println("json-list参数请求收到" + likes); return "'module':'json-List param'"; } }
@RequestBody注解告知SpringMVC是一个Json数据,去请求体里解析参数,在一个商法定义上只能用一次
-
- 接收pojo类型json
-
@RequestMapping("/jsonParam1") @ResponseBody public String pojoParam(@RequestBody User user) { System.out.println("pojo参数请求收到" + user); return "'module':'json-pojo param'"; }
也是需要使用@RequestBody注解。
-
- 接收集合pojo类型json
-
@RequestMapping("/jsonParam2") @ResponseBody public String listpojoParam(@RequestBody List <User> list) { System.out.println("list-pojo参数请求收到" + list); return "'module':'json-list-pojo param'"; }
和上面类似,主要是json的数据格式不一样
-
@RequestBody和@RequestParam 区别
- 前者主要用于接收json参数
- 后者主要用于接收url地址传参,表单传参
日期形参传递
日期类型数据基于系统不同格式也不相同,例如
- * 2022-06-18
- 这种格式日期由于不是标准日期,所以在接收参数时需要加上@DateTimeFormat注解,并且为pattern指定一种格式,就可以接收这种个格式的日期参数
-
@RequestMapping("/dateParam1") @ResponseBody public String dateParam1(@DateTimeFormat(pattern = "yyyy-mm-dd") Date date) { System.out.println("日期类型参数请求收到" + date); return "'module':'date param'"; }
-
- 这种格式日期由于不是标准日期,所以在接收参数时需要加上@DateTimeFormat注解,并且为pattern指定一种格式,就可以接收这种个格式的日期参数
- *2022/05/09
- 这种格式的日期参数是标准格式,直接用Date对象接收即可
-
@RequestMapping("/dateParam") @ResponseBody public String dateParam(Date date) { System.out.println("日期类型参数请求收到" + date); return "'module':'date param'"; }
-
- 这种格式的日期参数是标准格式,直接用Date对象接收即可
响应
- 名称:@ResponseBody
- 位置:定义在SpringMVC控制器方法上方
- 作用:设置当前控制器返回值为响应体
当响应的是一个界面时是不需要在接收请求的方法上加@ResponseBody注解的,主要将响应页面的名字返回就好 例如
//响应页面/跳转页面
//返回值为String类型,设置返回值为页面名称,即可实现页面跳转
@RequestMapping("/toJumpPage")
public String toJumpPage(){
System.out.println("跳转页面");
return "page.jsp";
}
当响应参数不是一个页面时,是需要加上@ResponseBody注解的,例如字符串,数组,集合 ,json,了解一下响应json参数是时,是json的依赖将pojo转换成json参数的
//返回值为实体类对象,设置返回值为实体类类型,即可实现返回对应对象的json数据,需要依赖@ResponseBody注解和@EnableWebMvc注解
@RequestMapping("/toJsonPOJO")
@ResponseBody
public User toJsonPOJO(){
System.out.println("返回json对象数据");
User user = new User();
user.setName("itcast");
user.setAge(15);
return user;
}