必备知识:
SpringMVC 中的重定向与转发:
转发:forward:+ url。请求转发类型是不会变的,比如post 请求,那么转发后调用的方法也是post 请求类型。
重定向:redirect:+ url。重定向后是发起一个新的Get 请求,model 中的属性和值以参数形式附加在get 请求的url 上。原来的请求和模型消失。
这里讨论重定向如何带参数的两种方式:
1.通过url 中使用占位符,只限String 和数字值。
2.使用flash 属性,支持对象。原理是重定向前把model 数据保存在session 中,重定向后取出。
1.通过url 中使用占位符,只限String 和数字值。
/**
* 带参数重定向:redirect:重定向时原始的请求结束,然后会发起一个新的GET请求。原请求中的model模型数据也跟随原来的请求一起消失,而转发的model不会消失。
* 1.如果model属性值不为null,则在重定向路径中会自动以get的参数添加到重定向的url上
* 2.如果有{},其中占位符的参数是model的属性,则会将不安全字符进行转义。只允许是String和数字值。。
* 3.使用flash属性,可以传对象
*/
@RequestMapping(value = "/register1", method = RequestMethod.POST)
public String processRegistration1(@Valid Student student, BindingResult bindingResult, Model model) {//传过来的参数保存到对象中,使用默认构造器,getter和setter方法。
System.out.println(student.getName());
System.out.println(student.getAge());
if(bindingResult.hasErrors()) {
System.out.println(bindingResult.getFieldError().getDefaultMessage());
return "student/register";
}
studentService.save(student);
model.addAttribute("id", student.getId());
model.addAttribute("age", student.getAge());
model.addAttribute("name", student.getName());
model.addAttribute("student", student);//没使用flash属性,不会保存
//return "redirect:/student/" + student.getId();不安全
return "redirect:/student/{id}";
}
重定向函数:
/**
* 使用占位符,通过路径参数接收,{stuId}与@PathVariable("stuId")绑定,把值传递给参数stuId
* @param stuId
* @param model
* @return
*/
@RequestMapping(value = "/{stuId}", method = RequestMethod.GET)
public String profile(
@PathVariable("stuId") String stuId,//@PathVariable不指定value的话,默认与方法参数名相同
Model model) {
System.out.println(model.toString());//没使用flash属性,所以为空。
model.addAttribute(studentService.getOne(stuId));
return "student/profile";
}
2.使用flash 属性,支持对象
@RequestMapping(value = "/register2", method = RequestMethod.POST)
public String processRegistration2(
@Valid Student student,
BindingResult bindingResult,
RedirectAttributes rmodel) {//传过来的参数保存到对象中,使用默认构造器,getter和setter方法。
System.out.println(student.getName());
System.out.println(student.getAge());
if(bindingResult.hasErrors()) {
System.out.println(bindingResult.getFieldError().getDefaultMessage());
return "student/register";
}
studentService.save(student);
rmodel.addAttribute("id", student.getId());
rmodel.addAttribute("age", student.getAge());
rmodel.addAttribute("name", student.getName());
rmodel.addFlashAttribute("student", student);//添加flash属性
/**
* 原理:重定向执行之前,把所有flash 属性复制到会话中,重定向后从会话中去除并转移到model中
*/
return "redirect:/student/{id}/{name}";//return "redirect:/student/" + student.getId();不安全
}
重定向函数:
@RequestMapping(value = "/{stuId}/{name}", method = RequestMethod.GET)
public String profile1(
@PathVariable("stuId") String stuId,//@PathVariable不指定value的话,默认与方法参数名相同
@PathVariable("name") String name,
Model model) {
System.out.println("重定向后model中:");
System.out.println(model.toString());
if(!model.containsAttribute("student")) {
studentService.getOne(stuId);
}
return "student/profile";//返回视图,视图中取model的中的值。
}