1.接收普通请求参数
传递过来的参数名称和HTTP的一致时,无须任何注解直接可以获取参数信息;如果不一致,无法获取。(参数允许为空)
(1)接收的参数为某一字段,这里的例子是发送ajax请求,data中的id既是发送请求的参数。如果是表单中的某一个字段,则要name属性的值跟参数名一样才能接收参数信息。
$.ajax({
type: 'get',
url: '<%=basePath%>/account/deleteAccountById',
data: {id: data.id},
success: function (result) {
if (result.code == 0) {
window.location.reload();//刷新当前页面
}else {
layer.msg('eles:删除失败!' + result.msg, {icon: 2, time: 500});
}
}
})
@RequestMapping("deleteAccountById")
@ResponseBody
public Map<String, Object> deleteAccountById(Integer id){
accountService.deleteAccountById(id);
Map<String,Object> map = new HashMap<>();
map.put("code","0");
map.put("count","1000");
map.put("msg","");
return map;
}
(2)接受的参数为pojo对象,跟字段一样,如果是表单,则表单的name属性要与pojo对象中的每一个属性值相同。
//前端代码
$.ajax({
type: 'POST',
url: '<%=basePath%>/account/addAccount',
data: data.field,
dataType:'json',
async: true,
success: function (result) {
console.log(result.code);
if (result.code == 0) {
layer.msg('success:保存成功', {icon: 1, time: 500});
setTimeout(function () {
parent.location.href = "<%=basePath%>/account/toAccount";
}, 1000);
} else {
console.alert(result.code);
layer.msg('eles:保存失败!' + result.msg, {icon: 2, time: 500});
layer.close(index);
}
}
});
//控制器代码
@RequestMapping("addAccount")
@ResponseBody
public Map<String,Object> addAccount(Account account){
Integer role_id = roleService.findIdByName(account.getRole_name());
account.setRole_id(role_id);
accountService.addAccount(account);
Map<String,Object> map = new HashMap<>();
map.put("code","0");
map.put("msg","");
return map;
}
2.使用@RequestParam注解获取参数
使用场景:在name属性值与字段值或者pojo的属性值不同时,获取参数;或者是想获取某个参数的值,但没有对应的字段或者pojo属性与其对应。默认参数不能为空。
//前端代码
layui.form.on('submit(save)', function (data) {
var ids = $("#userList").val();
$.ajax({
type: 'POST',
url: '<%=basePath%>/assess/addAssess?ids='+ids,
data: data.field,
dataType:'json',
async: true,
success: function (result) {
if (result.code == 0) {
layer.msg('success:保存成功', {icon: 1, time: 500});
setTimeout(function () {
parent.location.href = "<%=basePath%>/assess/activityInfo";
}, 1000);
} else {
console.alert(result.code);
layer.msg('eles:保存失败!' + result.msg, {icon: 2, time: 500});
layer.close(index);
}
},
error: function (result, type) {
layer.msg('error:保存失败!'+result+":"+type, {icon: 2, time: 500});
}
});
console.log(data.field)
return false;
})
})
//后台代码,这里的ids是获取的一系列的信息id集合,所以需要@RequestParam获取该参数
@RequestMapping("addAssess")
@Transactional
@ResponseBody
public Map<String,Object> addAssess(@RequestParam("ids")String ids,Assess assess){
3.使用URL传递参数
该方法符合RESTFul风格,通过get请求直接发送参数值,如/params/getRole/1,其中1就是参数,该方法就是获取1的值。
{id}代表处理器需要接受一个由URL组成的参数,且参数名称为id,那么在方法中的@PathVariable(“id”)表示将获取这个在@RequestMapping中定义名称为id的参数。
@RequestMappping("/getRole/{id}")
//注解@PathVariable表示从URL的请求地址中获取参数
public String pathVariable(@PathVariable("id")int id){
.......
}
4.传递JSON参数
针对:对于参数的传递还需要更多的参数时,如分页查询。
前端代码传递时:
(1)注意发送的请求中contentType需要指定为”application/json”,data:JSON.stringify(data)//将json转化成字段串传递
(2)在后台代码中,需要使用@ResponseBody注解分页的pojo,如果要返回ajax请求的数据,也需要使用@ResponseBody在方法的前面。
5.接收列表数据和表单序列化
接收列表数据:通过将json数据转换成字符串进行传递,使用new MappingJackson2JsonView()返回json格式数据(只对MoldeAndVIew返回形式)
表单序列化:在前端代码中,使用$(“form”).serialize();
6.重定向
场景:在新增一个角色信息后,需要将新增的数据信息展示给请求者
@RequestMapping("/addRole")
//Model为重定向数据模型,spring MVC会自动初始化
public String addRole(Model model,String roleName){
Role role = new Role();
role.setName(roleName);
//插入角色信息后,会回填角色编号
roleServcice.addRole(role);
model.addAttribute("roleName",roleName);
return "redirect:../assess/assess_info";
}
model是一种数据模型,然后通过返回字符串实现重定向功能。spring mvc有一个约定,当返回的字符串有redirect时,就认定该请求不是转向视图解析器,而是重定向。当然也可以通过modelAndView的addObject添加,然后进行重定向。
但对于传递的参数一般不只是一个两个,而是一个pojo类,可以通过以下方式:
@RequestMapping("/addRole")
public ModelAndView addRole(Role role){
ModelAndView mv = new ModelAndView();
mv.addObject("role",role);
mv.setViewName("redirect:../assess/assess_info");
}
但是这个方法不能实现URL重定向的数据传递。因为HTTP的重定向传递参数是以字符串的形式传递的。这个时候需要通过另一个数据模型RedirectAttribute.
@RequestMapping("/addRole")
//RedirectAttributes对象Spring MVC会自动初始化它
public String addRole(RedirectAttributes rs,Role role){
roleService.addRole(role);
rs.addFlashAttribute("role",role);
return "redirect:../assess/assess_info";
}
该传递方法的原理是:使用addFlashAttribute方法后,Spring MVC会将数据保存到session中,重定向后就会将其清除,这样就可以实现对象数据的重定向。
7.保存并获取属性参数
在开发过程中,有时候我们会暂时将数据存储到HTTP的request对象或者session对象中,或者是从中获取数据。在spring mvc中,通过三个注解获取该数据:(1)@RequestAttribute:获取HTTP的请求(request)对象属性值,用来传递给控制器的参数。(该注解在参数中使用)
public String reqAttr(@RequestAttribute("id")int id)
(2)@SessionAttribute:获取HTTP的请求(session)对象属性值,用来传递给控制器的参数。参数默认不能为空,可以通过required=false修改。
public String reqAttr(@SessionAttribute("id")int id)
(3)SessionAttributes:书上解释:给它配置一个字符串数组,这个数组对应的是数据模型对应的键值对,然后将这些键值对保存到session中。通过传递的参数,会根据名称和类型保存id和角色信息。
//可以配置数据模型的名称和类型,两者取或关系
@SessionAttribute(name={"id"},types={Role.class})
8.@CookieValue和@ReuquestHeader
就是从cookie和HTTP的header中获取对应的请求信息。在方法的参数中使用。默认参数不能为空。
public String HeaderAndCookie(
@ReuqestHeader(value="User-Agent,required=false,defaultValue="attribute")String userAgent,
@CookieValue(value="JSESSIONID",required=false,defaultValue="MyJsessionId")String jsessionId,