SpringMVC(十):Redirect重定向与Forward转发

star2017 1年前 ⋅ 303 阅读

SpringMVC 在controller层的转发重定向Servlet的有些不一样,在实际使用时碰到各种小问题,现对对这个常用的基本功能做下总结。

重定向与转发

SpringMVC 重定向转发是将视图名(viewName)设置成目标Controller处理器的映射地址(完整地址:类映射+方法映射),在映射地址前面增加重定向标志(redirect)或转发标志(forward)。如下示例:

  • 重定向:return "redirect:/redirect/saveUser";
  • 转发:return "forward:/forward/uList";

两者区别

  • 重定向
    1. 重定向是两条GET请求,浏览器的 URL 地址会变,跳转为目标 Controller 的映射地址。
    2. 重定向请求拼接的参数(在URL手动拼接和model模型封装)都会显示在 URL 地址。
    3. 重定向的目标方法只能通过req.getParameter()方法从 URL 中获取参数,如果需要页面显示,需再用模型model封装参数给到视图。
    4. 带参数跳转有两种情况:优先使用URL拼接的参数
      4.1 在 URL 上手动拼接参数:不能读取到中文字符,获取到的是空(占位符);如果参数是包含中文,可以获取其它英文和数字字符,中文字符被空格代替。
      4.2 通过 model 封装参数:可以读取到中文字符,在目标 Controller方法取出参数,需对参数进行UTF-8转码再封装到 model里,JSP页面才能正常显示中文。
  • 转发
    1. 转发是一条POST请求,浏览器地址不变,用户是感觉不到的。
    2. 转发传递参数给目标 JSP 页面来显示,源方法只能使用模型model来封装参数,不能在 URL 上拼接参数。因是一条request,参数共享;不用在目的方法取出参数再次封装。
    3. 转发到的目标方法如果要取出页面显示的参数只能使用request.getAttribute()方法;
    4. 带参数转发,中文字符显示需要在 Tomcat 配置链接编码为UTF-8
    5. 转发的 URL 也可以拼接参数,但浏览器不会显示参数。在目标方法可以通过req.getParameter()方法取出;如果不在目标方法取出参数使用model再次封装,则页面不会显示该参数内容。
  • model 封装参数方法
    1. model.addAttribute()
    2. modelAndView.addObject()
    3. @ModelAttribute 绑定请求参数到Model对象

示例代码

  1. 重定向

     /**
      * 重定向:两条请求,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;
         }
     }
    
  2. 转发

     /**
      * 转发:同一条请求,源参数可以随转发带给目标方法直接在页面使用
      * 不需要在目标方法中对参数再取出传参。
      * 获取转发所带的参数,只能用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;
         }
     }
    
  3. 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源点

全部评论: 0

    我有话说: