12.4 页面跳转
12.4.1 返回值为void类型的页面跳转
返回值为void类型的页面跳转到默认页面
- 当Spring MVC方法的返回值为void类型,方法执行后会跳转到默认的页面。
- 默认页面的路径由方法映射路径和视图解析器中的前缀、后缀拼接成,拼接格式为“前缀+方法映射路径+后缀”。
- 如果Spring MVC的配置文件中没有配置视图解析器,则会报HTTP Status 500错误。
1
- 通过案例演示返回值为void类型的页面跳转。
- 创建一个页面跳转类
PageController
,在PageController
类中定义方法showPageByVoid()
,用于测试Spring MVC方法返回值为void的页面跳转。
@Controller
public class PageController {
@RequestMapping("/register")
public void showPageByVoid() {
System.out.println("showPageByVoid running");
}
}
2
PageControllerjava类中的方法showPageByVoid()处理请求。
- 上述代码的
showPageByVoid()
方法将会处理URL为register
的请求。 showPageByVoid()
方法中没有返回值,只有一行打印输出字符串的代码。
3
- 启动
chapter12
项目,在浏览器中访问地址http://localhost:8080/chapter12/register
。 - 控制台打印信息显示
showPageByVoid running
。
- 控制台打印上图所示的信息后,浏览器页面进行跳转,跳转的页面如图所示。
- 注册页面显示,包含用户名和密码输入框,以及注册按钮。
- 由上面两个图的内容可以得出,访问地址后,执行了
showPageByVoid()
方法,并且在执行后成功跳转到WEB-INF
文件夹下的register.jsp
页面。 - 页面虽然跳转了,但浏览器地址栏没有变化,原因是Spring MVC对请求默认按转发的方式进行响应。
12.4.2 返回值为String类型的页面跳转
返回值为String类型的页面跳转-不携带数据
1
在PageController.java
文件中新增showPageByString()
方法,用于测试返回值为String类型的页面跳转。showPageByString()
方法的实现代码如下所示:
@Controller
public class PageController {
@RequestMapping("/showPageByString")
public String showPageByString() {
System.out.println("showPageByString running");
return "register";
}
}
2
启动chapter12
项目,在浏览器中访问地址http://localhost:8080/chapter12/showPageByString
。访问后,控制台打印信息如图所示,显示showPageByString running
。
控制台打印上图所示信息后,浏览器页面进行跳转,跳转的页面如下图所示。
由上面两图所示的内容可以看出,访问地址后,执行了showPageByString()方法,方法执行后成功跳转到WEB-INF文件夹下的registerjsp页面。如果此时注释掉Spring MVC配置文件spring-mvc.xml中的视图解析器,在浏览器中访问showPageByString0)方法,请求会转发到映射路径为register对应的showPageByVoid()方法中。
返回值为String类型的页面跳转的转发方式
当方法的返回值为普通的字符串时,Spring MVC在方法执行后会默认以转发的方式响应给客户端。除了这种默认的转发方式,还可以返回指定前缀的字符串,来设定处理器执行后对请求进行转发还是重定向。设定转发和重定向的字符串格式如下:
forward:
需要转发到的资源路径(在服务端内部完成请求资源的过程,客户端不知情)redirect:
需要重定向到的资源路径(在客户端完成请求资源的过程)
1
修改文件PageControllerjava,新增showPageByForward()方法和showPageByRedirect()方法,分别用于测试方法执行后转发和重定向的页面跳转。
@RequestMapping("/showPageByForward")
public String showPageByForward() {
System.out.println("showPageByForward running");
return "forward:orders.jsp";
}
@RequestMapping("/showPageByRedirect")
public String showPageByRedirect() {
System.out.println("showPageByRedirect running");
return "redirect:http://www.itheima.com";
}
2
启动chapter12项目,在浏览器中访问访问地址http://localhost:8080/chapter12/showPageByForward。访问后,控制台打印信息如图所示。
控制台打印上图所示的信息后,浏览器页面进行跳转,跳转的页面如图所示。
由两图所示的控制台打印信息、跳转的页面和地址栏信息可以得出,访问地址后,执行了showPageByForward()方法,方法执行后转发到项目的orders.jsp页面。
3
在浏览器中访问地址http://localhost:8080/chapter12/showPageByRedirect.
访问后,控制台打印信息如图所示。
控制台打印上图所示的信息后,浏览器页面进行跳转,跳转的页面如图所示。
由两图所示的控制台打印信息、跳转的页面和地址栏信息可以看出,访问地址后执行了showPageByRedirect()方法,方法执行后重定向到黑马程序员的官网。需要注意的是,方法返回的字符串一旦添加了“forward:”或“redirect:”前缀,那么视图解析器不再会为方法返回值拼接前缀和后缀了。
返回值为String类型的页面跳转-携带数据
接下来通过一个案例演示携带数据的页面转发,该案例使用HttpServletRequest类型形参和Model类型形参进行数据传递,案例具体实现步骤如下。
1
修改文件PageController.java,新增showPageByRequest()方法和showPageByModel()方法,showPageByRequest()方法使用HttpServletRequest传递数据,showPageByModel()方法使用Model传递数据,两个方法都使用字符串指定跳转的页面。
//只展示了showPageByRequest()方法
@RequestMapping("/showPageByRequest")
public String showPageByRequest(HttpServletRequest request) {
System.out.println("showPageByRequest running");
request.setAttribute("username", "request");
return "register";
}
2
修改文件Userjava,在registerjsp的表单中添加value属性,用于接收转发传递过来的数据。
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<html>
<body>
<form action="${pageContext.request.contextPath}/registerUser">
用户名:<input type="text" name="username" value="${username}"/><br/>
密 码:<input type="text" name="password" value="${user.password}"/><br/>
<input type="submit" value="注册"/>
</form>
</body>
</html>
3
启动chapter12项目,在浏览器中访问地址http://localhost:8080/chapter12/showPageByRequest。访问后,控制台打印信息如图所示。
控制台打印上图所示的信息后,浏览器页面进行跳转,跳转的页面如图所示,
由两图所示的控制台打印信息,以及跳转的页面信息可以看出,访问地址后执行了showPageByRequest()方法,方法执行后HttpServletRequest中的username转发到register.jsp页面中。
4
在浏览器中访问地址http://ocalhost:8080/chapter12/showPageByModel。访问后,控制台打印信息如图所示。
控制台打印上图所示的信息后,浏览器页面进行跳转,跳转的页面如图所示
由两图所示的控制台打印信息,以及跳转的页面信息可以看出,访问地址后执行了showPageByModel()方法,方法执行后,Model中的username和user对象转发到register.jsp页面
12.4.3 返回值为ModelAndView类型的页面跳转
ModelAndView对象组成部分
使用方法的返回值可以设定跳转的逻辑视图名称,使用Model等对象实现页面跳
转时传输数据。除此之外,Spring MVC还提供了兼顾视图和数据的对象
ModelAndView,ModelAndView对象包含视图相关内容和模型数据两部分,其中视
图相关的内容可以设置逻辑视图的名称,也可以设置具体的View实例;模型数据则会
在视图渲染过程中被合并到最终的视图输出。
ModelAndView设置视图和数据模型的方法
ModelAndView方法说明
setViewName()方法和setView()方法都是为ModelAndView对象设置视图的方
法,其中前者使用更方便,因此setViewName()方法比较常用。后3个方法都是向
ModelAndView对象中添加模型数据的,其中addObject(Object attributeValue)方
法添加的attributeValue,默认名称为attributeValue类型全限定名的最后一个单词且
首字母小写;addObject(String attributeName, Object attributeValue)方法可以在
页面上以${attributeName}方式取出attributeValue。
1
修改文件PageController.java,新增showModelAndView()方法,在showModelAndView()方法中使用ModelAndView封装数据和视图,完成页面跳转时传递数据。
@RequestMapping("/showModelAndView")
public ModelAndView showModelAndView() {
ModelAndView modelAndView = new ModelAndView();
modelAndView.addObject("username","heima");
User user = new User(); user.setPassword("password");
modelAndView.addObject("user",user);
modelAndView.setViewName("register");
return modelAndView;
}