url发送过来的请求携带的参数多种多样,SpringMVC提供了诸多注解来解析参数。期目的就是 把控制器从复杂的Servlet API中剥离开来,解耦合,这样就可以在非web容器环境中重用控制器,也方便测试。
请求参数大致可分为5种:
- 普通请求参数
- 需要@RequestParam注解指定获取参数
- 使用URL路径传递参数
- 传递JSON数据参数
- 列表数据参数及表单序列化
假设有Controller如下:
@Controller
@RequestMapping("/params")
public class ParamsController {
//...
}
分述如下:
接受普通请求参数
SpringMVC比较智能化,若传递过来的参数名和HTTP保持一致,那么无需任何注解也可以获取参数
表单提交如下:
<form id="form" action="./params/commonParams.do" method="get">
角色名称:<input id="roleName" type="text" name="roleName" value="">
备注信息:<input id="note" type="text" name="note" value="">
</form>
controller层代码如下:
@RequestMapping("/commonParams")
public ModelAndView commonParams(String roleName, String note){
System.out.println("roleName->" + roleName);
System.out.println("note->" + note);
ModelAndView mv = new ModelAndView();
mv.setViewName("index");
return mv;
}
这里,C层就可以直接获取到提交的参数,前提是参数名称必须和HTTP请求的参数名称保持一致,不一致无法获取;
这种方式允许参数为空
——————————————————————
若是参数很多,可以将参数包装成一个POJO(必有setter和getter方法),只要属性名与参数一一对应,SpringMVC就能够识别
form表单不需要改动,新增POJO接受参数:
public class RoleParams{
private String roleName;
private String note;
//---------getter & setter------------
}
则相应的C中代码改为:
@RequestMapping("/commonParams")
public ModelAndView commonParams(RoleParams roleParams){
System.out.println("roleName->" + roleParams.getRoleParams());
System.out.println("note->" + roleParams.getNote());
ModelAndView mv = new ModelAndView();
mv.setViewName("index");
return mv;
}
可以看出,提交的表单数据被自动包装成了RoleParams 对象
使用@RequestParams获取参数
第一种情况适用于请求参数和C中的方法形参一一对应,若有不对应时,springMVC无法识别,这时需要人为指定,使用@RequestParams注解
如HTTP参数名称从roleName改为了role_name,则C中可作如下处理:
@RequestMapping("/commonParams")
public ModelAndView commonParams(@RequestParams("role_name") String roleName, String note){
System.out.println("roleName->" + roleName);
System.out.println("note->" + note);
ModelAndView mv = new ModelAndView();
mv.setViewName("index");
return mv;
}
若参数被@RequestParams注解,则默认不能为空,可以使用如下控制:
@RequestParams(value="role_name",required=false) String roleName
使用URL传递参数
使用URL传递参数,符合RESTful风格,比如想获取id=1的角色,url可写成“/params/getRole/1”,其中 1 就代表id,
Controller中的可以如下处理:
@Controller
@RequestMapping("/params")
public class ParamsController {
@Autowired
RoleServiceImpl roleService;
@RequestMapping("/getRole/{id}")
public ModelAndView pathVariable(@PathVariable("id") Long id){
Role role = roleService.getRole(id);
ModelAndView mv = new ModelAndView();
//绑定数据模型
mv.addObject(role);
//设为Json视图,返回Json类型的数据给前台
mv.setViewName(new MappingJackson2JsonView());
return mv;
}
}
{id}代表了处理器需要接受一个由URL组成的参数,参数名为id,方法中的@PathVariable(“id”)就代表取出url中的id参数;
@PathVariable允许对应参数为空
传递JSON类型参数
若客户端传递过来是JSON对象参数,则使用@RequestBody注解获取,参数依然要一一对应
假设客户端使用JQuery向服务端传递JSON:
$(document).ready(function() {
//JSON数据和RoleParams一一对应
var data = {
roleName: 'role',
note: 'note_message'
}
//向后台发送请求
$.post({
url: ".params/findRoles.do",
//这里必须告知传递类型为JSON
contentType: "application/json",
//HTTP只能传递字符串,必须将JSON转为字符串形式
data: JSON.stringify(data),
success: function(result){}
});
});
则处理器中使用@RequestBody获取JSON参数,包装为一个POJO处理:
@RequestMapping("/findRoles")
public ModelAndView findRoles(@RequestBody RoleParams roleParams){
System.out.println("roleName->" + roleParams.getRoleParams());
System.out.println("note->" + roleParams.getNote());
ModelAndView mv = new ModelAndView();
mv.addObject(role);
mv.setViewName(new MappingJackson2JsonView());
return mv;
}
接受列表数据参数及表单序列化
用Java的集合或者数组来接受JSON传来的数组类型
前台代码:
$(document).ready(function() {
//JSON数据和RoleParams一一对应
var roleList = [
{roleName: 'abc', note: 'abc_note'},
{roleName: 'ABC', note: 'ABC_note'},
{roleName: 'xyz', note: 'xyz_note'},
]
//向后台发送请求
$.post({
url: ".params/findRoles.do",
//这里必须告知传递类型为JSON
contentType: "application/json",
//HTTP只能传递字符串,必须将JSON转为字符串形式
data: JSON.stringify(roleList ),
success: function(result){}
});
});
后台处理:
@RequestMapping("/addRoles")
public ModelAndView addRoles(@RequestBody List<Role> roleList){
ModelAndView mv = new ModelAndView();
int totle = roleService.addRoles(roleList)
mv.addObject("totle", totle);
mv.setViewName(new MappingJackson2JsonView());
return mv;
}
提交序列化表单:
$(document).ready(function() {
$("#commit").click(function(){
var str = $("form").serialize();
$.post({
url: "./params/comonParamPojo2.do",
//序列化后,数据将以 roleName=xxx&¬e=yy 的形式传递
data: $("form").serialize(),
success: function(result){}
});
});
});