`
234390216
  • 浏览: 10232269 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
博客专栏
A5ee55b9-a463-3d09-9c78-0c0cf33198cd
Oracle基础
浏览量:462597
Ad26f909-6440-35a9-b4e9-9aea825bd38e
springMVC介绍
浏览量:1775457
Ce363057-ae4d-3ee1-bb46-e7b51a722a4b
Mybatis简介
浏览量:1398309
Bdeb91ad-cf8a-3fe9-942a-3710073b4000
Spring整合JMS
浏览量:394995
5cbbde67-7cd5-313c-95c2-4185389601e7
Ehcache简介
浏览量:679961
Cc1c0708-ccc2-3d20-ba47-d40e04440682
Cas简介
浏览量:530847
51592fc3-854c-34f4-9eff-cb82d993ab3a
Spring Securi...
浏览量:1183872
23e1c30e-ef8c-3702-aa3c-e83277ffca91
Spring基础知识
浏览量:467783
4af1c81c-eb9d-365f-b759-07685a32156e
Spring Aop介绍
浏览量:151371
2f926891-9e7a-3ce2-a074-3acb2aaf2584
JAXB简介
浏览量:68129
社区版块
存档分类
最新评论

SpringMVC传递参数到重定向后的页面

阅读更多

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所写)

0
0
分享到:
评论

相关推荐

    SSM笔记-SpringMVC自定义视图及重定向视图、语言国际化

    重定向视图还支持属性传递,这些属性会被添加到URL的查询字符串中。 接下来,我们讨论语言国际化。SpringMVC提供了一套完整的支持多语言的解决方案。这通常涉及到以下几个步骤: 1. 创建资源文件:在项目的`src/...

    简单谈谈SpringMVC转发和重定向的区别

    在 SpringMVC 中,可以使用 `RedirectAttributes` 对象来传递参数到重定向后的页面上。例如: ```java @RequestMapping("/update.do") public String update(RedirectAttributes redirectAttributes) { ...

    详解SpringMVC重定向传参数的实现

    在Spring MVC中,重定向是一种常见的HTTP...通过正确使用`RedirectAttributes`和`addFlashAttribute`,可以在重定向过程中传递参数,同时确保在浏览器地址栏中显示新的URL,从而避免了因用户刷新页面导致的重复操作。

    springmvc高级参数绑定

    在这个场景中,我们需要实现一个功能,让用户能够在商品列表页面上选择多个商品,然后通过点击删除按钮将选中的商品ID批量传递给后端Controller,以便删除相应的商品信息。下面我们将详细讨论如何实现这个功能。 ...

    spring mvc重定向导致内存溢出解决方案

    在Spring MVC中使用重定向功能时,可以通过`RedirectAttributes`接口向重定向的目标页面传递参数。这种方式非常方便,但在某些场景下,如果处理不当,则可能引发内存溢出的问题。 ##### 1.1 问题现象 考虑以下代码...

    spring学习: spring mvc在redirect请求中传递数据

    标题中的“spring学习:spring mvc在redirect请求中传递数据”指的是在Spring MVC框架中,如何在重定向(Redirect)请求过程中传递参数。这通常涉及到HTTP响应的状态码、重定向URL以及模型数据的处理。在Spring MVC...

    SpringMVC杂记(三) 向导型Controller的实现(基于SpringMVC 3.1.1)

    RedirectAttributes则允许我们在处理完一个步骤后重定向到另一个页面,并传递需要的数据。 1. SessionAttributes的使用: 在Controller方法上使用`@SessionAttributes`注解可以指定哪些模型属性需要在会话中持久化...

    SpringMVC用户登录实例详解

    在SpringMVC的应用中,我们需要在web.xml中配置DispatcherServlet,并在Spring的配置文件中定义视图解析器如InternalResourceViewResolver,以处理视图名到实际JSP页面的映射。 2. **创建登录控制器**: 创建一个...

    后台与页面之间的传值以及页面与页面之间的传值

    1. URL参数:通过在URL中添加查询参数,可以从一个页面跳转到另一个页面并传递数据,但不适用于敏感信息,因为数据可见且易被篡改。 2. HTML表单:使用POST或GET方法提交表单,数据会被发送到服务器,服务器处理后...

    吴天雄--SpringMVC笔记.doc

    - 跳转方式:forward 和 redirect,分别对应页面内部转发和外部重定向。 - 作用域传值:session、request、application 等不同范围的变量传递。 - 文件上传与下载功能,支持大文件和断点续传。 - 异常处理机制,...

    springmvc-demo07-响应(数据共享,页面跳转).zip

    在本项目"springmvc-demo07-响应(数据共享,页面跳转)"中,我们将深入探讨如何使用Spring MVC处理数据响应以及实现页面间的跳转。 1. **数据共享**:在Web应用中,数据共享通常涉及在不同的请求之间传递信息。...

    SpringMVC 入门教程.pdf

    - 请求通过 `@RequestMapping` 注解映射到处理方法,通过 `ModelAndView` 或 `Model` 对象传递数据到视图。 - 使用 `redirect:` 和 `forward:` 前缀可以实现重定向和转发。 7. **注解驱动开发** - SpringMVC ...

    springmvc-data-object

    总结来说,Spring MVC通过一系列机制实现了从前端页面到后端对象的数据封装,这极大地提高了开发效率,使得开发者能专注于业务逻辑,而不是繁琐的数据处理。理解并熟练掌握这些机制,对于构建健壮的、易维护的Web...

    springMVC笔记.pdf 初学笔记

    视图解析器可以使用RequestDispatcher的forward方法来跳转到对应的页面,也可以使用RedirectView的redirect方法来重定向到对应的页面。 Session SpringMVC提供了Session机制,可以用于保存用户的会话信息。Session...

    springMVC教程

    使用 `ModelAndView` 或 `Model` 对象可以在 Controller 中将数据传递到 JSP 页面。`ModelAndView` 是 SpringMVC 中的视图模型,可以设置视图名和模型数据;`Model` 是一个接口,可以将数据添加到模型中,然后由 ...

    springmvc简单的登陆

    5. **视图处理**:根据验证结果决定重定向或转发到相应的视图。登录成功通常会跳转到主页,登录失败则重新显示登录页面,并添加错误信息。 6. **JSP 视图**:创建对应的 JSP 页面,如 `login.jsp` 显示登录表单,`...

    java SpringMVC登录

    同时,可以重定向用户到主页面或者显示欢迎信息。 对于错误处理,SpringMVC提供了异常处理机制。当登录失败时,可以抛出自定义异常,比如`InvalidCredentialsException`,并在Controller中捕获该异常,返回错误信息...

    springMVC第一个示例

    ` 将重定向到 "welcome" 视图。 6. **创建视图**:在 src/main/webapp/WEB-INF/views 目录下,创建对应的 JSP 页面,比如 "welcome.jsp",展示你希望用户看到的内容。 7. **运行项目**:启动服务器,访问应用的 ...

    springMVC DEMO

    - **Request参数**:通过URL请求参数传递。 - **ModelAndView对象**:在Controller中创建,包含模型数据和视图名称。 - **ModelMap**:类似于ModelAndView,但更灵活。 - **Session属性**:在多个请求间共享数据...

Global site tag (gtag.js) - Google Analytics