SpringMVC基础学习之页面跳转方式的简单使用

前言

小伙伴们,大家好,我是狂奔の蜗牛rz,当然你们可以叫我蜗牛君,我是一个学习Java半年多时间的小菜鸟,同时还有一个伟大的梦想,那就是有朝一日,成为一个优秀的Java架构师。

这个SpringMVC基础学习系列是用来记录我学习SpringMVC框架基础知识的全过程 (这个系列是参照B站狂神的SpringMVC最新教程来写的,由于是之前整理的,但当时没有发布出来,所以有些地方可能有错误,希望大家能够及时指正!)


之后我将尽量以两天一更的速度更新这个系列,还没有学习SpringMVC框架的小伙伴可以参照我的博客学习一下;当然学习过的小伙伴,也可以顺便跟我一起复习一下基础。最后,希望能够和大家一同进步吧,加油吧,编程人!

特别提醒:如果对SpringMVC基础学习系列感兴趣,可以阅读本系列往期博客:
第一篇SpringMVC基础学习之简单回顾MVC架构和Servlet的使用
第二篇SpringMVC基础学习之初识SpringMVC
第三篇SpringMVC基础学习之初识
第四篇SpringMVC基础学习之使用注解开发
第五篇SpringMVC基础学习之Controller的两种实现方式和RequstMapping注解的使用
第六篇SpringMVC基础学习之Restful风格的简单使用


今天我们来到了SpringMVC基础学习的第七站:页面跳转方式的简单使用 。废话不多说,让我们开始今天的学习内容吧。

7.页面跳转方式的简单使用

7.页面跳转方式的简单使用

7.1 了解页面跳转相关对象

7.1.1 什么是ModeldAndView对象?

ModelAndView:即模型和视图,主要用于设置ModelAndView对象,根据view的名称视图解析器,跳转到指定的页面,其页面格式为:[视图解析器前缀] + viewName + [视图解析器后缀]

7.1.2 ViewResolver对象基础概念

1.什么是ViewResolver对象?

ViewResolver (视图解析器):全称InternalResourceViewResolver (中心资源视图解析器),位于org.springframework.web.servlet.view包下,主要作用是解析ModelAndView (即模型和视图) 对象

2.ViewResolver对象的主要作用
  • ViewResovler (视图解析器) 被 DispatcherServlet (前端控制器) 调用,用来解析HandlerAdapter (处理器适配器)传递的逻辑视图名
  • ViewResovler (视图解析器) 将解析的逻辑视图名传递给DispatcherServlet (前端控制器)
3.ViewResovler对象的使用
3-1 在配置文件中引入ViewResovler对象
  • resources文件夹下的springmvc-servlet.xml配置文件中进行相关代码的编写
<!-- 配置internalResourceViewResolver(视图解析器)
     主要作用是解析DispatcherServlet(中心控制器)传递给它的ModelAndView-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"
      id="internalResourceViewResolver">
    
    <!-- 前缀 -->
    <!-- 注意: 在视图解析器中我们吧所有的视图都放在/WEB-INF/目录下
               这样可以保证视图安全,因为这个目录下的文件,客户端不能直接访问 -->
    <property name="prefix" value="/WEB-INF/jsp/"/>
    <!-- 后缀 -->
    <property name="suffix" value=".jsp"/>
    
</bean>
3-2 编写对应的Controller控制器类
package com.kuang.controller;

import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.Controller;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

// 只要实现了Controller接口的类,说明这就是一个控制器了
public class HelloController implements Controller {
    public ModelAndView handleRequest(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws Exception {
        
        // 获取ModelAndView(模型视图)对象
        ModelAndView mv = new ModelAndView();
        // 封装对象,放在ModelAndView对象中
        mv.addObject("msg","Hello,Controller!");
        // 视图跳转,存入ModelAndView对象中
        mv.setViewName("user/hello");
        // 返回视图模型对象给视图解析器
        return mv;
    }
    
}

7.2 Servlet API的简单使用

7.2.1 Servlet API的使用前提和步骤

1.Servlet API的使用前提
1-1 编写web.xml配置文件
  • web.xml配置文件中引入dispatcherServlet对象Servlet映射关系
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">
    
    <!-- 配置DispatcherServlet: 表示前置控制器, 其主要作用: 它是SpringMVC的核心, 相当于请求分发器 -->
    <servlet>
        <servlet-name>springmvc</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <!-- DispatcherServlet要绑定Spring的配置文件 -->
        <init-param>
            <!-- 设置配置文件的位置名称 -->
            <param-name>contextConfigLocation</param-name>
            <!-- 设置配置文件的路径(注意: "classpath*:"会去所有的包中找, 建议使用"classpath:" -->
            <param-value>classpath:springmvc-servlet.xml</param-value>
        </init-param>
        <!-- 启动级别 -->
        <load-on-startup>1</load-on-startup>
    </servlet>
    
    <!-- 在SpringMVC中,/ 和 /* 作用不相同:
         /: 匹配所有的请求,不会去匹配jsp; /*:匹配所有的请求,包括jsp页面
        (一般推荐使用 /,避免出现404错误:URL访问失败问题) -->
    <servlet-mapping>
        <servlet-name>springmvc</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>
    
</web-app>
1-2 编写spring-servlet.xml配置文件
  • spring-servlet.xml配置文件中设置自动扫描包,开启注解支持的驱动和引入视图解析器
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:mvc="http://www.springframework.org/schema/mvc"
       xsi:schemaLocation="
        http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context.xsd
        http://www.springframework.org/schema/mvc
        http://www.springframework.org/schema/mvc/spring-mvc.xsd">
    
    <!-- 自动扫描包,让指定包下的注解生效,由IOC容器统一管理 -->
    <context:component-scan base-package="com.kuang.controller"/>
    
    <!-- 让SpringMVC不处理静态资源: .css .js .html .mp3 .mp4 -->
    <mvc:default-servlet-handler/>
    
    <!-- 设置支持mvc注解驱动 (注意: 在Spring中一般采用@RequstMapping注解来完成映射关系)
         要想让@RequstMapping注解生效, 必须向上下文注册DefaultAnnotationHandlerMapping和一个AnnotationMethodHandlerAdapter实例;
         这两个实例分别在类级别和方法级别处理, 而annotation-driven配置帮助我们自动完成上述两个实例的注入
      -->
    <mvc:annotation-driven/>
    
    <!-- 视图解析器: 主要用于解析DispatcherServlet传递的ModelAndView对象 -->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"
          id="internalResourceViewResolver">
        <!-- 前缀 -->
        <!-- 在视图解析器中我们吧所有的视图都放在/WEB-INF/目录下:
             这样可以保证视图安全,因为这个目录下的文件,客户端不能直接访问 -->
        <property name="prefix" value="/WEB-INF/jsp/"/>
        <!-- 后缀 -->
        <property name="suffix" value=".jsp"/>
    </bean>
    
</beans>
2.Servlet API的使用步骤

通过设置ServletAPI不需要视图解析器

  • 通过HttpServletResponse进行输出
  • 通过HttpServletResponse实现重定向
  • 通过HttpServletResponse实现转发

7.2.2 ServletAPI的代码实现

1. 通过HttpServletResponse进行输出
package com.kuang.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

// 使用@Controller注解, 将该类注册为Controller层,交由Spring的IOC容器统一管理
@Controller
public class HelloController2 {
    
    /**
	 * 使用@RequestMapping注解, 设置映射请求的路径
	 * 真实访问路径为: http://localhost:8080/hello2/h1
      */
    @RequestMapping("/hello2/h1")
    public void hello1(HttpServletRequest request, HttpServletResponse response) throws IOException {
        // 通过response对象进行输出
        response.getWriter().println("Hello,Spring By Servlet API!");
    }
    
}
2. 通过HttpServletResponse实现重定向
package com.kuang.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

// 使用@Controller注解, 将该类注册为Controller层,交由Spring的IOC容器统一管理

@Controller
public class HelloController2 {   

    /**
	 * 使用@RequestMapping注解, 设置映射请求的路径
	 * 真实访问路径为: http://localhost:8080/hello2/h2
      */
    @RequestMapping("/hello2/h2")
    public void hello2(HttpServletRequest request, HttpServletResponse response) throws IOException {
        // 通过response对象进行重定向
        response.sendRedirect("/index.jsp");
    }
    
}
3. 通过HttpServletResponse实现转发
package com.kuang.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

// 使用@Controller注解, 将该类注册为Controller层,交由Spring的IOC容器统一管理
@Controller
public class HelloController2 {     
    
    /**
	 * 使用@RequestMapping注解, 设置映射请求的路径
	 * 真实访问路径为: http://localhost:8080/hello2/h3
      */
    @RequestMapping("/hello2/h3")
    public void hello3(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {
        
        // 设置属性msg与值
        request.setAttribute("msg","Hello.SpringMVC");
        // 通过request对象进行转发
        request.getRequestDispatcher("/WEB-INF/jsp/hello.jsp").forward(request,response);
    }
    
}

7.2.3 测试结果

1. 通过HttpServletResponse进行输出

在这里插入图片描述

结果输出成功,显示“Hello,Spring By Servelt API”的信息!

2.通过HttpServletResponse实现重定向
  • 重定向前

在这里插入图片描述

  • 重定向后

在这里插入图片描述

结果重定向成功,访问到默认的index.jsp页面!

3. 通过HttpServletResponse实现转发

在这里插入图片描述

结果转发请求成功,页面显示”Hello,SpringMVC“的信息!

7.2.4 Servlet的Httpsession对象的使用

1. 编写HelloController3控制类
package com.kuang.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

// 使用@Controller注解, 将该类注册为Controller层,交由Spring的IOC容器统一管理
@Controller
public class HelloController3 {
    
    // 使用@RequestMapping注解, 设置映射请求路径
    @RequestMapping("/hello3/h1")
    public String hello(HttpServletRequest request, HttpServletResponse response) {
        // 获取HttpSession对象
        HttpSession session = request.getSession();
        // 打印session对象的Id
        System.out.println(session.getId());
        // 返回给视图解析器进行解析处理(注意: 这里的hello是指要返回给视图解析器的视图逻辑名)
        return "hello"; 
    }
    
}
2. 测试结果
  • 访问请求页面

在这里插入图片描述

  • 查看控制台输出

在这里插入图片描述

结果成功访问/hello3/h1页面,并且打印出HttpSession对象的Id信息

7.3 SpringMVC实现转发和重定向

7.3.1 无视图解析器

通过SpringMVC来实现转发重定向无需视图解析器

注意测试前,要将视图解析器注释掉!

1.修改springmvc-servlet.xml配置文件
  • 配置文件只设置自动扫描包注释掉开启注解支持的驱动引入视图解析器
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="
        http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context.xsd">
    
    <!-- 自动扫描包,让指定包下的注解生效,由IOC容器统一管理 -->
    <context:component-scan base-package="com.kuang.controller"/>
    
</beans>
2.编写SpringmvcController控制类
2-1 实现转发方式一
package com.kuang.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

// 使用@Controller注解, 将该类注册为Controller层,交由Spring的IOC容器统一管理
@Controller
public class SpringmvcController {
    
    /** 
     * 使用@RequestMapping注解, 设置映射请求路径
     * 真实访问地址为: http://localhost:8080/hello4/h1
     */
    @RequestMapping("/hello4/h1")
    public String hello() {
        // 转发一
        return "/index.jsp";
    }
    
}
2-2 实现转发方式二
package com.kuang.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

// 使用@Controller注解, 将该类注册为Controller层,交由Spring的IOC容器统一管理
@Controller
public class SpringmvcController {
    
    /** 
     * 使用@RequestMapping注解, 设置映射请求路径
     * 真实访问地址为: http://localhost:8080/hello4/h2
     */
    @RequestMapping("/hello4/h2")
    public String hell2(Model model) {
        // 转发二
        model.addAttribute("msg","Hello,SpringMVC!");
        return "forward:/WEB-INF/jsp/hello.jsp";
    }
    
}
2-3 实现重定向
package com.kuang.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

// 使用@Controller注解, 将该类注册为Controller层,交由Spring的IOC容器统一管理
@Controller
public class SpringmvcController {
    
    /** 
     * 使用@RequestMapping注解, 设置映射请求路径
     * 真实访问地址为: http://localhost:8080/hello4/h3
     */
    @RequestMapping("/hello4/h3")
    public String hello3() {
        // 重定向
        return "redirect:/index.jsp";
    }
    
}
3.测试结果
2-1 实现转发方式一
  • 默认URL链接后加上 /hello4/h1,即真实访问地址为:http://localhost:8080/hello4/h1

在这里插入图片描述

结果成功转发到index.jsp页面

2-2 实现转发方式二
  • 默认URL链接后加上==/hello4/h2==,即真实访问地址为:==http://localhost:8080/hello4/h2 ==

在这里插入图片描述

结果成功转发到hello.jsp页面,并且显示“Hello,SpringMVC!”的信息!

2-3 实现重定向

默认URL链接后加上==/hello4/h3==,即真实访问地址为:http://localhost:8080/hello4/h3

  • 重定向前

在这里插入图片描述

  • 重定向后

在这里插入图片描述

结果成功重定向到index.jsp页面

7.3.2 使用视图解析器

通过SpringMVC来实现转发重定向,使用视图解析器

注意重定向不需要视图解析器,可以重定向到另一个请求实现

1.修改springmvc-servlet.xml配置文件
  • 配置文件只设置自动扫描包,并且开启注解支持的驱动引入视图解析器
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:mvc="http://www.springframework.org/schema/mvc"
       xsi:schemaLocation="
        http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context.xsd
        http://www.springframework.org/schema/mvc
        http://www.springframework.org/schema/mvc/spring-mvc.xsd">
    
    <!-- 自动扫描包,让指定包下的注解生效,由IOC容器统一管理 -->
    <context:component-scan base-package="com.kuang.controller"/>
    
    <!-- 让SpringMVC不处理静态资源: .css .js .html .mp3 .mp4 -->
    <mvc:default-servlet-handler/>
    
    <!-- 设置支持mvc注解驱动 (注意: 在Spring中一般采用@RequstMapping注解来完成映射关系)
         要想让@RequstMapping注解生效, 必须向上下文注册DefaultAnnotationHandlerMapping和一个AnnotationMethodHandlerAdapter实例;
         这两个实例分别在类级别和方法级别处理, 而annotation-driven配置帮助我们自动完成上述两个实例的注入
      -->
    <mvc:annotation-driven/>
    
    <!-- 视图解析器: 主要用于解析DispatcherServlet传递的ModelAndView对象 -->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"
          id="internalResourceViewResolver">
        <!-- 前缀 -->
        <!-- 在视图解析器中我们吧所有的视图都放在/WEB-INF/目录下:
             这样可以保证视图安全,因为这个目录下的文件,客户端不能直接访问 -->
        <property name="prefix" value="/WEB-INF/jsp/"/>
        <!-- 后缀 -->
        <property name="suffix" value=".jsp"/>
    </bean>
    
</beans>
2.编写SpringmvcController控制类
2-1 实现转发
package com.kuang.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

// 使用@Controller注解, 将该类注册为Controller层,交由Spring的IOC容器统一管理
@Controller
public class SpringmvcController2 {

    /** 
     * 使用@RequestMapping注解, 设置映射请求路径
     * 真实访问地址为: http://localhost:8080/hello4/h3
     */
    @RequestMapping("/hello5/h1")
    public String hello(Model model) {
        model.addAttribute("msg","Hello,Spring");
        //转发
        return "hello";
    }
    
}
2-2 实现重定向
  • 重定向不需要视图解析器,本质就是重新请求一个新地方,所以注意路径问题
package com.kuang.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

// 使用@Controller注解, 将该类注册为Controller层,交由Spring的IOC容器统一管理
@Controller
public class SpringmvcController2 {

    /** 
     * 使用@RequestMapping注解, 设置映射请求路径
     * 真实访问地址为: http://localhost:8080/hello5/h2
     */
    @RequestMapping("/hello5/h2")
    public String hello2() {
        //重定向:不需要视图解析
        // 本质就是重新请求一个新页面,所以要注意路径问题
        return "redirect:/index.jsp";
    }
}
3.测试结果
2-1 实现转发
  • 默认URL链接后加上 /hello5/h2,即真实访问地址为:http://localhost:8080/hello5/h2

在这里插入图片描述

结果成功转发到hello.jsp页面,并且显示“Hello,Spring”的信息!

2-2 实现重定向

默认URL链接后加上==/hello5/h2==,即真实访问地址为:http://localhost:8080/hello5/h2

  • 重定向前

在这里插入图片描述

  • 重定向后

在这里插入图片描述

结果成功重定向到index.jsp页面

7.3.3 使用总结

  • 使用forward转发和redirect重定向都不会走视图解析器,本质就是重新请求一个新位置
  • 重定向,不需要视图解析器,可以重定向到另一个请求实现,但要注其路径问题

好了,今天的有关 页面跳转方式的简单使用 的学习就到此结束啦。欢迎小伙伴们积极学习和讨论,喜欢的可以给蜗牛君点个关注,顺便来个一键三连。我们下期见,拜拜啦!


参考视频链接【狂神说Java】SpringMVC最新教程IDEA版通俗易懂

  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

狂奔の蜗牛rz

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值