SpringMVC Redirect 跳转后保存Model中的数据

在做项目编码时,几乎都不可避免的要用到Redirect跳转并保存其中的参数。例如下面的需求:

在用户的列表页面删除一个用户,在删除后仍停留在列表页面,但是要显示删除成功或者相应的错误信息。

以上这种情况在后台我们一般都分成2个controller,一个删除的controller和一个查询列表的controller,这时候我们就需要用到Redirect跳转,在删除成功后进行跳转进行列表查询,(在struts2中是action到action的跳转)。

参考如下代码:

  
  
  1. /**
  2. * 用户列表
  3. *
  4. * @return
  5. */
  6. @RequestMapping(value = "list-user", method = RequestMethod.GET)
  7. public String listUser(UserVo user, ModelMap modelMap) {
  8. Pager pager = userService.queryPageList(user);
  9. modelMap.put("pager", pager);
  10. return "admin/list-user";
  11. }
  12. /**
  13. * 删除用户
  14. *
  15. * @param userId the user id
  16. * @param modelMap the model map
  17. * @return string
  18. */
  19. @RequestMapping(value = "delete-user", method = RequestMethod.POST)
  20. public String deleteUser(Long[] userId, ModelMap modelMap) {
  21. userService.deleteUser(userId);
  22. modelMap.put("resultMsg", "删除成功");
  23. return "redirect:list-user.shtml";
  24. }

我们发现,当删除成功后跳转到list-user这个controller时,“删除成功”这个消息丢失了。当然你可以在删除用户后再加入查询用户列表的代码而不进行controller之间的redirect跳转,但显然这不够优雅,有没有什么好的解决办法呢?

有需求肯定就会有解决办法,在这里我总结一下个人认为比较好用的、常用的方法,以及spring为我们封装的方法(推荐):

方式一:自己手动拼接url

  
  
  1. return "redirect:list-user.shtml?param1="+value1+"&param2="+value2;

这个方式比较麻烦而且有个弊端,就是参数是中文的时候很难处理。

方式二:自己封装一个类

自己进行一些封装,包括中文的处理,转码解码等,好处是可以根据自己想要的自由实现,坏处是增加了工作量。在一些没有提供现成工具的框架中(例如strut2,个人所知貌似提供了action之间的传值,和url传值类似,中文就会杯具。如果有好的处理,欢迎拍砖。),适合用此方法。

代码:略。

方式三:使用spring mvc提供的现成工具类

这也是本人推荐的实现方式,当然前提是你用了spring mvc。

在spring mvc中,我们常用的是ModelMap,但是它还提供了一个RedirectAttributesModelMap类,该类实现了RedirectAttributes接口,提供一个闪存存储方案,使属性能够在重定向时依旧生存而不用嵌入到url,以下是官方文档的介绍:

A ModelMap implementation of RedirectAttributes that formats values as Strings using a DataBinder. Also provides a place to store flash attributes so they can survive a redirect without the need to be embedded in the redirect URL.

有了这个,我们处理起来就简单多了,参考如下代码:

  
  
  1. @RequestMapping(value = "delete-user", method = RequestMethod.POST)
  2. public String deleteUser(Long[] userId, RedirectAttributesModelMap modelMap) {
  3. userService.deleteUser(userId);
  4. modelMap.addFlashAttribute("resultMsg", "删除成功");
  5. return "redirect:list-user.shtml";
  6. }

发现进行redirect跳转后,“删除成功”的消息仍旧为我们保持着。

其实最底层仍旧是两种跳转,只不过spring又进行了封装而已,原理是把属性放到session中,在跳到页面后又在session中马上移除对象,所以在刷新一下后这个值就会丢掉。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
SpringMVC增加数据有多种方法,以下是其一种常用的方法: 1. 创建一个Controller类,并在类添加一个处理添加数据请求的方法,例如: ``` @Controller public class UserController { @Autowired private UserService userService; @PostMapping("/user") public String addUser(User user) { userService.addUser(user); return "redirect:/user/list"; } @GetMapping("/user/list") public String listUsers(Model model) { List<User> userList = userService.getUserList(); model.addAttribute("users", userList); return "userList"; } } ``` 2. 在方法注入一个UserService实例,该实例用来处理用户数据的添加操作,例如: ``` @Autowired private UserService userService; ``` 3. 在方法使用@PostMapping注解来指定它处理的请求是一个POST请求,路径为/user,例如: ``` @PostMapping("/user") public String addUser(User user) { userService.addUser(user); return "redirect:/user/list"; } ``` 4. 在方法使用一个User参数来获取用户提交的数据,例如: ``` public String addUser(User user) { userService.addUser(user); ... } ``` 5. 在方法调用UserService的一个添加用户的方法,例如: ``` userService.addUser(user); ``` 6. 在方法使用一个重定向来跳转到用户列表界面,例如: ``` return "redirect:/user/list"; ``` 7. 创建一个UserService类,并在类添加方法来处理用户数据,例如: ``` @Service public class UserService { @Autowired private UserDao userDao; public void addUser(User user) { userDao.addUser(user); } public List<User> getUserList() { return userDao.getUserList(); } } ``` 8. 在方法注入一个UserDao实例,该实例用来与数据库进行交互,例如: ``` @Autowired private UserDao userDao; ``` 9. 在添加用户的方法调用UserDao的添加用户的方法,例如: ``` userDao.addUser(user); ``` 10. 在获取用户列表的方法调用UserDao的获取用户列表的方法并返回结果,例如: ``` public List<User> getUserList() { return userDao.getUserList(); } ``` 注意:以上代码仅适用于概念说明,具体实现可能因项目架构而有所不同。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值