Spring MVC:请求转发与请求重定向

news/2025/3/19 4:31:28/

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: dellDate: 2023/7/28Time: 22:35To 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 > 标签可以完成以下任务:

  1. 注册 RequestMappingHandlerMapping 处理器映射,用于将 Spring 控制器方法(带有 @RequestMapping 注释)映射到 HTTP 请求
  2. 注册 ExceptionHandlerExceptionResolver 异常处理器解析器,用于处理在控制器方法执行期间发生的异常
  3. 注册 MessageConverter 消息转换器,用于将请求消息转换为控制器方法参数的类型,并将响应消息转换为视图解析器所需的类型
  4. 注册 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: dellDate: 2023/7/28Time: 22:35To 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 {@Overrideprotected 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 表内容如图:
在这里插入图片描述


http://www.ppmy.cn/news/1107294.html

相关文章

Debian下Hadoop集群安装

Debian下Hadoop集群安装 依赖安装 jdk 8 sudo apt-get update && sudo apt-get install -y wget apt-transport-https wget -O - https://packages.adoptium.net/artifactory/api/gpg/key/public | sudo tee /etc/apt/keyrings/adoptium.asc echo "deb [signed…

青大数据机构【2013】

关键字&#xff1a; 邻接表空间复杂度、求无向图连通分量&#xff08;BFS、DFS&#xff09;、B树根节点最小关键字、平均查找长度最小的排序、二叉树排序叶子结点次序不变、不同次序建立二叉排序树及中序遍历、直接插入排序特点、强连通分量、邻接矩阵邻接表 一、单选&#x…

cmd 90 validate error!(达梦数据库日志报错)

达梦数据库报错 error-cmd 90 validate error! 环境介绍1 解决办法 环境介绍 某生产环境数据库启动后&#xff0c;dm_实例名_202309.log&#xff0c;偶尔报错cmd 90 validate error! 1 解决办法 接口用错了&#xff0c;消息非法&#xff0c;比如用 6 的 JDBC 连 7 或 7 的 …

HTTP RESTFul RPC

一、简介 &#xff08;1&#xff09;HTTP&#xff08;Hypertext Transfer Protocol&#xff09;是一种应用层协议。它经常用于在Web和服务器之间通讯&#xff0c;或服务与服务之间通讯。 &#xff08;2&#xff09;RESTFul 约束HTTP协议实现上的规范设计。 &#xff08;3&am…

浑元太极大招“武德有悔”-UMLChina建模知识竞赛第4赛季第12轮

DDD领域驱动设计批评文集 “软件方法建模师”不再考查基础题 《软件方法》各章合集 参考潘加宇在《软件方法》和UMLChina公众号文章中发表的内容作答。在本文下留言回答。 最先答对所有3题者&#xff0c;即可获得本轮优胜。 所有题目的回答必须放在同一条消息中&#xff0…

使用C语言EasyX 创建动态爱心背景

简介 在计算机图形学的世界中&#xff0c;有很多方法可以使程序的界面更加吸引人。在本篇博客中&#xff0c;我将向大家介绍如何使用 EasyX 图形库在 C 中创建一个动态的爱心背景。这不仅是一个简单的动画效果&#xff0c;它还包括背景的星星、旋转的心形以及一个美观的背景渐…

橡胶密封件为什么会老化?

橡胶密封件以其优良的密封性能被广泛应用于各个行业。然而&#xff0c;随着时间的推移&#xff0c;这些橡胶密封件往往会恶化和老化。在这篇文章中&#xff0c;我们将探讨橡胶密封件老化的原因。 1&#xff0c;导致橡胶密封件老化的主要因素之一是暴露在阳光和紫外线(UV)辐射下…

AI项目六:WEB端部署YOLOv5

若该文为原创文章&#xff0c;转载请注明原文出处。 一、介绍 最近接触网页大屏&#xff0c;所以就想把YOLOV5部署到WEB端&#xff0c;通过了解&#xff0c;知道了两个方法&#xff1a; 1、基于Flask部署YOLOv5目标检测模型。 2、基于Streamlit部署YOLOv5目标检测。 代码在…