1. 形参属性名即为请求数据的键名
问题:
让DispatcherServlet将请求数据获取后传递给单元方法,但是请求数据的获取需要数据的键名,而DispatcherServlet不是我们自己声明的无法修改其底层代码,怎么将请求数据的键名告诉给DispatcherServlet呢?
解决:
在单元方法上声明形参来接收请求数据时,形参名必须和请求数据的键名一致,DispatcherServlet会将调用单元方法的形参名作为请求数据的键名获取请求数据,然后传递给单元方法。
实现:
2. 形参名和请求数据的键名不一致
问题:
如果单元方法的形参名和请求数据的键名一致,DispatcherServlet底层会自动
将请求数据获取后传递给单元方法使用,我们在单元方法中直接使用即可,美滋滋
但是在实际生产环境中,前台请求数据的页面是由张三编写,而后台对应的请求处 理的单元方法是李四声明的。而张三和李四因为沟通不及时,造成张三前台请求
数据的键名和李四后台单元方法的形参名不一致,怎么办?
解决:
① 让张三修改其前台页面请求数据的键名,改成和李四的单元方法的形参名
一致。这样虽然可以但是不现实,因为我们请求数据的键名,在前台有
可能被Js或者CSS在使用,一旦修改造成大量代码失效。
② 让李四修改其单元方法的形参名,改成和请求数据的键名一致。这样虽然
可以但是不现实,因为在单元方法的方法体中我们已经使用形参来进行逻
辑处理了,形参名修改,造成方法体代码也必须修改,工作量比较大。
③ 在请求数据的键名和单元方法的键名之间声明一个过渡的变量,来完成
请求数据的获取。
实现:
在单元方法上的形参声明中使用注解@RequestParam来实现。
3. 使用实体类对象获取请求数据
问题:
在学习了使用SpringMVC后,我们可以在单元方法上声明形参直接获取请求数据
只要形参名和请求数据的键名一致即可。但是如果我们的请求数据过多,总不能咱
们声明N个形参来接收请求数据吧?而且按照我们以往的开发经验,请求数据过多
我们会将请求封装到实体类对象中进行使用,保证数据的完整性。那么,在Spring
MVC中一旦请求数据过多,如何在单元方法上获取请求数据呢?
解决:
我们希望在单元方法中直接获取一个封装好请求数据的实体类对象使用,美滋滋。
也就说我们希望DispatcherServlet可以将请求数据封装到实体类对象中,然后将
实体类对象作为实参传递给单元方法使用。在单元方法上声明对应的实体类的形参
类型,来接收DispatcherServlet传递的封装了请求数据的实体类对象,以及告诉
DispatcherServlet使用哪个实体类来封装请求数据。而且,要求实体类的属性名
必须和请求数据的键名一致,DispatcherServlet会按照该方式将请求数据赋值给
实体类的属性。
实现:
/** |
4. 获取同键不同值的请求数据
问题:
目前我们在单元方法上可以使用形参或者实体类来接收请求数据,美滋滋。但是
有某些请求中,请求数据是同键不同值的。比如,在页面中的多项选择的请求数据,
爱好,fav=1&fav=2&fav3.像这样的请求数据,如何获取呢?
解决:
我们自己使用Request对象获取同键不同值的数据,使用 req.ParameterValues(“键名”),返回值是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. 混合使用紧耦和解耦方式获取请求数据
问题:
目前我们可以在单元方法中使用形参,实体类,request对象方式获取请求数据,
但是如果请求中的数据,一部分要放入到对应的实体类中,一部分要使用形参直接
获取怎么办?
解决:
我们可以在单元方法上根据自己的需求来声明形参获取请求数据, DispatcherServlet会想尽一切办法给我们声明的单元方法的形参赋值。那么如果
没有赋值,则表明形参声明有问题。我们的获取请求数据的方式可以混合使用。
实现:
/** * 单元方法请求数据获取方式混合使用 */ @RequestMapping("argAll") public String demoArgAll(User user,String uname,String[] fav,HttpServletRequest request){ //处理请求 System.out.println("MyController.demoArgAll:获取请求数据方式混合使用:"+user +":"+uname+":"+fav[0]+":"+ request.getParameter("uname")); //响应结果 return "aa"; }