Spring MVC请求转发与请求重定向的示例详解

 更新时间:2023年09月13日 16:18:46   作者:啊Q老师  
转发指服务器接收请求后,从一个资源跳转到另一个资源中,请求转发是一次请求,不会改变浏览器的请求地址,这篇文章主要介绍了Spring MVC请求转发与请求重定向的相关知识,需要的朋友可以参考下

Spring MVC 请求转发请求重定向

在这里插入图片描述

请求转发

转发( forward ),指服务器接收请求后,从一个资源跳转到另一个资源中。请求转发是一次请求,不会改变浏览器的请求地址。

简单示例:

1.通过 String 类型的返回值实现转发

package cn.edu.springmvcdemo.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
public class ForwardAndRedirectDemo {
    @RequestMapping("/forwardTest1")
    public String forwardTest1(){
        return "ForwardAndRedirect";
    }
}

创建 ForwardAndRedirect.jsp

<%--
  Created by IntelliJ IDEA.
  User: dell
  Date: 2023/7/28
  Time: 22:35
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<body>
    <h3>请求转发</h3>
</body>
</html>

结果如图:

在这里插入图片描述

2.通过 ModelAndView 实现转发

package cn.edu.springmvcdemo.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;
@Controller
public class ForwardAndRedirectDemo {
    @RequestMapping("/forwardTest2")
    public ModelAndView forwardTest2(){
        ModelAndView mav = new ModelAndView();
        mav.setViewName("ForwardAndRedirect");
        return mav;
    }
}

结果如图:

在这里插入图片描述

3.通过 < mvc:view-controller > 标签实现转发

在 Spring MVC 配置文件 springmvc.xml 中配置

<!-- 配置请求转发实现 -->
<!-- 在通过 mvc:view-controller 标签实现转发中,添加该配置可以解决同时也通过 Controller 类方法访问出错的问题 -->
<mvc:annotation-driven />
<!-- path 映射地址;view-name 视图名字 -->
<mvc:view-controller path="/forwardTest3" view-name="ForwardAndRedirect" />

结果如图:

在这里插入图片描述

注:< mvc:annotation-driven > 是 Spring MVC 框架中的一个标签,主要作用是自动注册 Spring MVC 的处理器( Handler )和视图解析器( ViewResolver ),以便在应用程序中处理 HTTP 请求并生成相应的响应。具体来说,< mvc:annotation-driven > 标签可以完成以下任务:

注册 RequestMappingHandlerMapping 处理器映射,用于将 Spring 控制器方法(带有 @RequestMapping 注释)映射到 HTTP 请求注册 ExceptionHandlerExceptionResolver 异常处理器解析器,用于处理在控制器方法执行期间发生的异常注册 MessageConverter 消息转换器,用于将请求消息转换为控制器方法参数的类型,并将响应消息转换为视图解析器所需的类型注册 RequestResponseBodyAdvice advice,用于在请求和响应之间进行转换和类型转换

通过使用 < mvc:annotation-driven > 标签,开发人员可以更加简洁地配置 MVC 模式中的控制器部分,而无需手动注册这些组件,可以使代码更加清晰和易于维护。

请求重定向

重定向( redirect ),指服务器接收请求后,不能跳转到当前请求地址指向的资源中,但会指定新的资源地址返回给客户端,客户端再次请求访问指定资源。请求重定向是两次请求,会改变浏览器的请求地址。

简单示例:

1.通过 String 类型的返回值实现重定向

package cn.edu.springmvcdemo.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
public class ForwardAndRedirectDemo {
    //新的资源地址
    @RequestMapping("/redirectIndex")
    public String redirect(){
        return "ForwardAndRedirect";
    }
	//请求重定向
    @RequestMapping("/redirectTest1")
    public String redirectTest1(){
    	//指定新的资源地址
        return "redirect:/redirectIndex";
    }
}

ForwardAndRedirect.jsp 内容简单修改

<%--
  Created by IntelliJ IDEA.
  User: dell
  Date: 2023/7/28
  Time: 22:35
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<body>
    <h3>请求重定向</h3>
</body>
</html>

结果如图:输入 redirectTest1 后自动跳转到 redirectIndex

在这里插入图片描述

2.通过 ModelAndView 实现重定向

package cn.edu.springmvcdemo.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;
@Controller
public class ForwardAndRedirectDemo {
    @RequestMapping("/redirectIndex")
    public String redirect(){
        return "ForwardAndRedirect";
    }
    @RequestMapping("/redirectTest2")
    public ModelAndView redirectTest2(){
        ModelAndView mav = new ModelAndView();
        mav.setViewName("redirect:/redirectIndex");
        return mav;
    }
}

结果如图:输入 redirectTest2 后自动跳转到 redirectIndex

在这里插入图片描述

3.通过 < mvc:view-controller > 标签实现重定向同理,只需在 springmvc.xml 中配置

<!-- 配置请求转发重定向 -->
<!-- path 映射地址;view-name 指定新的资源地址 -->
<mvc:view-controller path="/redirectTest3" view-name="redirect:/redirectIndex" />

结果如图:输入 redirectTest3 后自动跳转到 redirectIndex

在这里插入图片描述

自定义视图,指定义一个自定义的视图对象,用于渲染模型数据并生成响应。自定义视图可以继承 View 、AbstractExcelView 或 AbstractPdfView 来将内容以某种格式( Excel 、Pdf 等)显示。

简单示例:下载 Excel 文档的需求实现

首先,在 pom.xml 中添加以下依赖

<!-- https://mvnrepository.com/artifact/org.apache.poi/poi-ooxml -->
<dependency>
  <groupId>org.apache.poi</groupId>
  <artifactId>poi-ooxml</artifactId>
  <version>4.1.2</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.poi/poi-ooxml -->
<dependency>
  <groupId>org.apache.poi</groupId>
  <artifactId>poi-ooxml</artifactId>
  <version>4.1.2</version>
</dependency>

接着,创建自定义视图类 ExcelViewDemo 继承 AbstractXlsxView ,设置文档的相关信息与数据写入

package cn.edu.springmvcdemo.web;
import cn.edu.springmvcdemo.model.DomainObject;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.springframework.web.servlet.view.document.AbstractXlsxView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.OutputStream;
import java.util.List;
import java.util.Map;
public class ExcelViewDemo extends AbstractXlsxView {
    @Override
    protected void buildExcelDocument(Map<String, Object> model, Workbook workbook, HttpServletRequest request, HttpServletResponse response) throws Exception {
        //设置文档名字
        String file = "ExcelTest.xlsx";
        //设置字符编码
        response.setCharacterEncoding("UTF-8");
        //设置内容类型,在 apache-tomcat-8.5.75/conf/web.xml 配置文件中查找 xlsx 可获取对应类型写法
        response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
        //设置头部信息(下载,下载文件名字)
        response.setHeader("Content-Disposition","inline;file" + new String(file.getBytes(),"UTF-8"));
        //获取 model 数据( controller 类处理方法中放进的数据)
        List<DomainObject> domainObjects = (List<DomainObject>) model.get("domainObjects");
        //获取数据后转换成 Excel 视图返回
        //1.创建 Excel 表(表中 sheet 的名字)
        Sheet sheet = workbook.createSheet("数据表");
        //2.创建第一行
        Row headRow = sheet.createRow(0);
        //3.创建第一行的1、2、3列
        headRow.createCell(0).setCellValue("编号");
        headRow.createCell(1).setCellValue("姓名");
        headRow.createCell(2).setCellValue("年龄");
        //遍历获取数据写入表中
        int rowNum = 1; //从表的第二行开始
        for(DomainObject domainObject:domainObjects){
            //创建新的一行
            Row row = sheet.createRow(rowNum++);
            //获取对应的数据
            row.createCell(0).setCellValue(domainObject.getId());
            row.createCell(1).setCellValue(domainObject.getName());
            row.createCell(2).setCellValue(domainObject.getAge());
        }
        OutputStream outputStream = response.getOutputStream();
        //将数据写入输出流
        workbook.write(outputStream);
        //清空输出流
        outputStream.flush();
        //关闭输出流
        outputStream.close();
    }
}

然后,创建 controller 类的方法,获取数据

package cn.edu.springmvcdemo.controller;
import cn.edu.springmvcdemo.model.DomainObject;
import cn.edu.springmvcdemo.web.ExcelViewDemo;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@Controller
public class ExcelDemo {
    @RequestMapping("/excelDownload")
    public ModelAndView excelViewTest(){
        Map<String,Object> map = new HashMap<>();
        //模拟:数据库中取出一个 domainObjects 的 list 集合
        DomainObject domainObject1 = new DomainObject();
        domainObject1.setId(728);
        domainObject1.setName("曹操");
        domainObject1.setAge(24);
        DomainObject domainObject2 = new DomainObject();
        domainObject2.setId(729);
        domainObject2.setName("刘备");
        domainObject2.setAge(22);
        DomainObject domainObject3 = new DomainObject();
        domainObject3.setId(730);
        domainObject3.setName("孙权");
        domainObject3.setAge(18);
        //先将数据放入 list 集合
        List<DomainObject> list = new ArrayList<>();
        list.add(domainObject1);
        list.add(domainObject2);
        list.add(domainObject3);
        // list 集合再放入 map 集合中
        // 键的名字与 (List<DomainObject>) model.get("domainObjects") 中的名字保持一致
        map.put("domainObjects",list);
        //(自定义视图对象,数据)
        ModelAndView mav = new ModelAndView(new ExcelViewDemo(),map);
        return mav;
    }
}

最后,重启服务器,测试结果输入地址,弹出下载窗口。结果如图:

在这里插入图片描述

Excel 表内容如图:

在这里插入图片描述

到此这篇关于Spring MVC请求转发与请求重定向的文章就介绍到这了,更多相关Spring MVC请求转发和重定向内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 关于SpringBoot中事务失效的几种情况

    关于SpringBoot中事务失效的几种情况

    这篇文章主要介绍了关于SpringBoot中事务失效的几种情况,Spring AOP默认使用动态代理,会给被代理的类生成一个代理类,事务相关的操作都通过代理来完成,使用内部方法调用时,使用的是实例调用,没有通过代理类调用方法,因此事务不会检测到失败,需要的朋友可以参考下
    2023-08-08
  • Java 单向队列及环形队列的实现原理

    Java 单向队列及环形队列的实现原理

    本文主要介绍了Java 单向队列及环形队列的实现原理,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-10-10
  • Java实现红黑树(平衡二叉树)的详细过程

    Java实现红黑树(平衡二叉树)的详细过程

    红黑树接近平衡的二叉树,插入,删除函数跟平衡二叉树一样,只是平衡函数不同,下面这篇文章主要给大家介绍了关于Java实现红黑树(平衡二叉树)的相关资料,需要的朋友可以参考下
    2021-10-10
  • Mybatis中的高级映射一对一、一对多、多对多

    Mybatis中的高级映射一对一、一对多、多对多

    这篇文章主要介绍了Mybatis中的高级映射一对一、一对多、多对多的相关资料,需要的朋友可以参考下
    2016-08-08
  • 关于Java中如何实现文件的读写操作

    关于Java中如何实现文件的读写操作

    在Java中,可以使用File和FileInputStream、FileOutputStream、BufferedReader、PrintWriter等类来进行文件读写操作,需要的朋友可以参考下
    2023-05-05
  • JSONObject toJSONString错误的解决

    JSONObject toJSONString错误的解决

    这篇文章主要介绍了JSONObject toJSONString错误的解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-02-02
  • 从一道面试题看你对java的理解程度

    从一道面试题看你对java的理解程度

    这篇文章主要给大家介绍了关于如何从一道面试题看你对java的理解程度的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起看看吧
    2018-09-09
  • 如何使用Mockito调用静态方法和void方法

    如何使用Mockito调用静态方法和void方法

    这篇文章主要介绍了如何使用Mockito调用静态方法和void方法的操作,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-07-07
  • 详解Java的面向对象和面向过程

    详解Java的面向对象和面向过程

    我们知道,Java是面向对象的编程语言,但是至今仍有不少同学还不太懂”面向对象“的确切含义,今天这篇文章就带大家真正地认识面向对象,感兴趣的同学可以跟着小编一起来学习
    2023-05-05
  • springboot+jwt实现token登陆权限认证的实现

    springboot+jwt实现token登陆权限认证的实现

    这篇文章主要介绍了springboot+jwt实现token登陆权限认证的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-06-06

最新评论