Spring MVC的重定向与转发
SpringMVC 在controller
层的转发
和重定向
与Servlet的有些不一样,在实际使用时碰到各种小问题,现对对这个常用的基本功能做下总结。
重定向与转发
SpringMVC 重定向
和转发
是将视图名(viewName
)设置成目标Controller
处理器的映射地址(完整地址:类映射+方法映射),在映射地址前面增加重定向标志(redirect
)或转发标志(forward
)。如下示例:
- 重定向:
return "redirect:/redirect/saveUser"
; - 转发:
return "forward:/forward/uList"
;
两者区别
- 重定向
- 重定向是两条
GET
请求,浏览器的 URL 地址会变,跳转为目标 Controller 的映射地址。 - 重定向请求拼接的参数(在URL手动拼接和model模型封装)都会显示在 URL 地址。
- 重定向的目标方法只能通过
req.getParameter()
方法从 URL 中获取参数,如果需要页面显示,需再用模型model
封装参数给到视图。 - 带参数跳转有两种情况:优先使用URL拼接的参数
4.1 在 URL 上手动拼接参数:不能读取到中文字符,获取到的是空(占位符);如果参数是包含中文,可以获取其它英文和数字字符,中文字符被空格代替。
4.2 通过model
封装参数:可以读取到中文字符,在目标 Controller方法取出参数,需对参数进行UTF-8
转码再封装到model
里,JSP页面才能正常显示中文。
- 重定向是两条
- 转发
- 转发是一条
POST
请求,浏览器地址不变,用户是感觉不到的。 - 转发传递参数给目标 JSP 页面来显示,源方法只能使用模型
model
来封装参数,不能在 URL 上拼接参数。因是一条request
,参数共享;不用在目的方法取出参数再次封装。 - 转发到的目标方法如果要取出页面显示的参数只能使用
request.getAttribute()
方法; - 带参数转发,中文字符显示需要在 Tomcat 配置链接编码为
UTF-8
。 - 转发的 URL 也可以拼接参数,但浏览器不会显示参数。在目标方法可以通过
req.getParameter()
方法取出;如果不在目标方法取出参数使用model
再次封装,则页面不会显示该参数内容。
- 转发是一条
- model 封装参数方法
- model.addAttribute()
- modelAndView.addObject()
- @ModelAttribute 绑定请求参数到Model对象
示例代码
重定向
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129/**
* 重定向:两条请求,URL地址会变。
*
* @author Rocky
*
*/
public class RedirectController {
public String uList() {
return "userList";
}
public String showParam(HttpServletRequest req) throws UnsupportedEncodingException {
// 使用request.getParameter()从重定向请求中获取参数
int age = Integer.valueOf(req.getParameter("age"));
String name = new String(req.getParameter("name").getBytes("iso-8859-1"), "UTF-8");
System.out.println("age = " + age + "; name = " + name);
return "userList";
}
public ModelAndView saveUser(HttpServletRequest req) throws UnsupportedEncodingException {
ModelAndView mv = new ModelAndView();
int age = Integer.valueOf(req.getParameter("age"));
String name = req.getParameter("name");
String utf8Name = new String(name.getBytes("iso-8859-1"), "UTF-8");
mv.addObject("age", age);
mv.addObject("name", utf8Name);
mv.setViewName("userList");
return mv;
}
// ======================================================
public String showUser() {
return "redirect:/redirect/uList";
}
public String showUser1(Model model) {
model.addAttribute("age", 111);
model.addAttribute("name", "王一一");
return "redirect:/redirect/uList";
}
public ModelAndView showUser2(Model model) {
model.addAttribute("age", 222);
model.addAttribute("name", "王一二");
return new ModelAndView("redirect:/redirect/uList");
}
public ModelAndView showUser3() {
ModelAndView mv = new ModelAndView();
mv.addObject("age", 333);
mv.addObject("name", "王一三");
mv.setViewName("redirect:/redirect/uList");
return mv;
}
//==================================================================
public ModelAndView showParam1() {
ModelAndView mv = new ModelAndView();
mv.addObject("age", 1);
mv.addObject("name", "六一");
mv.setViewName("redirect:/redirect/showParam");
return mv;
}
public ModelAndView showParam2(Model model) {
model.addAttribute("age", 2);
model.addAttribute("name", "六二");
return new ModelAndView("redirect:/redirect/showParam");
}
// ====================================================================
public ModelAndView addUser1() {
ModelAndView mv = new ModelAndView();
mv.addObject("age", 666);
mv.addObject("name", "王一六");
mv.setViewName("redirect:/redirect/saveUser");
return mv;
}
public ModelAndView addUser2(Model model) {
model.addAttribute("age", 777);
model.addAttribute("name", "王一七");
return new ModelAndView("redirect:/redirect/saveUser");
}
public String addUser3(Model model) {
model.addAttribute("age", 888);
model.addAttribute("name", "Alic张k1小q二2");
return "redirect:/redirect/saveUser";
}
public String addUser4(Model model) {
int age = 444;
String name = "Alic张k1小q二2";
// return "redirect:/redirect/saveUser?age=555&name=Alic张k1小q二2";
return "redirect:/redirect/showUser?age=" + age + "&name=" + name;
}
public String addUser5(Model model) {
model.addAttribute("age", 5);
model.addAttribute("name", "God飞1牛niu2");
int age = 555;
String name = "Alic张k1小q二2";
// return "redirect:/redirect/saveUser";
// return "redirect:/redirect/saveUser?age=" + age;
return "redirect:/redirect/saveUser?name=" + name;
// return "redirect:/redirect/saveUser?age=" + age + "&name=" + name;
}
}转发
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98/**
* 转发:同一条请求,源参数可以随转发带给目标方法直接在页面使用
* 不需要在目标方法中对参数再取出传参。
* 获取转发所带的参数,只能用request.getAttribute()方法
* 不能使用@PathVariable从URI里取值
* @author Rocky
*
*/
public class ForwardController {
public String uList() {
return "userList";
}
// ============================================================
public String showParam(HttpServletRequest req) {
// 使用request.getAttribute()从转发请求中获取参数
int age = (int) req.getAttribute("age");
String name = (String) req.getAttribute("name");
System.out.println("age = " + age + "; name = " + name);
String age1 = req.getParameter("age");
String name1 = req.getParameter("name");
System.out.println("age1 = " + age1 + "; name1 = " + name1);
return "userList";
}
public ModelAndView showParam1() {
ModelAndView mv = new ModelAndView();
mv.addObject("age", 11);
mv.addObject("name", "李一");
mv.setViewName("forward:/forward/showParam");
return mv;
}
public ModelAndView showParam2(Model model) {
model.addAttribute("age", 12);
model.addAttribute("name", "李二");
return new ModelAndView("forward:/forward/showParam");
}
public String showParam3(Model model) {
model.addAttribute("age", 13);
model.addAttribute("name", "李三");
return "forward:/forward/showParam";
}
public String showParam4(Model model) {
model.addAttribute("age", 14);
model.addAttribute("name", "李四");
return "forward:/forward/showParam?age=131&name=Alic张k1小q二2";
}
//==============================================================
public String showUser() {
return "forward:/forward/uList";
}
public ModelAndView showUser3() {
ModelAndView mv = new ModelAndView();
mv.addObject("age", 333);
mv.addObject("name", "王一三");
mv.setViewName("forward:/forward/showUser");
return mv;
}
public String showUser1(Model model) {
model.addAttribute("age", 111);
model.addAttribute("name", "王一一");
return "forward:/forward/uList";
}
public ModelAndView showUser2(Model model) {
model.addAttribute("age", 222);
model.addAttribute("name", "王一二");
return new ModelAndView("forward:/forward/uList");
}
public ModelAndView showUser4() {
ModelAndView mv = new ModelAndView();
mv.addObject("age", 444);
mv.addObject("name", "王一四");
mv.setViewName("forward:/forward/uList");
return mv;
}
}JSP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Spring MVC Controller</title>
</head>
<body>
<h1>userList.jsp</h1>
<% request.setAttribute("nickName", "Rocky"); %>
<hr>
<h3>年龄 :${age }</h3>
<hr>
<h3>姓名:${name }</h3>
<hr>
</body>
</html>
Spring MVC的重定向与转发
http://blog.gxitsky.com/2018/01/03/SpringMVC-10-forward-redirect/