一、不携带数据
接下来通过一个案例演示返回值为String类型时,不携带数据的页面跳转,案例具体实现步骤如下。
1、修改文件PageController.java,新增showPageByString()方法,用于测试返回值为String类型的页面跳转,showPageByString()方法的实现代码如下所示。
@Controller
public class PageController {@RequestMapping("/register")public void showPageByVoid() {System.out.println("showPageByVoid running");}
}
2、启动chapter12项目,在浏览器中访问地址http://localhost:8080/chapter12/showPageByString。访问后,控制台打印信息如图所示。
showPageByString running
控制台打印上图所示信息后,浏览器页面进行跳转。访问地址后,执行了showPageByString()方法,方法执行后成功跳转到WEB-INF文件夹下的register.jsp页面。如果此时注释掉Spring MVC配置文件spring-mvc.xml中的视图解析器,在浏览器中访问showPageByString()方法,请求会转发到映射路径为register对应的showPageByVoid()方法中。
二、返回值为String类型的页面跳转的转发方式
当方法的返回值为普通的字符串时,Spring MVC在方法执行后会默认以转发的方式响应给客户端。除了这种默认的转发方式,还可以返回指定前缀的字符串,来设定处理器执行后对请求进行转发还是重定向,设定转发和重定向的字符串格式如下所示。
forward:需要转发到的资源路径
redirect:需要重定向到的资源路径
接下来,通过一个案例演示返回指定前缀的字符串的页面跳转,具体实现步骤如下。
1、修改文件PageController.java,新增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.test.com"; }
2、启动chapter12项目,在浏览器中访问访问地址http://localhost:8080/chapter12/showPageByForward。访问后,控制台打印信息如图所示。
showPageByForward running
控制台打印上图所示的信息后,浏览器页面进行跳转。由控制台打印信息、跳转的页面和地址栏信息可以得出,访问地址后,执行了showPageByForward()方法,方法执行后转发到项目的orders.jsp页面。
3、在浏览器中访问地址http://localhost:8080/chapter12/showPageByRedirect。访问后,控制台打印信息如图所示。
showPageByRedirect running
控制台打印上图所示的信息后,浏览器页面进行跳转。 由控制台打印信息、跳转的页面和地址栏信息可以看出,访问地址后执行了showPageByRedirect()方法,方法执行后重定向到黑马程序员的官网。需要注意的是,方法返回的字符串一旦添加了“forward:”或“redirect:”前缀,那么视图解析器不再会为方法返回值拼接前缀和后缀了。
三、携带数据
接下来通过一个案例演示携带数据的页面转发,该案例使用HttpServletRequest类型形参和Model类型形参进行数据传递,案例具体实现步骤如下。
1、修改文件PageController.java,新增showPageByRequest()方法和showPageByModel()方法,showPageByRequest()方法使用HttpServletRequest传递数据,showPageByModel()方法使用Model传递数据,两个方法都使用字符串指定跳转的页面。
@RequestMapping("/showPageByRequest")public String showPageByRequest(HttpServletRequest request){System.out.println("showPageByRequest running");request.setAttribute("username","request");return "register";}@RequestMapping("/showPageByModel")public String showPageByModel(Model model){System.out.println("showPageByModel running");model.addAttribute("username","model");User user = new User();user.setPassword("password");model.addAttribute("user",user);return "register";
2、修改文件User.java,在register.jsp的表单中添加value属性,用于接收转发传递过来的数据。
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
<html>
<head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><title>注册</title>
</head>
<body>
<form action="${pageContext.request.contextPath}/registerUser" method="post">用户名:<input type="text" name="username" value="${username}"/><br/>密 码:<input type="password" name="password"/><br/><input type="submit" value="注册"/>
</form>
</body>
</html>
3、启动chapter12项目,在浏览器中访问地址http://localhost:8080/chapter12/showPageByRequest。访问后,控制台打印信息如图所示。
showPageByRequest running
控制台打印上图所示的信息后,浏览器页面进行跳转。 由控制台打印信息,以及跳转的页面信息可以看出,访问地址后执行了showPageByRequest()方法,方法执行后HttpServletRequest中的username转发到register.jsp页面中。
4、在浏览器中访问地址http://localhost:8080/chapter12/showPageByModel。访问后,控制台打印信息如图所示。
showPageByModel running
控制台打印上图所示的信息后,浏览器页面进行跳转。 由控制台打印信息,以及跳转的页面信息可以看出,访问地址后执行了showPageByModel()方法,方法执行后,Model中的username和user对象转发到register.jsp页面。