RedirectAttributes传递参数到重定向后的页面
Servlet容器在页面跳转时有两种方式,forward和redirect的,其中forward时应用的是在服务端的跳转,应用的是同一个request。而redirect是服务端通过响应301和对应的新地址告诉浏览器让浏览器重新请求新的地址。第一次请求和第二次请求使用的不是同一个request的。所以这种情况下,不能直接通过request传递参数到新的页面。SpringMVC默认使用的是forward请求,如果需要使用redirect跳转新页面,可以使用redirect:
前缀。forward请求时添加到Model中的参数都可以被传递到新的页面,而通过redirect:
跳转到新页面时,默认会自动把当前Model中包含的原始类型的属性及原始类型的Collection/Array作为查询参数传递下去。比如对于下面的处理器映射,如果我们请求/redirect/abc
,则会自动跳转到/abc
,并且会附上查询参数?a=1&b=2&c=1&c=2&c=3
,所以浏览器会自动请求/abc?a=1&b=2&c=1&c=2&c=3
。
@RequestMapping("/redirect/{target}")
public String redirectTo(@PathVariable("target") String redirectTo, Map<String, Object> model) {
model.put("a", "1");
model.put("b", 2);
model.put("c", Arrays.asList(1, 2, 3));
return "redirect:/" + redirectTo;
}
对于复杂的对象,通过查询参数的方式就不能自动传递了。这个时候我们就可以使用RedirectAttributes了,它是一种特殊的Model。它的定义如下:
public interface RedirectAttributes extends Model {
@Override
RedirectAttributes addAttribute(String attributeName, Object attributeValue);
@Override
RedirectAttributes addAttribute(Object attributeValue);
@Override
RedirectAttributes addAllAttributes(Collection<?> attributeValues);
@Override
RedirectAttributes mergeAttributes(Map<String, ?> attributes);
/**
* Add the given flash attribute.
* @param attributeName the attribute name; never {@code null}
* @param attributeValue the attribute value; may be {@code null}
*/
RedirectAttributes addFlashAttribute(String attributeName, Object attributeValue);
/**
* Add the given flash storage using a
* {@link org.springframework.core.Conventions#getVariableName generated name}.
* @param attributeValue the flash attribute value; never {@code null}
*/
RedirectAttributes addFlashAttribute(Object attributeValue);
/**
* Return the attributes candidate for flash storage or an empty Map.
*/
Map<String, ?> getFlashAttributes();
}
通过继承自Model的addAttribute等方法添加的属性,在重定向时会丢失或者以查询参数的方式传递。通过addFlashAttribute添加的属性则可以自动传递到新的页面的Model中,其内部会把它放到一个FlashMap中,区分input和output。由FlashMapManager管理,默认实现是基于Session的实现,即SessionFlashMapManager。redirect需要传参数到新页面时我们可以像如下这样,为处理器方法声明一个RedirectAttributes类型的参数,然后往其中通过addFlashAttribute添加需要传递的参数。在如下示例中我们通过addAttribute传递的参数key1和key2将通过附加为查询参数的方式传递,而通过addFlashAttribute传递的modelAttr1、modelAttr2和listAttr则会通过FlashMap传递。
@RequestMapping("/src")
public String index(RedirectAttributes redirectAttributes) {
/**
* addAttribute中的内容会作为redirect的URL的查询参数传递,即会以
* /redirectattributes/target?key1=value1&key2=value2的形式传递,
* 其中的value是以String的形式传递的,添加进去时会把它转换为String,如果内部没有对应的转换器支持则将
* 抛出异常。具体可以参考RedirectAttributesModelMap中的对应实现
*/
redirectAttributes.addAttribute("key1", "value1")
.addAttribute("key2", "value2");
/**
* addFlashAttribute中的内容会存放到Session中,且在一次页面跳转后失效。
*/
redirectAttributes.addFlashAttribute("modelAttr1", "modelAttr1Value1")
.addFlashAttribute("modelAttr2", "modelAttr1Value2")
.addFlashAttribute("listAttr", Arrays.asList(1, 2, 3));
return "redirect:/redirectattributes/target";
}
除了通过RedirectAttributes传递参数外,我们也可以直接获取角色为output的FlashMap,通过往其中添加属性来传递。其实使用RedirectAttributes时底层也是通过角色为Output的FlashMap来传递的。示例如下。
@RequestMapping("/src")
public String index(HttpServletRequest request) {
FlashMap flashMap = RequestContextUtils.getOutputFlashMap(request);
flashMap.put("abc", 111);
return "redirect:/redirectattributes/target";
}
在重定向之后通过FlashMap传递的参数会自动到Model中,所以我们可以从Model中获取对应的参数,如果是在页面上,我们可以直接从request中获取。如果是在Controller方法中,则可以通过在方法参数上使用@ModelAttribute获取,也可以直接定义Model或Map类型的方法参数,然后从Model或Map中获取。在如下示例中的方法参数modelAttr1就是从Model中获取参数modelAttr1,而方法体里面也定义了从model参数中获取参数modelAttr1。
@RequestMapping("/target")
public String target(@ModelAttribute("modelAttr1") String modelAttr1, @RequestParam("key1") String key1, Map<String, Object> model) {
//获取通过FlashMap传递过来的modelAttr1的值
Object attr1 = model.get("modelAttr1");
return "redirect_attributes_target";
}
我们也可以直接从Input角色的FlashMap中获取这些信息,其实底层也是从FlashMap中获取到的redirect传递过来的参数,然后把它们丢到Model中。示例如下:
@RequestMapping("/target")
public String target(HttpServletRequest request) {
Map<String, ?> map = RequestContextUtils.getInputFlashMap(request);
Object attr1 = map.get("modelAttr1");
return "redirect_attributes_target";
}
需要说明的是redirect传递的参数在Session中只存在一会,会在请求到达重定向后的页面后从session中清除。
(本文基于Spring4.1.0所写)
相关推荐
重定向视图还支持属性传递,这些属性会被添加到URL的查询字符串中。 接下来,我们讨论语言国际化。SpringMVC提供了一套完整的支持多语言的解决方案。这通常涉及到以下几个步骤: 1. 创建资源文件:在项目的`src/...
在 SpringMVC 中,可以使用 `RedirectAttributes` 对象来传递参数到重定向后的页面上。例如: ```java @RequestMapping("/update.do") public String update(RedirectAttributes redirectAttributes) { ...
在Spring MVC中,重定向是一种常见的HTTP...通过正确使用`RedirectAttributes`和`addFlashAttribute`,可以在重定向过程中传递参数,同时确保在浏览器地址栏中显示新的URL,从而避免了因用户刷新页面导致的重复操作。
在这个场景中,我们需要实现一个功能,让用户能够在商品列表页面上选择多个商品,然后通过点击删除按钮将选中的商品ID批量传递给后端Controller,以便删除相应的商品信息。下面我们将详细讨论如何实现这个功能。 ...
在Spring MVC中使用重定向功能时,可以通过`RedirectAttributes`接口向重定向的目标页面传递参数。这种方式非常方便,但在某些场景下,如果处理不当,则可能引发内存溢出的问题。 ##### 1.1 问题现象 考虑以下代码...
标题中的“spring学习:spring mvc在redirect请求中传递数据”指的是在Spring MVC框架中,如何在重定向(Redirect)请求过程中传递参数。这通常涉及到HTTP响应的状态码、重定向URL以及模型数据的处理。在Spring MVC...
RedirectAttributes则允许我们在处理完一个步骤后重定向到另一个页面,并传递需要的数据。 1. SessionAttributes的使用: 在Controller方法上使用`@SessionAttributes`注解可以指定哪些模型属性需要在会话中持久化...
在SpringMVC的应用中,我们需要在web.xml中配置DispatcherServlet,并在Spring的配置文件中定义视图解析器如InternalResourceViewResolver,以处理视图名到实际JSP页面的映射。 2. **创建登录控制器**: 创建一个...
1. URL参数:通过在URL中添加查询参数,可以从一个页面跳转到另一个页面并传递数据,但不适用于敏感信息,因为数据可见且易被篡改。 2. HTML表单:使用POST或GET方法提交表单,数据会被发送到服务器,服务器处理后...
- 跳转方式:forward 和 redirect,分别对应页面内部转发和外部重定向。 - 作用域传值:session、request、application 等不同范围的变量传递。 - 文件上传与下载功能,支持大文件和断点续传。 - 异常处理机制,...
在本项目"springmvc-demo07-响应(数据共享,页面跳转)"中,我们将深入探讨如何使用Spring MVC处理数据响应以及实现页面间的跳转。 1. **数据共享**:在Web应用中,数据共享通常涉及在不同的请求之间传递信息。...
- 请求通过 `@RequestMapping` 注解映射到处理方法,通过 `ModelAndView` 或 `Model` 对象传递数据到视图。 - 使用 `redirect:` 和 `forward:` 前缀可以实现重定向和转发。 7. **注解驱动开发** - SpringMVC ...
总结来说,Spring MVC通过一系列机制实现了从前端页面到后端对象的数据封装,这极大地提高了开发效率,使得开发者能专注于业务逻辑,而不是繁琐的数据处理。理解并熟练掌握这些机制,对于构建健壮的、易维护的Web...
视图解析器可以使用RequestDispatcher的forward方法来跳转到对应的页面,也可以使用RedirectView的redirect方法来重定向到对应的页面。 Session SpringMVC提供了Session机制,可以用于保存用户的会话信息。Session...
使用 `ModelAndView` 或 `Model` 对象可以在 Controller 中将数据传递到 JSP 页面。`ModelAndView` 是 SpringMVC 中的视图模型,可以设置视图名和模型数据;`Model` 是一个接口,可以将数据添加到模型中,然后由 ...
5. **视图处理**:根据验证结果决定重定向或转发到相应的视图。登录成功通常会跳转到主页,登录失败则重新显示登录页面,并添加错误信息。 6. **JSP 视图**:创建对应的 JSP 页面,如 `login.jsp` 显示登录表单,`...
同时,可以重定向用户到主页面或者显示欢迎信息。 对于错误处理,SpringMVC提供了异常处理机制。当登录失败时,可以抛出自定义异常,比如`InvalidCredentialsException`,并在Controller中捕获该异常,返回错误信息...
` 将重定向到 "welcome" 视图。 6. **创建视图**:在 src/main/webapp/WEB-INF/views 目录下,创建对应的 JSP 页面,比如 "welcome.jsp",展示你希望用户看到的内容。 7. **运行项目**:启动服务器,访问应用的 ...
- **Request参数**:通过URL请求参数传递。 - **ModelAndView对象**:在Controller中创建,包含模型数据和视图名称。 - **ModelMap**:类似于ModelAndView,但更灵活。 - **Session属性**:在多个请求间共享数据...