当前位置: 首页 > news >正文

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: 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 表内容如图:
在这里插入图片描述

相关文章:

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

Spring MVC 请求转发请求重定向附 请求转发 转发&#xff08; forward &#xff09;&#xff0c;指服务器接收请求后&#xff0c;从一个资源跳转到另一个资源中。请求转发是一次请求&#xff0c;不会改变浏览器的请求地址。 简单示例&#xff1a; 1.通过 String 类型的返回值…...

按键灯待机2秒后灭掉

修改文件&#xff1a;/device/mediatek/mt6580/init.mt6580.rc chown system system /sys/class/leds/red/triggerchown system system /sys/class/leds/green/triggerchown system system /sys/class/leds/blue/triggerchown system system sys/devices/platform/device_info/…...

SpringBoot通过自定义注解实现日志打印

目录 前言&#xff1a; 正文 一.Spring AOP 1.JDK动态代理 2.Cglib动态代理 使用AOP主要的应用场景&#xff1a; SpringBoot通过自定义注解实现日志打印 一.Maven依赖 二.ControllerMethodLog.class自定义注解 三.Spring AOP切面方法的执行顺序 四.ControllerMethodL…...

代码随想录算法训练营第七天 |151.翻转字符串里的单词

今天是代码随想录的第七天&#xff0c;写了力扣的151.翻转字符串里的单词&#xff1b; 之后或许还要再琢磨琢磨 代码随想录链接 力扣链接 151.翻转字符串里的单词&#xff0c;代码如下&#xff1a; # class Solution: # def reverseWords(self, s: str) -> str: # …...

【WebRTC---源码篇】(十:一)WEBRTC 发送视频RTP包

RTPSenderVideo在整个框架中起到重要的作用,它把采集的数据进行编码,并且在流程中会进行将编码后的数据进行RTP打包,最后发送到网络层 RTPSenderVideo::SendVideo //对编码数据打包 bool RTPSenderVideo::SendVideo(int payload_type,absl::optional<VideoCodecType>…...

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 的 …...

Shape Completion Enabled Robotic Grasping

摘要-这项工作提供了一个架构&#xff0c;使机器人能够通过形状完成抓取规划。形状完成是通过使用3D卷积神经网络(CNN)来完成的。该网络是在我们自己的新的开源数据集上训练的&#xff0c;该数据集包含了从不同视角捕获的超过44万个3D样本。运行时&#xff0c;从单个视角捕获的…...

【C++】构造函数意义 ( 构造函数显式调用与隐式调用 | 构造函数替代方案 - 初始化函数 | 初始化函数缺陷 | 默认构造函数 )

文章目录 一、构造函数意义1、类的构造函数2、构造函数显式调用与隐式调用3、构造函数替代方案 - 初始化函数4、初始化函数缺陷5、默认构造函数6、代码示例 - 初始化函数无法及时调用 一、构造函数意义 1、类的构造函数 C 提供的 构造函数 和 析构函数 作为 类实例对象的 初始化…...

VMware16安装ghost版win7

文章目录 准备工作GHO 文件装机工具 新建虚拟机配置虚拟机还需要一个 CD/DVD PE 安装步骤分区还原挂载 CD/DVD开始还原 还原之后 准备工作 GHO 文件 可以去百度搜索这种文件&#xff0c;我这里是从系统之家下载的deepin win7 ghost 系统 装机工具 因为下载的 ghost 版的 w…...

项目集成swagger,访问不到swagger页面

项目集成swagger 文章目录 前言一、背景二、问题复现1.Full authentication is required to access this resource2.Illegal DefaultValue null for parameter type integer 总结 前言 项目集成swagger这个没啥好整的&#xff0c;maven项目就在pom文件导入依赖&#xff0c;ser…...

微信小程序怎么隐藏顶部导航栏(navigationBar)变透明的解决方案

怎么隐藏小程序顶部导航栏&#xff08;navigationBar&#xff09;&#xff1f; 官网说&#xff1a;Navigation是小程序的顶部导航组件&#xff0c;当页面配置 navigationStyle 设置为 custom 的时候可以使用此组件替代原生导航栏。 那么&#xff0c;我们就知道这种效果是可以…...

RabbitMQ基础概念-02

RabbitMQ是基于AMQP协议开发的一个MQ产品&#xff0c; 首先我们以Web管理页面为 入口&#xff0c;来了解下RabbitMQ的一些基础概念&#xff0c;这样我们后续才好针对这些基础概念 进行编程实战。 可以参照下图来理解RabbitMQ当中的基础概念&#xff1a; 虚拟主机 virtual hos…...

从构建者到设计者的低代码之路

低代码开发技术&#xff0c;是指无需编码或通过少量代码就可以快速生成应用程序的工具&#xff0c;一方面可降低企业应用开发人力成本和对专业软件人才的需求&#xff0c;另一方面可将原有数月甚至数年的开发时间成倍缩短&#xff0c;帮助企业实现降本增效、灵活迭代。那么&…...

Linux创建进程 及父子进程虚拟空间 多进程GDB调试

父子进程的资源是读时共享&#xff0c;写时拷贝&#xff0c;用到某一个资源&#xff0c;比如说改变变量的值的时候才去拷贝这个变量到一个独立的空间 父子进程的关系&#xff1a; 区别&#xff1a; 1.fork&#xff08;&#xff09;函数的返回值不同 父进程中&#xff1a;>…...

uni-app 之 表格设置

uni-app 之 表格设置 image.png <view style"padding: 3%; border: #1296db;"><table style"width: 100%; border-collapse: collapse; "><tr style"height: 50px;border: 2px solid;border-color: #F7F7F7;"><td style&qu…...

Linux易混淆知识点

1. 使用 vi 编辑某个文件时&#xff0c;执行删除某行/某几行的操作&#xff1a; dd&#xff1a;删除光标所在行&#xff1b; 6dd&#xff1a;表示删除当前行开始 6 行数据。 ndd&#xff1a; 删除当前行开始的连续 n 行&#xff1b; n1,n2d&#xff1a;删除 n1 到 n2 行&#x…...

移植FlashDB、SFUD到STM32f407

个人上篇文章 搭建STM32F407的SPI-Flash&#xff08;基于STM32CubeMX&#xff09;_小刚学長的博客-CSDN博客 主要是解决STM32CubeMX这边的配置&#xff0c;对code端侧是简单介绍了下 实际项目上一般都是拿片外flash存储一些东西&#xff0c;比如一些比较多的配置、参数&…...

【算法基础】时间复杂度和空间复杂度

目录 1 算法的评价 2 算法复杂度 2.1 时间复杂度&#xff08;Time Complexity&#xff09; 2.1.1 如何计算时间复杂度&#xff1a; 2.1.2 常见的时间复杂度类别与示例 2.2 空间复杂度 2.2.1 如何计算空间复杂度 2.2.2 常见的空间复杂度与示例 3 时间复杂度和空间复杂度…...

解决微信小程序不支持TextEncoder/TextDecoder对象

问题描述&#xff1a;在使用小程序开发者工具开发小程序中使用到了CRC算法&#xff0c;其中有一行代码使用到了TextEncoder对象&#xff0c;在开发工具中一切正常&#xff0c;到手机上会报出错误错误如下&#xff1a; MiniProgramError TextEncoder is not defined ReferenceEr…...

Qt下SVG格式图片应用

SVG格式图片介绍 svg格式图片又称矢量图&#xff0c;该种格式的图片不同于png等格式的图片&#xff0c;采用的并不是位图的形式来组织图片&#xff0c;而是采用线条等组织图片&#xff0c;svg格式是图片的文件格式是xml&#xff0c;可以通过文件编译器打开查看svg格式内容。 …...

python异常处理

参考语法&#xff1a;https://docs.python.org/zh-cn/3/tutorial/errors.html 在编写代码的时候&#xff0c;如果你写的程序出现报错&#xff0c;程序就会停止运行&#xff0c;后面的代码就不再执行。 如果程序发生错误&#xff0c;可以在代码中添加异常处理&#xff0c;保证程…...

go get命令不再具有安装功能

go get功能呢 一直以来&#xff0c;我们知道go get命令可以借助代码管理工具通过远程拉取或更新代码包及其依赖包&#xff0c;并自动完成编译和安装。整个过程就像安装一个App一样简单。 go get命令可以动态获取远程代码包&#xff0c;命令在内部实际上分成了两步操作&#x…...

合宙Air724UG LuatOS-Air lvgl7-lvgl(矢量字体)

如何用开发板实现lvgl加载外部矢量字体功能 目录名称 如何用开发板实现lvgl加载外部矢量字体功能 简介材料准备API 说明步骤 1. 将字库芯片接在模块spi上2. 版本定制3. 初始化spi4. 设置字体5.字体使用测试固件和脚本显示效果字号灰度最佳粗细值对应表常见问题 1. 设置68号字体…...

LRU的实现

题目内容 实现一个 LRUCache 类&#xff0c;三个接口&#xff1a; LRUCache(int capacity) 创建一个大小为 capacity 的缓存get(int key) 从缓存中获取键为 key 的键值对的 valueput(int key, int value) 向缓存中添加键值对 (key, value) 要求 get 和 put 的均摊时间复杂度…...

consul 备份还原导入导出

正文 工作中要保证生产环境部署的consul的集群能够安全稳定地对外提供服务&#xff0c;即使出现系统故障也能快速恢复&#xff0c;这里将讲述部分的备份还原操作及KV的导入导出操作。 备份与还原 配置文件、服务器状态 需要备份的主要有两类数据&#xff1a;consul相关的配置文…...

6.网络编程套接字(下)

文章目录 4.TCP流套接字编程4.1ServerSocket API4.2Socket API4.3TCP中的长短连接4.4示例一&#xff1a;一发一收&#xff08;长连接&#xff09;4.4.1TCP服务端4.4.2TCP客户端 4.5示例二&#xff1a;请求响应&#xff08;短连接&#xff09;4.5.1TCP服务端4.5.2TCP客户端 4.6再…...

4.3-内置后置PostProcess处理器深度讲解

在reader里面注册了很多Bean定义 reader会调取register()来注册配置类 调用上句&#xff0c;就会把配置类注册到BeanDefinitionMap中去 配置类有了、解析配置类的处理器有了 然后&#xff0c; 在第三步refresh() 进行IOC容器刷新中的invokeBeanPostProcessors(beanFactory…...

LeetCode(力扣)45. 跳跃游戏 IIPython

LeetCode45. 跳跃游戏 II 题目链接代码 题目链接 https://leetcode.cn/problems/jump-game-ii/description/ 代码 class Solution:def jump(self, nums: List[int]) -> int:if len(nums) 1:return 0curdis 0nextdis 0step 0for i in range(len(nums)):nextdis max(…...

mysql5.8 免安装版(压缩包)win10 安装

目录 1、下载MySQL5.82、如何安装、配置my.ini配置注意 3初始化mysql3.1. 初始化mysql3.2. 安装mysql服务3.3. 启动mysql3.4. 登录mysql3.5. 修改root密码3.6. 配置远程连接 Mysql5.8安装踩坑记录&#xff0c;推荐使用Docker安装&#xff0c;我是电脑虚拟化可能会蓝屏没用这个功…...

STM32-HAL库06-硬件IIC驱动FM24CL16B非易失存储器

STM32-HAL库06-IIC驱动FM24CL16B非易失存储器 一、所用材料&#xff1a; STM32VGT6自制控制板 STM32CUBEMX&#xff08;HAL库软件&#xff09; MDK5 二、所学内容&#xff1a; 通过HAL库的硬件IIC对FM24CL16B存储器进行写与读取操作。 三、CUBEMX配置&#xff1a; 第一步…...

青岛做网站公司哪家好/企业内训机构

1.背景介绍 相信很多人手机上都收到过一些营销短信&#xff0c;短信里面有时候会附带一些网址&#xff0c;如下图 这些网址往往都是非常短&#xff0c;但是当我们打开之后&#xff0c;如果你仔细观察&#xff0c;中间会有跳转&#xff0c;最终浏览器地址栏显示的网址并不是你短…...

网站建设pdf 下载/seo优化排名易下拉软件

Hash Identifier可以用来识别各种类型的哈希值。在kali上使用方法很简单 &#xff08;1&#xff09;搜索hash-identifier &#xff08;2&#xff09;在HASH后面输入要识别的hash内容 &#xff08;3&#xff09;识别成功 windows平台上这款工具&#xff0c;效果都差不多。...

中国核工业第五建设公司网站/泉州关键词快速排名

https://wenku.baidu.com/view/7bdc4a446c85ec3a86c2c532.html https://wenku.baidu.com/view/c4195a202a160b4e767f5acfa1c7aa00b52a9de5.html?rec_flagdefault&sxts1587691004853...

easy ssl wordpress/百度最怕哪个投诉电话

SPI是一种高速的、全双工、同步通信总线&#xff0c;并且只占用四根线&#xff0c;常用来和FLASH、数字信号处理器等通信。SPI通信要比I2C简单&#xff0c;它以主从方式工作&#xff0c;这种模式通常有一个主设备和一个或多个从设备&#xff0c;通常也只需要四根线&#xff0c;…...

如何查询网站/百度关键词搜索引擎排名优化

nessus 转载于:https://www.cnblogs.com/cnqfz/p/11211145.html...

worldpress做网站/百度竞价开户费用

系统安装初步之如何让原来跑DOS的机器也同时跑Linux(转)假如您想把Linux装在原来属於DOS的机器里, 您第一件事就要确定DOS是否占用您硬碟的全部, 假如是的话(大部分情况正是如此), 您就就必须重新分割硬碟。与硬碟相关的一个名词非常重要, 本书从头到尾几乎都有用到这观念 -- 分…...