开启掘金成长之旅!这是我参与「掘金日新计划 · 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对象包含视图相关内容和模型数据两部分
对象方法:
前两个方法用来添加视图名称(第一个常用)
后三个方法用来添加模型数据,通过倒数第二个方法添加的数据,可以用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;
}