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

 更新时间:2017年01月20日 17:19:37   作者:Joepis  
本篇文章主要介绍了详解SpringMVC重定向传参数的实现,我们可以使用重定向的方式,改变浏览器的地址栏,防止表单因为刷新重复提交。有兴趣的可以了解一下。

在spring的一个controller中要把参数传到页面,只要配置视图解析器,把参数添加到Model中,在页面用el表达式就可以取到。但是,这样使用的是forward方式,浏览器的地址栏是不变的,如果这时候浏览器F5刷新,就会造成表单重复提交的情况。所以,我们可以使用重定向的方式,改变浏览器的地址栏,防止表单因为刷新重复提交。

jsp文件:

<%@ page language="java" contentType="text/html; charset=UTF-8" 
  pageEncoding="UTF-8"%> 
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> 
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> 
<html> 
<head> 
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 
<title>login</title> 
</head> 
<body> 
   
  <form id="form1" action="/demo/user/login" method="post"> 
    账号:<input type="text" name="name" /></br> 
    密码:<input type="password" name="password" /></br> 
    <input type="submit" value="submit"/> 
     
  </form> 
 
</body> 
</html> 

controller:

package com.demo.controller; 
 
import java.util.Map; 
import org.springframework.stereotype.Controller; 
import org.springframework.ui.Model; 
import org.springframework.web.bind.annotation.RequestMapping; 
import org.springframework.web.bind.annotation.RequestParam; 
 
/** 
 * @author lpj 
 * @date 2016年7月10日 
 */ 
@Controller 
@RequestMapping("/user") 
public class DemoController { 
 
  @RequestMapping("/login") 
  public String login(@RequestParam Map<String, String> user, Model model) { 
    System.out.println("用户提交了一次表单"); 
    String username; 
    if (user.get("name").isEmpty()) { 
      username = "Tom"; 
    } else { 
      username = user.get("name"); 
    } 
    model.addAttribute("msg", username); 
//    return "home";//此方式跳转,页面刷新会重复提交表单 
    return "redirect:/home.jsp"; 
  } 
 
} 

由于重定向相当于2次请求,所以无法把参数加在model中传过去。在上面例子中,页面获取不到msg参数。要想获取参数,可以手动拼url,把参数带在后面。

Spring 3.1 提供了一个很好用的类:RedirectAttributes。 使用这个类,我们可以把参数随着重定向传到页面,不需自己拼url了。

把上面方法参数中的Model换成RedirectAttributes,参数就自动跟在url后了。

但是,这样页面不能用el获取到,还要另外处理,所以,我们还有一种方式,不拼url,用el获取参数,就像普通转发一样。

还是使用RedirectAttributes,但是这次不用addAttribute方法,spring为我们准备了新方法,addFlashAttribute()。

这个方法原理是放到session中,session在跳到页面后马上移除对象。所以你刷新一下后这个值就会丢失。

package com.demo.controller; 
 
import java.util.Map; 
 
import org.springframework.stereotype.Controller; 
import org.springframework.ui.Model; 
import org.springframework.web.bind.annotation.ModelAttribute; 
import org.springframework.web.bind.annotation.RequestMapping; 
import org.springframework.web.bind.annotation.RequestParam; 
import org.springframework.web.servlet.mvc.support.RedirectAttributes; 
 
/** 
 * @author lpj 
 * @date 2016年7月10日 
 */ 
@Controller 
@RequestMapping("/user") 
public class DemoController { 
 
  @RequestMapping("/login") 
// public String login(@RequestParam Map<String, String> user, Model model) { 
  public String login(@RequestParam Map<String, String> user, RedirectAttributes model) { 
    System.out.println("用户提交了一次表单"); 
    String username; 
    if (user.get("name").isEmpty()) { 
      username = "Tom"; 
    } else { 
      username = user.get("name"); 
    } 
    model.addFlashAttribute("msg", username); 
//   return "home";//此方式跳转,页面刷新会重复提交表单 
    return "redirect:/user/toHome"; 
  } 
   
  @RequestMapping("/toHome") 
  public String home(@ModelAttribute("msg") String msg, Model model) { 
    System.out.println("拿到重定向得到的参数msg:" + msg); 
    model.addAttribute("msg", msg); 
    return "home"; 
  } 
} 

这边我们使用@ModelAttribute注解,获取之前addFlashAttribute添加的数据,之后就可以正常使用啦。

需要例子代码的可以点此下载:http://xiazai.jb51.net/201701/yuanma/springmvcdemo_jb51.rar

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • Java单测void类型的方法详解

    Java单测void类型的方法详解

    这篇文章主要给大家介绍了Java中单测void类型的方法,文中给出了详细的示例代码,相信对大家的理解和学习具有一定的参考借鉴价值,需要的朋友可以跟着小编下面来一起学习学习吧。
    2017-01-01
  • 详解Spring Boot应用的启动和停止(start启动)

    详解Spring Boot应用的启动和停止(start启动)

    这篇文章主要介绍了详解Spring Boot应用的启动和停止(start启动),小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-12-12
  • Java实现购物管理系统

    Java实现购物管理系统

    这篇文章主要为大家详细介绍了Java实现购物管理系统,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-01-01
  • 如何使用spring boot的程序主线程中异步访问外部接口

    如何使用spring boot的程序主线程中异步访问外部接口

    CompletableFuture.supplyAsync提供了一种强大的工具,使您能够以异步方式执行操作,充分利用多核处理器和提高程序性能,同时保持代码的清晰性和可维护性,本文给大家介绍使用spring boot的程序主线程中异步访问外部接口,感兴趣的朋友一起看看吧
    2023-10-10
  • 详解SpringMVC——接收请求参数和页面传参

    详解SpringMVC——接收请求参数和页面传参

    这篇文章主要介绍了详解SpringMVC——接收请求参数和页面传参,小编觉得挺不错的,现在分享给大家,也给大家做个参考。
    2016-12-12
  • SpringBoot如何优雅的实现重试功能

    SpringBoot如何优雅的实现重试功能

    这篇文章主要详细介绍了SpringBoot如何优雅的实现重试功能的步骤详解,文中有详细的代码示例,具有一定的参考价值,感兴趣的同学可以借鉴阅读
    2023-06-06
  • maven打包时候修改包名称带上git版本号和打包时间方式

    maven打包时候修改包名称带上git版本号和打包时间方式

    这篇文章主要介绍了maven打包时候修改包名称带上git版本号和打包时间方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-04-04
  • Java AbstractMethodError案例分析详解

    Java AbstractMethodError案例分析详解

    这篇文章主要介绍了Java AbstractMethodError案例分析详解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-08-08
  • 类似Object监视器方法的Condition接口(详解)

    类似Object监视器方法的Condition接口(详解)

    下面小编就为大家带来一篇类似Object监视器方法的Condition接口(详解)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-05-05
  • SpringBoot3.0+SpringSecurity6.0+JWT的实现

    SpringBoot3.0+SpringSecurity6.0+JWT的实现

    本文主要介绍了SpringBoot3.0+SpringSecurity6.0+JWT的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-11-11

最新评论