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对象
示例代码
重定向
/** * 重定向:两条请求,URL地址会变。 * * @author Rocky * */ @Controller @RequestMapping("/redirect") public class RedirectController { @RequestMapping("/uList") public String uList() { return "userList"; } @RequestMapping("/showParam") 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"; } @RequestMapping("/saveUser") 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; } @RequestMapping("/showUser") public String showUser() { return "redirect:/redirect/uList"; } @RequestMapping("/showUser1") public String showUser1(Model model) { model.addAttribute("age", 111); model.addAttribute("name", "王一一"); return "redirect:/redirect/uList"; } @RequestMapping("/showUser2") public ModelAndView showUser2(Model model) { model.addAttribute("age", 222); model.addAttribute("name", "王一二"); return new ModelAndView("redirect:/redirect/uList"); } @RequestMapping("/showUser3") public ModelAndView showUser3() { ModelAndView mv = new ModelAndView(); mv.addObject("age", 333); mv.addObject("name", "王一三"); mv.setViewName("redirect:/redirect/uList"); return mv; } @RequestMapping("/showParam1") public ModelAndView showParam1() { ModelAndView mv = new ModelAndView(); mv.addObject("age", 1); mv.addObject("name", "六一"); mv.setViewName("redirect:/redirect/showParam"); return mv; } @RequestMapping("/showParam2") public ModelAndView showParam2(Model model) { model.addAttribute("age", 2); model.addAttribute("name", "六二"); return new ModelAndView("redirect:/redirect/showParam"); } @RequestMapping("/addUser1") public ModelAndView addUser1() { ModelAndView mv = new ModelAndView(); mv.addObject("age", 666); mv.addObject("name", "王一六"); mv.setViewName("redirect:/redirect/saveUser"); return mv; } @RequestMapping("/addUser2") public ModelAndView addUser2(Model model) { model.addAttribute("age", 777); model.addAttribute("name", "王一七"); return new ModelAndView("redirect:/redirect/saveUser"); } @RequestMapping("/addUser3") public String addUser3(Model model) { model.addAttribute("age", 888); model.addAttribute("name", "Alic张k1小q二2"); return "redirect:/redirect/saveUser"; } @RequestMapping("/addUser4") 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; } @RequestMapping("/addUser5") 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; } }
转发
/** * 转发:同一条请求,源参数可以随转发带给目标方法直接在页面使用 * 不需要在目标方法中对参数再取出传参。 * 获取转发所带的参数,只能用request.getAttribute()方法 * 不能使用@PathVariable从URI里取值 * @author Rocky * */ @Controller @RequestMapping("/forward") public class ForwardController { @RequestMapping("/uList") public String uList() { return "userList"; } // ============================================================ @RequestMapping("/showParam") 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"; } @RequestMapping("/showParam1") public ModelAndView showParam1() { ModelAndView mv = new ModelAndView(); mv.addObject("age", 11); mv.addObject("name", "李一"); mv.setViewName("forward:/forward/showParam"); return mv; } @RequestMapping("/showParam2") public ModelAndView showParam2(Model model) { model.addAttribute("age", 12); model.addAttribute("name", "李二"); return new ModelAndView("forward:/forward/showParam"); } @RequestMapping("/showParam3") public String showParam3(Model model) { model.addAttribute("age", 13); model.addAttribute("name", "李三"); return "forward:/forward/showParam"; } @RequestMapping("/showParam4") public String showParam4(Model model) { model.addAttribute("age", 14); model.addAttribute("name", "李四"); return "forward:/forward/showParam?age=131&name=Alic张k1小q二2"; } //============================================================== @RequestMapping("/showUser") public String showUser() { return "forward:/forward/uList"; } @RequestMapping("/showUser3") public ModelAndView showUser3() { ModelAndView mv = new ModelAndView(); mv.addObject("age", 333); mv.addObject("name", "王一三"); mv.setViewName("forward:/forward/showUser"); return mv; } @RequestMapping("/showUser1") public String showUser1(Model model) { model.addAttribute("age", 111); model.addAttribute("name", "王一一"); return "forward:/forward/uList"; } @RequestMapping("/showUser2") public ModelAndView showUser2(Model model) { model.addAttribute("age", 222); model.addAttribute("name", "王一二"); return new ModelAndView("forward:/forward/uList"); } @RequestMapping("/showUser4") public ModelAndView showUser4() { ModelAndView mv = new ModelAndView(); mv.addObject("age", 444); mv.addObject("name", "王一四"); mv.setViewName("forward:/forward/uList"); return mv; } }
JSP
<%@ 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>
更多内容请访问:IT源点
注意:本文归作者所有,未经作者允许,不得转载