chapter07_SpringMVC的高级技术_4_跨重定向请求传递数据

本文探讨了在Spring MVC框架中,如何在处理完Post请求后进行重定向,以及如何在重定向过程中传递数据。介绍了两种常用的数据传递方式:通过URL模板和使用Spring的flash属性,详细解释了它们的工作原理和应用场景。
  • 处理完Post请求后,一般要进行重定向。防止因为浏览器刷新或回退时重新执行Post请求

  • 使用转发forward时,由于控制器方法和视图处理的是同一个request,所以转发的过程中,request的属性得以保存

  • 控制器方法中的Model对象最终是以请求参数的形式复制到请求中的,因此发生重定向时,不能用Model传递数据

  • 常用的跨重定向传递数据的方式有2种

    (1) 通过URL模板以__路径变量__和/或__查询参数__的形式传递数据(简单,数据少的情况)

    (2) 通过Spring的flash属性传递数据

  • 通过URL模板进行重定向数据传输

    (1) 之前采取的方法是 return (“redirect:/spitter/” + spitter.getUserName());

    这样做的危险支出在于userName中的不安全字符不会进行转义,造成不安全的情况

    (2) 示例

      @Controller
      @RequestMapping("/spitter")
      public class SpitterController {
    
          ...
    
          @RequestMapping(value = "/register", method = POST)
          public String processRegistration(Spitter spitter, Model model) {
    
              spitterRepository.save(spitter);
    
              model.addAttribute("username", spitter.getUserName());
              model.addAttribute("spitterId", spitter.getId());
    
              return "redirect:/spitter/{username}";
          }
    
          ...
      }
    

    首先在模型Model中添加两个属性 username和spitterId。其中,username作为占位符填充到了URL模板中,而不是直接进行字符串连接,这样username中的所有不安全字符都会进行转义,然后附加到路径上;

    spitterId属性没有匹配重定向URL中的任何占位符,它会__自动__以查询参数的形式附加到重定向URL上;

    所以,如果 username=“bochen”, spitterId=“1”,那么重定向的URL地址为 “/spitter/bochen?spitterId=1”

  • 通过flash属性进行重定向数据传输

    (1) URL模板的方式只能传递简单的字符串,不能传递对象

    (2) 能够长期存在的是 session,并且可以跨多个请求。所以我们应该在重定向前把对象放入session,重定向后从session取出对象,然后__将session清理掉__

    (3) spring的flash属性的底层原理同(2),但是它帮我们做好了这些工作,flash属性会__自动__一直携带数据一直到下一次请求然后消失。具体地,重定向前,所有的flash属性都会复制到session中;重定向后,flash属性被取出,并__从会话转移到模型Model中__,这就和获取其他的Model对象一样了

    (4) 示例

      @Controller
      @RequestMapping("/spitter")
      public class SpitterController {
    
          ...
    
          @RequestMapping(value = "/register", method = POST)
          public String processRegistration(
              @RequestPart(value = "profilePicture") MultipartFile profilePicture,
              @Valid Spitter spitter, Errors errors,
              RedirectAttributes redirectAttributes) throws IllegalStateException, IOException {
    
              if (errors.hasErrors()) {
                  return "registerForm";
              }
    
              spitterRepository.save(spitter);
              profilePicture.transferTo(new File("/" + spitter.getUsername() + ".png"));
    
              redirectAttributes.addAttribute("username", spitter.getUsername());
              redirectAttributes.addFlashAttribute("spitter", spitter);
    
              return "redirect:/spitter/{username}";
          }
    
          @RequestMapping(value = "/{username}", method = GET)
          public String showSpitterProfile(@PathVariable String username, Model model) {
    
              if (!model.containsAttribute("spitter")) {
    
                  model.addAttribute(spitterRepository.findByUsername(username));
              }
    
              return "profile";
          }
    
          ...
      }
    

    RedirectAttribute接口扩展了Model接口,增加了几个关于flash的方法。它可以像Model一样addAttribute(),这和URL模板传递数据方式一样;addFlashAttribute()方法可以传递数据到session中,实现跨重定向数据传输;

    当重定向到 /spitter/{username} 时,会被控制器的showSpitterProfile()处理。此时这个方法会读到路径变量username;同时重定向后,由于flash属性已经被取出,并且从会话转移到了Model,所以model对象也可以读到key为"spitter"的对象,这样就无需重新从数据库中再次查找了,直接交给profile视图渲染

下载前必看:https://pan.quark.cn/s/a4b39357ea24 在本资料中,将阐述如何运用JavaScript达成单击下拉列表框选定选项后即时转向对应页面的功能。 此种技术适用于网页布局中用户需迅速选取并转向不同页面的情形,诸如网站导航栏或内容目录等场景。 达成此功能,能够显著改善用户交互体验,精简用户的操作流程。 我们须熟悉HTML里的`<select>`组件,该组件用于构建一个选择列表。 用户可从中选定一项,并可引发一个事件来响应用户的这一选择动作。 在本次实例中,我们借助`onchange`事件监听器来实现当用户在下拉列表框中选定某个选项时,页面能自动转向该选项关联的链接地址。 JavaScript里的`window.location`属性旨在获取或设定浏览器当前载入页面的网址,通过变更该属性的值,能够实现页面的转向。 在本次实例的实现方案里,运用了`eval()`函数来动态执行字符串表达式,这在现代的JavaScript开发实践中通常不被推荐使用,因为它可能诱发安全问题及难以排错的错误。 然而,为了本例的简化展示,我们暂时搁置这一问题,因为在更复杂的实际应用中,可选用其他方法,例如ES6中的模板字符串或其他函数来安全地构建和执行字符串。 具体到本例的代码实现,`MM_jumpMenu`函数负责处理转向逻辑。 它接收三个参数:`targ`、`selObj`和`restore`。 其中`targ`代表要转向的页面,`selObj`是触发事件的下拉列表框对象,`restore`是标志位,用以指示是否需在转向后将下拉列表框的选项恢复至默认的提示项。 函数的实现通过获取`selObj`中当前选定的`selectedIndex`对应的`value`属性值,并将其赋予`...
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值