SpringMVC 请求转发和重定向

1. 请求转发

1.1. 返回String方式

1.1.1. 转发给另一个请求

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
@Controller
public class HelloController {
@GetMapping("/hello1")
public String hello1() {
System.out.println("hello1");
return "forward:/hello2";
}

@GetMapping("/hello2")
@ResponseBody
public String hello2() {
System.out.println("hello2");
return "<h1>helloworld</h1>";
}
}

1.1.2. 转发到指定jsp页面

不带forward前缀,直接返回字符串。该字符串会拼接视图解析器的前后缀,例如前缀是/WEB-INF/jsp,后缀是.jsp,那么success对应的页面是/WEB-INF/jsp/success.jsp

1
2
3
4
5
6
7
8
@Controller
public class HelloController {
@GetMapping("/hello1")
public String hello1() {
//
return "success";
}
}

如果设置了视图解析器,前缀是/WEB-INF/jsp,后缀是.jsp,但是你又想转发给/success.jsp,可以使用相对路径回退到上级目录

1
2
3
4
5
6
7
8
@Controller
public class HelloController {
@GetMapping("/hello1")
public String hello1() {
// 拼接得到 /WEB-INF/jsp/../../success.jsp,相当于/success.jsp
return "../../success";
}
}

也可以使用带forward前缀的形式,转发到指定jsp资源。注意这里不要使用forward:success,因为转发时不会加入视图解析器的前后缀。forward:success是一种相对路径的写法,当前映射是/hello1,那么相对路径success对应的绝对路径就是/success,即等价于forward:/success

1
2
3
4
5
6
7
@Controller
public class HelloController {
@GetMapping("/hello1")
public String hello1() {
return "forward:/WEB-INF/jsp/success.jsp";
}
}

2. 请求重定向

2.1. 返回String方式

在使用原生Servlet进行重定向时,路径要带上虚拟目录,但是SpringMVC不用,SpringMVC会自动帮你补全虚拟目录。注意,redirect也不会拼接视图解析器的前后缀

1
2
3
4
5
6
7
8
9
10
11
12
13
14
@Controller
public class HelloController {
@GetMapping("/hello1")
public String hello1() {
return "redirect:/hello2";
}

@GetMapping("/hello2")
@ResponseBody
public String hello2() {
System.out.println("hello2");
return "<h1>helloworld</h1>";
}
}
panchaoxin wechat
关注我的公众号
支持一下