Spring MVC页面跳转的三个类型

332 阅读3分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第15天

页面跳转的三个类型

客户端与服务器端之间的交互大部分分为请求和响应。Spring MVC在接收到客户端的请求后,会对请求进行不同方式的响应。

Spring MVC的响应方式可以分为:

  • 页面跳转
  • 数据写回

这里介绍页面跳转:

Spring MVC使用页面跳转方式进行响应时,可通过方法的返回值指定跳转页面,方法的返回值可以设定为:

  • void
  • String
  • ModelAndView

返回值为void类型

当返回值为void类型时,方法执行后会跳转到默认的页面。默认页面的路径由方法映射路径和视图解析器中的前缀、后缀拼接成,拼接格式为“前缀+方法映射路径+后缀”。

如果Spring MVC的配置文件中没有配置视图解析器,则会报HTTP Status 500错误。

例如:

@RequestMapping("/register")
//这里配置了返回值为void类型
public void showPageByVoid(){
    System.out.println("showPageByVoid");
}

showPageByVoid方法执行后,会跳转到默认的页面,默认页面的路径格式为“前缀+方法映射路径+后缀”

这里register就是后缀,跳转到前缀+/register+后缀页面,其中前缀和后缀是视图解析器中配置的

返回值为String类型

当返回值为String类型时,控制器方法执行后,Spring MVC会根据方法的返回值跳转到对应的资源。

如果没有配置视图解析器,那么处理器执行后,会将请求转发到与方法返回值一致的映射路径。

在进行页面跳转之前,可根据需求在页面跳转时选择是否携带数据:

不携带数据页面跳转
@RequestMapping("/showPageByString")
public String showPageByString(){
    System.out.println("showPageByString");
    return "register";
}

这里return的register就是后缀,跳转到前缀+/register+后缀页面,其中前缀和后缀是视图解析器中配置的

如果没有配置视图解析器,就会调用/register对应的void方法,也就是👇

@RequestMapping("/register")
//这里配置了返回值为void类型
public void showPageByVoid(){
    System.out.println("showPageByVoid");
}

除了上述这种以普通字符串register默认转发的情况,还可以返回指定前缀的字符串,来设定处理器执行后对请求进行转发还是重定向

  • forward:转发
  • redirect:重定向

写法:

return "forward:orders.jsp";
​
return "redirect:http://www.hexiaoxing.com";

注意:一旦添加了前缀,那么视图解析器就不会再为方法返回值拼接前缀和后缀了

携带数据页面跳转

通过默认类型model来携带数据

@RequestMapping("/showPageByModel")
public String showPageByModel(Model model){
    //存一个名为username的数据,数据内容为"model"
    model.addAttribute("username", "model");
    User user = new User();
    user.setPassword("password");
    //存一个名为user的数据,数据内容为user对象实例
    model.addAttribute("user",user);
    return "register";
}

携带的数据可以在jsp页面中通过el表达式进行访问:

${username}
${user.password}

返回值为ModelAndView类型

ModelAndView对象包含视图相关内容模型数据两部分

对象方法:

ModelAndView.jpg

前两个方法用来添加视图名称(第一个常用)

后三个方法用来添加模型数据,通过倒数第二个方法添加的数据,可以用EL表达式取出

举例:

@RequestMapping("/showModelAndView")
public ModelAndView showModelAndView(){
    //创建ModelAndView对象
    ModelAndView modelAndView = new ModelAndView();
    //添加数据
    modelAndView.addObject("username", "hexiaoxing");
    User user = new User();
    user.setPassword("password");
    modelAndView.addObject("user", user);
    //配置视图名称
    modelAndView.setViewName("register");
    return modelAndView; 
}