java重定向带参数_SpringMVC归纳-1(model数据模型与重定向传参技术)

本文详细介绍了SpringMVC中model数据模型的使用,包括model如何传递数据,以及重定向时的安全传参方法。通过案例展示了@RequestParam、@ModelAttribute的用法,以及redirectAttribute.addAttribute和addFlashAttribute的区别。强调了model传递数据的不安全性以及addFlashAttribute在传递敏感信息时的优势。
摘要由CSDN通过智能技术生成

要点:

model是一个Map结构的数据模型,能重定向时传递数据(拼接URL),但不安全,主要用于渲染前端页面,配合Thymeleaf填充html里面里设置好的参数。

@RequestParam用来获取查询字符串的参数值。

HttpServletRequest也可以获取查询字符串的参数值。

redirect: 用于重定向到新的url。

@ModelAttribute:运用在参数上,会将客户端传递过来的参数按名称注入到指定对象中,并且会将这个对象自动加入ModelMap中,便于View层使用。

@ModelAttribute:运用在方法上,会在每一个@RequestMapping标注的方法前执行,如果有返回值,则自动将该返回值加入到ModelMap中。

redirectAttribute.addAttribute实现URL字符串拼接,类似于model.addAttribute,但是它并不把数据添加到model里。

redirectAttribute.addFlashAttribute是安全的传参方法。

下面是以上几点的实例:

1 packagecom.example.demo.controller;2

3

4

5 importjavax.servlet.http.HttpServletRequest;6

7 importorg.springframework.stereotype.Controller;8 importorg.springframework.ui.Model;9 importorg.springframework.web.bind.annotation.ModelAttribute;10 importorg.springframework.web.bind.annotation.RequestMapping;11 importorg.springframework.web.bind.annotation.RequestParam;12 importorg.springframework.web.bind.annotation.ResponseBody;13

14

15 @Controller16 public classModelConclusion {17

18 /*

19 *从查询字符串里获取参数username的值20 * 把name添加到model模型里21 * 重定向到新的页面22 */

23 @RequestMapping("user")24 public String setAttribute(@RequestParam(value="username",defaultValue="Leo") String name,Model model) {25 model.addAttribute("name",name);26 return "redirect:user/1";27 }28

29 /*

30 * 再次绑定name到model32 * 查看req请求参数,发现添加到model里的属性也可以在请求参数中获得33 */

34 @RequestMapping("user/1")35 @ResponseBody()36 public String getAttribute(@ModelAttribute("name") String name,Model model,HttpServletRequest req) {37

38 String modelName="model->name:"+name;39 String modelString = "model:"+model.toString();40 String reqName = "req->name:"+req.getParameter("name");41

42 return modelName+"
"+modelString+"
"+reqName;43 }44

45 }

页面输出结果:

8d59f4fd277328e2c68a1106ed3e141b.png

发现,model里的数据添加到了URL里,从这一特点可以知道model传递数据是不安全的。所以我们使用model主要是因为java request没有与视图技术绑定,而非作为重定向时暂存一些重要数据,如密码。

另外,在两个方法参数里,系统都自动创建了新的model,所以重定向后的model不在被保留,但是通过@ModelAttribute再次将数据绑定在model里。

重新写一下setAttribute方法,以体现modelattibute绑定功能:

1 @RequestMapping("user")2 public String setAttribute(@ModelAttribute("name") String name,Model model) {3 return "redirect:user/1";4 }

@ModelAttribute用于方法前面时,先于所在Controller下的RequestMapping标注的所有方法执行,实例如下:

User:

1 packagecom.example.demo.service;2

3 public classUser {4

5 privateString name;6 privateInteger age;7 publicString getName() {8 returnname;9 }10 public voidsetName(String name) {11 this.name =name;12 }13 publicInteger getAge() {14 returnage;15 }16 public voidsetAge(Integer age) {17 this.age =age;18 }19

20 }

Controller:

1 packagecom.example.demo.controller;2

3 importorg.springframework.stereotype.Controller;4 importorg.springframework.web.bind.annotation.ModelAttribute;5 importorg.springframework.web.bind.annotation.RequestMapping;6 importorg.springframework.web.bind.annotation.ResponseBody;7

8 importcom.example.demo.service.User;9

10 @Controller11 public classModelConclusion3 {12

13 /*

14 * @ModelAttribute注解在方法前,在所有mapping前执行15 * 可以实现统一配置16 */

17 //绑定参数到对象属性

18 @ModelAttribute19 publicUser create(User newUser) {20 returnnewUser;21 }22

23 //获取名字

24 @RequestMapping("user/getname")25 @ResponseBody()26 publicString getName(User newUser) {27 returnnewUser.getName();28 }29

30 //获取年龄

31 @RequestMapping("user/getage")32 @ResponseBody()33 publicInteger getAge(User newUser) {34 returnnewUser.getAge();35 }36

37

38 }

在来看另一种重定向传参技术:

1 packagecom.example.demo.controller;2

3 importorg.springframework.stereotype.Controller;4 importorg.springframework.ui.Model;5 importorg.springframework.web.bind.annotation.RequestMapping;6 importorg.springframework.web.bind.annotation.ResponseBody;7 importorg.springframework.web.servlet.mvc.support.RedirectAttributes;8

9 @Controller10 public classModelConclusion2 {11

12 /*

13 * redirectAttribute.addAttribute功能时字符串拼接,类似于model.addAttribute,但是它并不把数据添加到model里14 * redirectAttribute.addFlashAttribute时安全的传递参数方法,原理是将数据添加到session里,等页面渲染好后从session里移除,最后加入到model模型里15 */

16

17 @RequestMapping("user2")18 publicString setAttribute(Model model,RedirectAttributes redirectAttribute) {19

20 redirectAttribute.addAttribute("name","Jack");21 redirectAttribute.addFlashAttribute("age",15);22 System.out.println(model);23

24 return "redirect:user2/1";25 }26

27 @RequestMapping("user2/1")28 @ResponseBody()29 publicString getAttribute(String name,Integer age,Model model) {30

31 System.out.println(age);32 System.out.println(name);33 System.out.println(model);34

35 return "hello";36 }37

38

39 }

控制台结果:

9091c97eff49fa89cae310feed53dc44.png

可以发现,addflash后model里是没数据的,而且由于它不是URL拼接,所以age也没有捕获到,但最后我们还是在model里找到它,所以addflash非常适合密码等信息的传递。

上述如有错误,望请指正!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值