【基于轻量型架构的WEB开发】课程 12.4 页面跳转 Java EE企业级应用开发教程 Spring+SpringMVC+MyBatis

12.4 页面跳转

12.4.1 返回值为void类型的页面跳转

返回值为void类型的页面跳转到默认页面

  • 当Spring MVC方法的返回值为void类型,方法执行后会跳转到默认的页面。
  • 默认页面的路径由方法映射路径和视图解析器中的前缀、后缀拼接成,拼接格式为"前缀+方法映射路径+后缀"。
  • 如果Spring MVC的配置文件中没有配置视图解析器,则会报HTTP Status 500错误。

1

  • 通过案例演示返回值为void类型的页面跳转。
  • 创建一个页面跳转类PageController,在PageController类中定义方法showPageByVoid(),用于测试Spring MVC方法返回值为void的页面跳转。
java 复制代码
@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()方法的实现代码如下所示:

java 复制代码
@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()方法,分别用于测试方法执行后转发和重定向的页面跳转。

java 复制代码
    @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传递数据,两个方法都使用字符串指定跳转的页面。

java 复制代码
//只展示了showPageByRequest()方法
    @RequestMapping("/showPageByRequest")
    public String showPageByRequest(HttpServletRequest request) {
        System.out.println("showPageByRequest running");
        request.setAttribute("username", "request");
        return "register";
    }

2

修改文件Userjava,在registerjsp的表单中添加value属性,用于接收转发传递过来的数据。

XML 复制代码
<%@ 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/>
    密&nbsp;&nbsp;&nbsp;码:<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。
接下来通过一个案例演示返回值为ModelAndView类型的页面跳转,案例具体实现步骤如下。

1

修改文件PageController.java,新增showModelAndView()方法,在showModelAndView()方法中使用ModelAndView封装数据和视图,完成页面跳转时传递数据。

java 复制代码
@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;
}

2

启动chapter12项目,在浏览器中访问地址
http://localhost:8080/chapter12/showModelAndView。访问后,浏览器页面
进行跳转,跳转的页面如图所示。

从图中所示的页面可以得出,访问地址后执行了showModelAndView()方法,方法执行后,添加的模型数据都在register.jsp页面成功取出。

相关推荐
吴冰_hogan2 分钟前
nacos集群源码解析-cp架构
java·spring boot·spring·架构·服务发现·springcloud
FIRE26 分钟前
uniapp小程序分享使用canvas自定义绘制 vue3
前端·小程序·uni-app
四喜花露水27 分钟前
vue elementui el-dropdown-item设置@click无效的解决方案
前端·vue.js·elementui
jokerest1231 小时前
web——sqliabs靶场——第五关——报错注入和布尔盲注
前端
谢尔登1 小时前
前端开发调试之 PC 端调试
开发语言·前端
每天吃饭的羊1 小时前
在循环中只set一次
开发语言·前端·javascript
白总Server2 小时前
JVM 处理多线程并发执行
jvm·后端·spring cloud·微服务·ribbon·架构·数据库架构
LightOfNight3 小时前
Redis设计与实现第9章 -- 数据库 总结(键空间 过期策略 过期键的影响)
数据库·redis·后端·缓存·中间件·架构
_默_4 小时前
adminPage-vue3依赖DetailsModule版本说明:V1.2.1——1) - 新增span与labelSpan属性
前端·javascript·vue.js·npm·开源
也无晴也无风雨6 小时前
深入剖析输入URL按下回车,浏览器做了什么
前端·后端·计算机网络