6. 转发和重定向
Spring MVC 的底层是 servlet,因此在 Spring MVC 中也存在转发和重定向的概念。
- 对于转发而言,其目的页面可以在 WEB-INF 目录下。
- 重定向的目的页面不允许在 WEB-INF 目录下,因为重定向相当于用户再次发起一次请求,而用户不允许直接访问 WEB-INF 目录下的资源。
6.1 转发
使用 forward:
即可实现转发
-
转发至目的页面:
forward:目的页面相对站点的路径
return "forward:WEB-INF/jsp/test.jsp";
-
转发至控制器:
forward:控制器
return "forward:/restAdd/1/2";
处理器适配器在返回 ModelAndView 时默认使用转发方式
6.2 重定向
使用 redirect:
即可实现重定向
-
重定向至目的页面:
redirect:目的页面相对站点的路径
return "redirect:index.jsp";
-
重定向至控制器:
redirect:控制器
return "redirect:/restAdd/1/2";
重定向与转发不可使用 RestFul 风格直接在浏览器带参数进行访问
7. 接收请求参数和数据回显
7.1 请求参数接收
-
请求参数与被请求函数形参名称相同
http://localhost:8080/user/rec?name=why
@Controller @RequestMapping("/user") public class UserController { @GetMapping("/rec") public String rec(String name, Model model) { System.out.println("name: " + name); model.addAttribute("msg", "name: " + name); return "test"; } }
-
请求参数与被请求函数形参名称不同
http://localhost:8080/user/rec?username=why
@Controller @RequestMapping("/user") public class UserController { @GetMapping("/rec") public String rec(@RequestParam("username") String name, Model model) { System.out.println("name: " + name); model.addAttribute("msg", "name: " + name); return "test"; } }
-
被请求函数形参为对象
http://localhost:8080/user/recObj?id=1&name=why&age=1
@Controller @RequestMapping("/user") public class UserController { @GetMapping("/recObj") public String recObj(User user, Model model) { System.out.println("user: " + user); model.addAttribute("msg", "user: " + user); return "test"; } }
@Data @AllArgsConstructor @NoArgsConstructor public class User { private int id; private String name; private int age; }
7.3 数据回显
(1) ModelAndView
public class HelloController implements Controller {
public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {
ModelAndView mv = new ModelAndView();
mv.addObject("msg","HelloSpringMVC!");
mv.setViewName("hello");
return mv;
}
}
(2) Model
@GetMapping("/recObj")
public String recObj(User user, Model model) {
System.out.println("user: " + user);
model.addAttribute("msg", "user: " + user);
return "test";
}
(3) ModelMap
Model extends ModelMap extends LinkedHashMap<String, Object>
@GetMapping("/recObj")
public String recObj(User user, ModelMap model) {
System.out.println("user: " + user);
model.addAttribute("msg", "user: " + user);
return "test";
}