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

SpringMVC转发和重定向

转发和重定向

1. View Resolver

Spring MVC 中的视图解析器(View Resolver)负责解析视图。可以通过在配置文件中定义一个 View Resolver 来配置视图解析器:

  • 配置文件版:spring-web.xml

    <!-- for jsp -->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"><property name="prefix" value="/WEB-INF/jsp/" /><property name="suffix" value=".jsp" />
    </bean>
    
  • 代码配置版:SpringWebConfig.java

    @Bean
    public InternalResourceViewResolver internalResourceViewResolver() {InternalResourceViewResolver viewResolver = new InternalResourceViewResolver();viewResolver.setPrefix("/WEB-INF/jsp/");viewResolver.setSuffix(".jsp");return viewResolver;
    }
    

对于一个已知的『逻辑视图名』,DispatcherServlet 会将请求转发到 prefix + view_name + suffix 的页面。

补充:InternalResourceViewResolver 是最常用的视图解析器(用于 .jsp 场景),但不是唯一的一个,Spring MVC 还有其他的视图解析器,例如:ThymeleafViewResolver

2. Model 和 ModelAndView

Spring MVC 提供了一个 Model 接口,它功能类似于 java.util.Map 接口。ModelMapModel 接口的实现类。

如果 Controller 的处理方法中有 ModelModeMap 作为参数,那么 Spring MVC 会(在 Controller 方法外)创建 ModelMap 对象,并传入 Controller 方法。ModelMap 对象将作为模型数据的存储容器。

ModelMap 对象起到的就是一个『结果参数』的作用。

Controller 方法中,我们可以从 ModelMap 对象中,存、取数据。

如果处理方法的返回结果是 ModelAndView ,则其既包含模型数据信息,也包含视图信息。

在 JSP 页面,可以直接通过 EL 表达式从模型对象中,取出模型数据以供页面展示。

Servlet 3.0 以下版本 EL 表达式功能默认时关闭的,记得要打开它。

3. 转发、重定向

如果你的 Controller 的『下一步』是跳转页面显示,那么你只需要在请求处理方法中返回逻辑视图名即可。

如果你的『下一步』操作是触发另一个 .do(或其它什么后缀),那么你需要使用转发和重定向。

Spring MVC 中实现转发和重定向非常简单:

  • 转发

    // 注意,
    return "forward:<url>";/* 或 */
    mav.setViewName("forward:<url>");
    return mav;
    
  • 重定向

    return "redirect:<url>";
    /* 或 */
    mav.setViewName("redirect:<url>");
    return mav;
    

这里有 2 点注意:

  1. forward:redirect: 后的 : 后面没有空格。

  2. 这里的 <url> 是『方法映射路径』,即 .do 一类,也就是你的另一个 @Controller 中的某个 @RequestMapping 中的那个值,而不是逻辑视图名

例如:

return "forward:/department/main.do";

注意,return "main";return "forward:/main-page"; 的最终执行的『效果』是一样的,但是执行的过程,走过的『路径』并不同。

4. 跳转异常页面

了解

全局异常处理后续专项讲解

在 Webapp 中,一旦发生了异常可以层层上抛,直到抛给 Spring MVC 的 DispacherServlet 。而 DispacherServlet 可以根据开发者所配置的配置一个『全局异常处理器』,来决定跳转哪个页面,展示何种信息。

默认情况下,Spring MVC 所使用的异常处理器是:SimpleMappingExceptionResolver (它是注解驱动帮我们配出来的那 19 个 JavaBean 之一),它所处理的效果正是我们当前所看到的内容:在一个临时页面上显示异常堆栈信息。

自定义的异常处理器需要实现 Spring MVC 提供的 HandlerExceptionResolver 接口,在其中 .resolveException 方法中可以根据自定义的逻辑返回 ModelAndView 对象,以决定跳转页面和展示信息。

使用自定义的异常处理器,需要在 Spring MVC 配置文件中做出配置:

<bean id="customHandleException" class="com.hemiao.web.exception.MyHandlerExceptionResolver"/>

相关文章:

SpringMVC转发和重定向

转发和重定向 1. View Resolver Spring MVC 中的视图解析器&#xff08;View Resolver&#xff09;负责解析视图。可以通过在配置文件中定义一个 View Resolver 来配置视图解析器&#xff1a; 配置文件版&#xff1a;spring-web.xml <!-- for jsp --> <bean class&q…...

勒索病毒最新变种.rmallox勒索病毒来袭,如何恢复受感染的数据?

导言&#xff1a; 随着信息技术的飞速发展&#xff0c;网络安全问题日益突出&#xff0c;其中勒索病毒便是近年来备受关注的网络安全威胁之一。在众多勒索病毒中&#xff0c;.rmallox勒索病毒以其独特的传播方式和强大的加密能力&#xff0c;给广大用户带来了极大的困扰。本文…...

复试专业课问题

1、数据结构&#xff1a;详细描述归并排序的过程 归并排序是用分治思想&#xff0c;分治模式在每一层递归上有三个步骤&#xff1a; 分解&#xff08;Divide&#xff09;&#xff1a;将n个元素分成个含n/2个元素的子序列。解决&#xff08;Conquer&#xff09;&#xff1a;用…...

比特币革命:刚刚开始

作者&#xff1a;Marius Farashi Tasooji 编译&#xff1a;秦晋 要充分理解比特币及其含义&#xff0c;首先必须理解什么是价值&#xff0c;什么是货币。以及是什么赋予资产价值&#xff1f; 这个问题看似愚蠢&#xff0c;但实际上非常有趣。我们的生活是由我们消费或出售的物品…...

淘宝店商家电话提取软件操作经验

淘宝爬虫工具是一种用于自动化获取淘宝网站数据的程序。以下是一个简单的淘宝爬虫工具的代码示例&#xff1a; import requests from bs4 import BeautifulSoupdef get_taobao_data(keyword):url fhttps://s.taobao.com/search?q{keyword}headers {User-Agent: Mozilla/5.0…...

【进阶六】Python实现SDVRPTW常见求解算法——遗传算法(GA)

基于python语言&#xff0c;采用经典蚁群算法&#xff08;ACO&#xff09;对 带硬时间窗的需求拆分车辆路径规划问题&#xff08;SDVRPTW&#xff09; 进行求解。 目录 往期优质资源1. 适用场景2. 代码调整2.1 需求拆分2.2 需求拆分后的服务时长取值问题 3. 求解结果4. 代码片段…...

【Android】App通信基础架构相关类源码解析

应用通信基础架构相关类源码解析 这里主要对Android App开发时&#xff0c;常用到的一些通信基础类进行一下源码的简单分析&#xff0c;包括&#xff1a; Handler&#xff1a;处理器&#xff0c;与某个Looper&#xff08;一个线程对应一个Looper&#xff09;进行关联。用于接…...

06-kafka配置

生产者配置 NAMEDESCRIPTIONTYPEDEFAULTVALID VALUESIMPORTANCEbootstrap.servershost/port列表&#xff0c;用于初始化建立和Kafka集群的连接。列表格式为host1:port1,host2:port2,…&#xff0c;无需添加所有的集群地址&#xff0c;kafka会根据提供的地址发现其他的地址&…...

Git、TortoiseGit、SVN、TortoiseSVN 的关系和区别

Git、TortoiseGit、SVN、TortoiseSVN 的关系和区别 &#xff08;一&#xff09;Git&#xff08;分布式版本控制系统&#xff09;:&#xff08;二&#xff09;SVN&#xff08;集中式版本控制系统&#xff09;&#xff08;三&#xff09;TortoiseGit一、下载安装 git二、安装过程…...

4月5日排序算法总结(1)

冒泡排序 利用每趟都确定出一个最大值或者最小值 如果需要排一个从小到大的数组&#xff0c;那么我们每一趟都要确定一个最大值放在最后&#xff0c;一共有n个数&#xff0c;我们最多需要排列n-1趟就可以了&#xff0c;我们可以改进自己的代码&#xff0c;利用一个flag标记&a…...

Pandas追加写入文件的时候写入到了第一行

# 原代码 def find_money(file_path, account, b_account, money, type_word, time):file pd.read_excel(file_path)with open(money.csv, a, newline, encodingutf-8) as f:for i in file.index:省略中间的代码if 省略中间的代码:file.loc[[i]].to_csv(f,indexFalse)find_sam…...

04---webpack编写可维护的构建配置

01 构建配置抽离成npm包&#xff1b; 意义&#xff1a;通用性&#xff1a; 业务开发者无需关注构建配置 统一团队构建脚本可维护性&#xff1a;构建配置合理的拆分 质量&#xff1a;冒烟测试 单元测试 持续集成构建配置管理的可选方案&#xff1a;1 通过多个配置文件管理不同…...

【云计算】云数据中心网络(一):VPC

云数据中心网络&#xff08;一&#xff09;&#xff1a;VPC 1.什么是 VPC2.VPC 的组成2.1 虚拟交换机2.2 虚拟路由器 3.VPC 网络规划3.1 VPC 数量规划3.2 交换机数量规划3.3 地址空间规划3.4 不同规模企业地址空间规划实践 4.VPC 网络高可靠设计4.1 单地域单可用区部署4.2 单地…...

自动驾驶中的多目标跟踪_第一篇

自动驾驶中的多目标跟踪:第一篇 多目标跟踪(multi-object/multi-target tracking)的任务包括估计场景中目标的数目、位置&#xff08;状态&#xff09;或其他属性&#xff0c;最关键的是需要在一段时间内持续地进行估计。 附赠自动驾驶学习资料和量产经验&#xff1a;链接 应…...

AI爆款文案 巧用AI大模型让文案变现插上翅膀

&#x1f482; 个人网站:【 摸鱼游戏】【神级代码资源网站】【工具大全】&#x1f91f; 一站式轻松构建小程序、Web网站、移动应用&#xff1a;&#x1f449;注册地址&#x1f91f; 基于Web端打造的&#xff1a;&#x1f449;轻量化工具创作平台&#x1f485; 想寻找共同学习交…...

Python入门的60个基础练习(一)

01-Hello World python的语法逻辑完全靠缩进&#xff0c;建议缩进4个空格。如果是顶级代码&#xff0c;那么必须顶格书写&#xff0c;哪怕只有一个空格也会有语法错误。下面示例中&#xff0c;满足if条件要输出两行内容&#xff0c;这两行内容必须都缩进&#xff0c;而且具有相…...

微软云学习环境

微软公有云 - Microsoft Azure 本文介绍通过微软学习中心Microsoft Learn来免费试用Azure上的服务&#xff0c;也不需要绑定信用卡。不过每天只有几个小时的时间。 官网 https://docs.microsoft.com/zh-cn/learn/ 实践 比如创建虚拟机&#xff0c;看到自己的账号下多了Learn的…...

大厂面试:找出数组中第k大的数的最佳算法

一.前置条件 假如数组为a,大小为n&#xff0c;要找到数组a中第k大的数。 二.解决方案 1.使用任意一种排序算法&#xff08;例如快速排序&#xff09;将数组a进行从大到小的排序&#xff0c;则第n-k个数即为答案。 2.构造一个长度为k的数组&#xff0c;将前k个数复制过来并降序…...

爬取高校专业信息的Python爬虫简介与实践

1. 介绍 在当前高校专业信息繁多的情况下&#xff0c;选择适合自己的专业成为了许多学生面临的挑战。为了帮助学生更好地了解各高校专业情况&#xff0c;我们开发了一个Python爬虫程序&#xff0c;用于爬取高校专业信息并保存到Excel文件中。本文将详细介绍该爬虫的实现过程以…...

redis 集群模式(redis cluster)介绍

目录 一 redis cluster 相关定义 1&#xff0c; redis cluster 是什么 2&#xff0c;redis 集群的组成 3&#xff0c;集群的作用 4&#xff0c;集群架构图 二 Redis集群的数据分片 1&#xff0c;哈希槽是什么 2&#xff0c;哈希槽如何排布 3&#xff0c;Redis集…...

Go语言开源漏洞扫描器Abyss-Scanner:架构解析与CI/CD集成实践

1. 项目概述&#xff1a;一个为安全而生的开源漏洞扫描器最近在整理自己的开源项目工具箱&#xff0c;发现一个挺有意思的工具&#xff0c;叫 Abyss-Scanner。这名字起得挺有深意&#xff0c;“深渊扫描器”&#xff0c;听起来就有点探索未知、发现潜在风险的味道。简单来说&am…...

Flutter GetX实战:从Provider迁移到GetX,我的开发效率提升了多少?

Flutter GetX实战&#xff1a;从Provider迁移到GetX的效率革命 当Flutter开发团队面临状态管理方案的选择时&#xff0c;往往会陷入一种甜蜜的烦恼——官方推荐的Provider虽然稳定可靠&#xff0c;但第三方库GetX却以"全家桶"式的解决方案不断吸引开发者的目光。作为…...

Free-NTFS-for-Mac深度剖析:打破macOS与Windows文件系统壁垒的完整解决方案

Free-NTFS-for-Mac深度剖析&#xff1a;打破macOS与Windows文件系统壁垒的完整解决方案 【免费下载链接】Free-NTFS-for-Mac Nigate: An open-source NTFS utility for Mac. It supports all Mac models (Intel and Apple Silicon), providing full read-write access, mountin…...

LangGraph 并发执行不是开 Goroutine 那么简单:状态竞争与事务处理

LangGraph 并发执行不是开 Goroutine 那么简单:状态竞争与事务处理深度解析 元数据 关键词:LangGraph, 大语言模型工作流, 有状态并发, 状态一致性, 事务处理, 多Agent系统, 分布式状态管理 摘要:很多开发者初次接触LangGraph的并发特性时,会下意识将其等同于传统协程/线程…...

技能工程化框架:从标准化定义到编排实战

1. 项目概述&#xff1a;从“技能”到“智能”的工程化桥梁在当今的软件开发领域&#xff0c;尤其是涉及复杂交互和自动化流程的场景&#xff0c;我们常常会听到“技能”这个词。它听起来很抽象&#xff0c;但如果你拆解过任何一款智能助手、自动化机器人或者一个大型的业务流程…...

OpenSpeedy终极指南:如何通过开源游戏加速工具突破帧率限制

OpenSpeedy终极指南&#xff1a;如何通过开源游戏加速工具突破帧率限制 【免费下载链接】OpenSpeedy &#x1f3ae; An open-source game speed modifier. 项目地址: https://gitcode.com/gh_mirrors/op/OpenSpeedy 你是否厌倦了游戏中的卡顿和帧率限制&#xff1f;Open…...

Onekey:重构Steam Depot清单下载流程的现代化解决方案

Onekey&#xff1a;重构Steam Depot清单下载流程的现代化解决方案 【免费下载链接】Onekey Onekey Steam Depot Manifest Downloader 项目地址: https://gitcode.com/gh_mirrors/one/Onekey Onekey作为一款专为Steam Depot清单设计的自动化下载工具&#xff0c;通过其创…...

Midjourney湿版摄影风格实战手册(从胶片化学原理到Prompt工程):含12组经大英博物馆湿版藏品验证的Reference Prompt库

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;湿版摄影的历史溯源与Midjourney风格化转译本质 湿版摄影&#xff08;Wet Plate Collodion Process&#xff09;诞生于1851年&#xff0c;由弗雷德里克斯科特阿彻&#xff08;Frederick Scott Archer&a…...

C++运行时类型识别实战:从typeid().name()到可读类型名

1. 为什么我们需要关心运行时类型识别&#xff1f; 在C开发中&#xff0c;我们经常会遇到需要知道某个变量或表达式具体类型的情况。特别是在调试复杂代码、编写泛型程序或进行元编程时&#xff0c;能够准确获取类型信息就显得尤为重要。想象一下&#xff0c;当你看到一个日志输…...

基于RAG的智能知识库问答系统:从原理到部署实战

1. 项目概述&#xff1a;当AI大模型遇见知识库&#xff0c;一个开源的智能问答解决方案 最近在折腾一个很有意思的开源项目&#xff0c;叫 zhimaAi/chatwiki 。光看名字&#xff0c;你大概能猜到它的核心&#xff1a; chat 代表对话&#xff0c; wiki 代表知识库。没错&a…...