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

news2024/7/6 18:19:18

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 > 标签可以完成以下任务:

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1004778.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

开学季买哪个牌子的电容笔好?ipad触控笔推荐平价

我想很多学生们在新学期开始之前就开始买iPad了&#xff0c;如今&#xff0c;作为iPad主要配件之一的电容笔&#xff0c;功能越来越强&#xff0c;使用的人也越来越多。所以&#xff0c;怎样选择一支质量好&#xff0c;价格便宜的电容笔就成了人们最为关注的问题。所以&#xf…

软件测试需求分析

1.1 需求的重要性 1.1.1 软件缺陷的8020原则 1) 在软件测试过程中&#xff0c;从需求分析开始到集成测试阶段引入测试手段&#xff0c;能发现所有缺陷的80%&#xff1b;系统测试阶段引入测试手段&#xff0c;能发现剩余缺陷中80%的缺陷&#xff1b;在运行维护阶段经过长…

云服务器与http服务器

如何与http服务器建立连接&#xff08;客户端&#xff09;&#xff1f; http请求设计格式&#xff1a; 例子&#xff1a; 发送http请求 http数据响应格式&#xff1a; 接收http服务器返回的数据需要进一步进行字符串处理操作&#xff0c;提取有用的数据。

21天学会C++:Day8----范围for与nullptr

目录 ​编辑 1. 范围for 2. nullptr 1. 范围for 我们在写C语言循环遍历代码的时候&#xff0c;无论是用 for循环&#xff0c;while循环都需要考虑循环的起始条件&#xff0c;循环变量的递增逻辑&#xff0c;循环的结束条件。麻烦不说还可能会出错。 int main() {int arr[]…

2023-09-11 LeetCode每日一题(课程表 III)

2023-09-11每日一题 一、题目编号 630. 课程表 III二、题目链接 点击跳转到题目位置 三、题目描述 这里有 n 门不同的在线课程&#xff0c;按从 1 到 n 编号。给你一个数组 courses &#xff0c;其中 courses[i] [durationi, lastDayi] 表示第 i 门课将会 持续 上 durati…

MySQL版数据库原理与应用期末复习重点(1)---关系代数(除运算和自连接查询、手写例题)

文章目录 一、除运算题目二、自连接查询 一、除运算题目 注&#xff1a;在除运算中就包含了选择和投影运算。 二、自连接查询 注&#xff1a;自连接查询一般很少用到。

引爆效率!新一代搜索引擎软件助您快速获取关键数据

一款突破性的搜索引擎软件&#xff0c;助您轻松检索相关数据 →→MsrayPlus官方网址 您是否曾为从海量信息中筛选出关键数据而烦恼&#xff1f;现在&#xff0c;我们为您推出一款全新的搜索引擎软件&#xff0c;让您从繁杂的搜索结果中快速捕捉所需信息。这款软件拥有三大功…

电脑网络不能用?解决99%的网络连接问题...

公文&#xff1a;网络又不能用了&#xff1f; 检查设备连接 首先&#xff0c;我们需要确保所有的网络设备都正确连接。检查以下几点&#xff1a; 路由器状态&#xff1a;确保路由器的电源开关打开&#xff0c;并且显示灯在正常工作。 网线连接&#xff1a;检查所有网线连接…

.Net MVC 使用Areas后存在相同Controller时报错的解决办法; 从上下文获取请求的Area名及Controller名

先来说个额外的问题&#xff1a;如何在请求上下文&#xff08;比如过滤器的中&#xff09;获取请求对应的Area和Controller 名字&#xff1f;&#xff08;假设请求上下文对象为 filterContext &#xff09;&#xff1a; 1. 获取Area名: (string)filterContext.RouteData.DataTo…

山西3D数字化企业品牌展馆

为持续扩大展览群众性和覆盖面、强化影响力和传播力&#xff0c;让更多群众方便快捷、丰富生动地体验展览&#xff0c;展览办委托中央广播电视总台央视网建设了展览数字化网上展馆&#xff0c;通过网络手段&#xff0c;全要素呈现展览内容&#xff0c;全景式还原现场体验&#…

腾讯云2核4G服务器5M带宽 218元一年 优惠价格明细表

腾讯云2核4G服务器5M带宽可以选择轻量应用服务器或云服务器ECS&#xff0c;轻量2核4G5M带宽服务器218元一年&#xff1a; 腾讯云2核4G服务器5M带宽收费 腾讯云2核4G服务器可以选择轻量应用服务器或者ECS云服务器&#xff0c;云服务器ECS是专业级云服务器&#xff0c;大多数使用…

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

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

C++继承相关应用练习

1、 实现一个图形类&#xff08;Shape&#xff09;&#xff0c;包含受保护成员属性&#xff1a;周长、面积&#xff0c; 公共成员函数&#xff1a;特殊成员函数书写 定义一个圆形类&#xff08;Circle&#xff09;&#xff0c;继承自图形类&#xff0c;包含私有属性&#xf…

试试用Markdown来设计表单

相信很多后端开发。对于前端知识是比较零碎的&#xff0c;所以很多时候写表单这样的工作&#xff0c;一般就是复制黏贴&#xff0c;然后改改字段。对于HTML格式&#xff0c;一直觉得比较杂乱&#xff0c;不够简洁。 最近TJ发现了一个有趣的小工具&#xff1a;Create HTML Form…

新手请进,Python是什么,Python简介!

Python 是荷兰人 Guido van Rossum &#xff08;吉多范罗苏姆&#xff0c;中国程序员称其为“龟叔”&#xff09;在 1990 年初开发的一种解释型编程语言。 图1&#xff1a;Python 的标志&#xff08;Logo&#xff09; Python 的诞生是极具戏曲性的&#xff0c;据 Guido 自述记载…

【拼多多API接口开发系列】拼多多商品详情接口:卖家必知的赚钱利器

拼多多&#xff0c;作为中国最大的社交电商之一&#xff0c;为卖家提供了丰富的商品详情接口。这些接口可以帮助卖家快速获取商品信息&#xff0c;提高销售效率。本文将详细介绍如何使用拼多多商品详情接口&#xff0c;以及它的优势和注意事项。 一、拼多多商品详情接口概述 …

LabVIEW以编程方式查找系统中DAQ设备的设备名称

LabVIEW以编程方式查找系统中DAQ设备的设备名称 使用DAQmx VI&#xff0c;“创建虚拟通道”函数&#xff0c;这个函数需要物理通道输入端。当使用相同型号的新设备&#xff08;例如&#xff0c;两个不同的USB-6210&#xff09;运行可执行文件时&#xff0c;代码会中断&#xf…

医院院检验科LIS系统源码 检验申请、标本编号、联机采集、报告单的生成与打印、质控图的绘制和数据的检索与备份

一套符合医院院检验科实际需要的管理系统, 实现检验业务全流程的计算机管理。从检验申请、标本编号、联机采集、中文报告单的生成与打印、质控图的绘制和数据的检索与备份。通过将所有仪器自身提供的端口与科室LIS系统中的工作站点连接,实现与医院HIS系统的联网。 通过门诊医生…

python基于GDAL的多线程高速批量重采样、对齐栅格、对齐行列数,并无损压缩

在自己写代码处理遥感数据进行波段计算&#xff0c;或者基于遥感等空间数据进行机器学习、深度学习时&#xff0c;一般都需要各图层行列数一致。在QGIS中有“对齐栅格”工具可以完成该任务&#xff0c;但是QGIS中没有提供批量操作的接口&#xff0c;在数据比较多时&#xff0c;…

PCL入门(五):随机采样一致性算法RANSAC简单使用

目录 1. 简介2. 简单使用 1. 简介 参考博客《随机抽样一致性&#xff08;RANSAC&#xff09;算法详解》 该算法根据数据集获得满足一定条件的参数估计&#xff0c;实现利用尽可能少的数据获得尽可能大的一致性数据集。具体来说&#xff0c; 步骤1&#xff1a;从数据集中随机…