重定向操作如何实现传参?
1、借助session,将request域对象中的键值对转存到session域对象中,如何转存:@SessionAttributes
2、实现----第一种实现方式:可能存在弊端是加入键值对只需要使用一次,那么在用完之后并没有从session域对象中消失,还一直占用空间,不合适;可以借用session的移除键值对方法removeAttribute()消除
1)页面第一次请求
<a href="redirect.action?id=10">提交</a>
2)第一个处理单元
@RequestMapping("/redirect.action")
public String address2(int id,Model model) {
System.out.println("first:"+id);
model.addAttribute("id", id);//转到request域对象的
return "redirect:/second.action";
}
3)第二个处理单元
@RequestMapping("/second.action")
public String second(HttpServletRequest request) {
HttpSession session = request.getSession();
Object id = session.getAttribute("id");
//二次请求时从session中获取键值对
System.out.println("second:"+id);
return "/main.jsp";
}
4)响应页面
<body>
main.....
<hr>
${sessionScope.id }
</body>
5)注意需要在类上添加注解,实现request域转入session域操作
@Controller
@SessionAttributes(value = {"id","name"})//将键值对放入session域对象中
public class RedirectController {
注解的value属性可以设置的是字符串数组,值是多个字符串,每个字符串表示一个key名称
3、实现----第二种实现方式 此方式仅仅只在一次重定向操作中能够传递参数,同样借助session域对象没有问题
1)第一次请求
<a href="redirectSec.action?id=101">提交</a>
2)第一个执行单元
@RequestMapping("/redirectSec.action")
public String redirect(int id,RedirectAttributes ra) {
System.out.println("first:"+id);
//同样实现将键值对保存到session域对象,但是session域对象中并没有一直保存
//只不过二次请求的url后面带有此键值对
// ra.addAttribute("id", id);
ra.addFlashAttribute("id", id);//作用是消除重定向操作时url后面的键值对
return "redirect:/sec.action";
}
3)第二个执行单元
@RequestMapping("/sec.action")
public String sec(@ModelAttribute("id")int id) {
System.out.println("second:"+id);
return "/main.jsp";
}
4)main页面
<body>
main.....
<hr>
${sessionScope.id }
<hr>
${param.id }<!-- 如果url后面有键值对那么通过此格式可以获取,如果没有键值对,那么获取不到 -->
</body>