Spring MVC的重定向与转发

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. 重定向

    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
    *
    */
    @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. 转发

    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
    *
    */
    @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

    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>
作者

光星

发布于

2018-01-03

更新于

2022-06-17

许可协议

评论