Spring MVC Flash Attribute 的讲解与使用示例
admin
2023-07-30 18:21:48
0

Spring MVC 3.1版本加了一个很有用的特性,Flash属性,它能解决一个长久以来缺少解决的问题,一个POST/Redirect/GET模式问题。

正常的MVC Web应用程序在每次提交都会POST数据到服务器。一个正常的Controller (被注解 @Controller标记)从请求获取数据和处理它 (保存或更新数据库)。一旦操作成功,用户就会被带到(forward)一个操作成功的页面。传统上来说,这样的POST/Forward/GET模式,有时候会导致多次提交问题. 例如用户按F5刷新页面,这时同样的数据会再提交一次。

为了解决这问题, POST/Redirect/GET 模式被用在MVC应用程序上. 一旦用户表单被提交成功, 我们重定向(Redirect)请求到另一个成功页面。这样能够令浏览器创建新的GET请求和加载新页面。这样用户按下F5,是直接GET请求而不是再提交一次表单。

Spring MVC Flash Attribute 的讲解与使用示例
Image credit: Wikipedia

Spring MVC Flash Attribute 的讲解与使用示例

Idiot_s_Sky

翻译于 3年前

5人顶

 翻译得不错哦!

虽然这一方法看起来很完美,并且解决了表单多次提交的问题,但是它又引入了一个获取请求参数和属性的难题. 通常当我们生成一次http重定向请求的时候,被存储到请求数据会丢失,使得下一次GET请求不可能访问到这次请求中的一些有用的信息.

Flash attributes 的到来就是为了处理这一情况. Flash attributes 为一个请求存储意图为另外一个请求所使用的属性提供了一条途径. Flash attributes 在对请求的重定向生效之前被临时存储(通常是在session)中,并且在重定向之后被立即移除.

Spring MVC Flash Attribute 的讲解与使用示例

为了这样做, Flash 特性使用了两个集合. FlashMap 被用来管理 flash attributes 而 FlashMapManager 则被用来存储,获取和管理 FlashMap 实体.

对于每一次请求一个 “input” flash map 会被创建,来存储来自任何之前请求的 flash attribute 还有一个 “output” flash map 会被创建,来存储任何我们存储在这个请求中的,之后的请求参数.

Spring MVC Flash Attribute 的讲解与使用示例

leoxu

翻译于 3年前

3人顶

 翻译得不错哦!

使用

要想在你的 Spring MVC 应用中使用 Flash attribute,要用 3.1 版本或以上。并且要在 spring-servlet.xml 文件中加入 mvc:annotation-driven。


这些都完成之后,Flash attribute 就会自动设为“开启”,以供使用了。只需在你的 Spring controller 方法中加入RedirectAttributes redirectAttributes。

import org.springframework.web.servlet.mvc.support.RedirectAttributes;//...

	@RequestMapping(value="addcustomer", method=RequestMethod.POST)	public String addCustomer(@ModelAttribute("customer") Customer customer,			final RedirectAttributes redirectAttributes) {	//...
		redirectAttributes.addFlashAttribute("message", "Successfully added..");	//...

		return "redirect:some_other_request_name";
	}


addFlashAttribute 方法会自动向 output flash map 中添加给定的参数,并将它传递给后续的请求。

我们来看看一个使用 Flash attribute 来完成 POST/Redirect/GET 并传递一些信息的完整实例吧。

Flash Attribute 实例

下面的应用向用户显示一个表单。当用户填完数据,并提交表单之后,页面会重定向到另一个显示成功信息的页面。在这个重定向的新页面中,会显示用户刚才输入的信息。

Spring MVC Flash Attribute 的讲解与使用示例

戴仓薯

翻译于 3年前

4人顶

 翻译得不错哦!

第1步: 需要的 JAR 和项目结构

如果你用 Maven 来做依赖管理,用下面的 dependencies 来添加 Spring 3.1 MVC 的支持。

	
		
		
			org.springframework
			spring-webmvc
			3.1.2.RELEASE
		
		
		
			jstl
			jstl
			1.2
		
	


或者,你可以下载以下 JAR 文件,然后把它们放在 /WEB-INF/lib 文件夹下。

Spring MVC Flash Attribute 的讲解与使用示例

第2步: Spring 配置

要为 web 项目添加 Spring 支持,需要在 web.xml 中添加 DispatcherServlet 。
web.xml


	
	Spring MVC Flash attribute example
	
		spring
		
			org.springframework.web.servlet.DispatcherServlet		
		1
	
	    	default    	/index.html
		
	
		spring
		*.html
	


然后,spring-servlet 使用 mvc:annotation-driven 来支持 mvc ,并且会扫描项目中的 context:component-scan 标签。

spring-servlet.xml


		
	
	
		
		
		
	 
	
	
	 


第3步: Spring Controller – RedirectAttributes

Controller 的代码使用 Customer.java 对象作为 bean 来保存客户信息。

Customer.java

package net.viralpatel.spring;public class Customer {	private String firstname;	private String lastname;	private int age;	private String email;	//getter, setter methods}


CustomerController 类有3个方法。showForm 方法对应 URL /form ,用来显示 Add New Customer 表单。addCustomer 方法对应 URL /addcustomer ,用来处理 POST 请求。

CustomerController.java

package net.viralpatel.controller;import net.viralpatel.spring.Customer;import org.springframework.stereotype.Controller;import org.springframework.web.bind.annotation.ModelAttribute;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RequestMethod;import org.springframework.web.servlet.mvc.support.RedirectAttributes;@Controllerpublic class CustomerController {	
	
	@RequestMapping(value="showform", method=RequestMethod.GET)	public String showForm(@ModelAttribute("customer") Customer customer) {		return "add_customer";	
	}	
	@RequestMapping(value="addcustomer", method=RequestMethod.POST)	public String addCustomer(@ModelAttribute("customer") Customer customer,			final RedirectAttributes redirectAttributes) {

		redirectAttributes.addFlashAttribute("customer", customer);
		redirectAttributes.addFlashAttribute("message","Added successfully.");		return "redirect:showcustomer.html";	
	}	
	@RequestMapping(value="showcustomer", method=RequestMethod.GET)	public String showCustomer(@ModelAttribute("customer") Customer customer) {
		System.out.println("cust:" + customer.getFirstname());		return "show_customer";
	}
}


注意我们在 addCustomer 方法中是如何使用 redirectAttributes 参数来添加 flash attribute 的。并且,我们是用 addFlashAttribute 方法来设置新的参数为 flash attribute。

Spring MVC Flash Attribute 的讲解与使用示例

戴仓薯

翻译于 3年前

4人顶

 翻译得不错哦!

第4步: View 层

add customer.JSP 文件显示一个 Add New Customer(添加新客户)表单。
add_customer.jsp

<%@taglib uri="http://www.springframework.org/tags/form" prefix="form"%>
	

Add New Customer

Firstname  
Lastname  
Age  
Email  


show_customer.jsp 简单地显示客户的名和姓,以及用 flash attributes 设置的成功信息。

show_customer.jsp

<%@taglib uri="http://www.springframework.org/tags/form" prefix="form"%>

${message}

${customer.lastname}, ${customer.firstname} added successfully..


Demo:

执行这个 web 项目即可。
URL: http://localhost:8080/SpringMVC_Flash_Attribute_Maven_example/form.html
Spring MVC Flash Attribute 的讲解与使用示例

Spring MVC Flash Attribute 的讲解与使用示例

本站所有代码来源请查看:×××/technology

相关内容

热门资讯

丘成桐:基础研究要讲“兴趣”,... 2026年7月6日,第三十六届国际弦理论大会(Strings 2026)在上海开幕。本届大会由上海数...
凤凰直击哈梅内伊葬礼高清现场:... 7月6日,伊朗在德黑兰为已故最高领袖哈梅内伊举行送葬仪式。凤凰卫视驻德黑兰记者李睿发回高清现场报道:...
C2B2M模式下,头部母婴品牌... 在母婴消费赛道,Babycare是一个无法被忽视的名字。从一款婴儿背带切入市场,到连续三年中国母婴用...
特朗普谈美国球员获“特赦”:是... 在特朗普干预后,国际足联放宽美国前锋巴洛贡的红牌处罚,引发全球舆论批评。福克斯新闻网7月6日报道,特...
不用自吹实力,看美军操作就知道... 有分析认为,解放军已建成覆盖第一、第二岛链的反介入/区域拒止作战圈,远洋作战能力也在快速发展。军事评...
豆包又一功能下线,“应用生成”... IT之家 7 月 6 日消息,据《读佳》今日消息,豆包在宣布全面下线“智能体”功能之前,其“应用生成...
腾讯正式发布混元Hy3 北京商报讯(记者 魏蔚)7月6日,腾讯混元Hy3 正式发布。相比preview版本,它展现出显著强于...
跳过麒麟9030 华为Mate... 7月6日消息,去年9月,华为发布了三折叠Mate XTs非凡大师。在这场发布会上,华为常务董事、终端...
宇树获批,人形机器人行情提速,... 近期,人形机器人产业迎来多重标志性催化:宇树科技获批文即将登陆资本市场,四足与人形机器人双线布局进入...
2026年游戏及多任务处理性能... 在2026年的今天,对于热爱手游、追求极致流畅体验,同时又需要具备强大后台多任务处理能力的用户来说,...