Spring实战14——跨重定向传递数据

必备知识:

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的中的值。
	}

猜你喜欢

转载自blog.csdn.net/pigqhf/article/details/89307104