springmvc解耦方式获取请求数据
1.形参属性名即为请求数据的键名
实现:
/**
- 解耦方式获取请求数据:单元方法的形参名和请求数据的键名一致
- 注意①:
-
如果形参名和请求数据的键名不一致,不会报错,传入null。
- 注意②:
-
如果请求数据的类型和后台单元方法的形参的类型不匹配,则会报400异常或者类型转换异常
- 注意③:
-
如果形参类型为基本类型,则如果请求中没有对应的请求数据,可能会出现
-
数据类型转换异常,比如:将null转换为int,建议将形参都声明为包装类的类型
*/
@RequestMapping(“reqDataByArgName”)
public String getDataByArgName(String uname,Integer age){
//处理请求
System.out.println(“解耦方式形参名为键名获取请求数据:”+uname+age);
//响应结果
return “aa”;
}
2.形参名和请求数据的键名不一致
解决:
①让张三修改其前台页面请求数据的键名,改成和李四的单元方法的形参名
一致。这样虽然可以但是不现实,因为我们请求数据的键名,在前台有
可能被Js或者CSS在使用,一旦修改造成大量代码失效。
②让李四修改其单元方法的形参名,改成和请求数据的键名一致。这样虽然
可以但是不现实,因为在单元方法的方法体中我们已经使用形参来进行逻
辑处理了,形参名修改,造成方法体代码也必须修改,工作量比较大。
③在请求数据的键名和单元方法的键名之间声明一个过渡的变量,来完成
请求数据的获取。
实现:
在单元方法上的形参声明中使用注解@RequestParam来实现。
/**
- 解耦方式获取请求数据:形参名和请求数据的键名不一致
- 解释:
- DispatcherServlet默认是使用单元方法的形参名即为请求数据的键名来获取请求数据的
- 那么如果形参名和请求数据的键名不一致, 则在单元方法上的形参前使用注解
- @RequestParam来指明请求数据的键名
- 使用:
-
value属性:声明请求数据的键名,如果只有value时,value可以省略不写
-
required:true|false,设置为true表示请求中必须携带键名为指定键名的请求数据,否则400
-
defaultValue:默认值,如果请求中没有对应的请求数据,则使用默认值,不建议和required一起使用
*/
@RequestMapping(“getDataByReqParam”)
public String getDataByReqParam(@RequestParam(value = “name”,defaultValue = “哈哈”) String uname, Integer age){
//处理请求
System.out.println(“解耦方式获取请求数据:形参名和请求数据的键名不一致:”+uname+age);
//响应结果
return “aa”;
}
3.使用实体类对象获取请求数据
解决:
我们希望在单元方法中直接获取一个封装好请求数据的实体类对象使用,美滋滋。
也就说我们希望DispatcherServlet可以将请求数据封装到实体类对象中,然后将
实体类对象作为实参传递给单元方法使用。在单元方法上声明对应的实体类的形参
类型,来接收DispatcherServlet传递的封装了请求数据的实体类对象,以及告诉
DispatcherServlet使用哪个实体类来封装请求数据。而且,要求实体类的属性名
必须和请求数据的键名一致,DispatcherServlet会按照该方式将请求数据赋值给
实体类的属性。
实现:
/**
*解耦方式使用实体类对象接收请求
- 要求:
- 实体类的属性和请求数据的键名一致,必须提供get/set方法。
- 注意:
- 实体类的属性类型使用包装类,避免请求中没有对应的数据时出现类型转换异常。
*/
@RequestMapping(“argObject”)
public String demoArgObject(User user){
//处理请求
System.out.println(“MyController.demoArgObject:请求数据使用实体类对象接收:”+user);
//响应结果
return “aa”;
}
4.获取同键不同值的请求数据
解决:
我们自己使用Request对象获取同键不同值的数据,使用 req.getParameterValues(“键名”),返回值是String[]数组。在单元方法上声明形 参,类型为String[]数组类型,要求形参名和请求数据的键名一致即可。
实现:
/**
- 解耦合方式获取同键不同值的数据
- 要求:
-
使用String类型的数组来接收,形参名为请求数据的键名
*/
@RequestMapping(“argKeyNotValue”)
public String demoArgKeyNotValue(String uname,Integer age,String[] fav){
//处理请求数据
System.out.println(“MyController.demoArgKeyNotValue:获取同键不同值的请求数据:”+uname+":"+age+":"+fav[0]);
//响应结果
return “aa”;
}
5.混合使用紧耦和解耦方式获取请求数据
解决:
我们可以在单元方法上根据自己的需求来声明形参获取请求数据, DispatcherServlet会想尽一切办法给我们声明的单元方法的形参赋值。那么如果
没有赋值,则表明形参声明有问题。我们的获取请求数据的方式可以混合使用。
实现:
/**
- 紧耦合方式和解耦方式混用
*/
@RequestMapping(“getData”)
public String getData(User user,@RequestParam(“uname”) String name,Integer age,String[] fav,HttpServletRequest request){
//处理请求
System.out.println(“实体类:”+user);
System.out.println(“形参名:”+name+age);
System.out.println(“同键不同值:”+fav);
System.out.println(“request对象的:”+request.getParameter(“uname”));
//响应结果
return “aa”;
}