要点:

  1. model是一个Map结构的数据模型,能重定向时传递数据(拼接URL),但不安全,主要用于渲染前端页面,配合Thymeleaf填充html里面里设置好的参数。
  2. @RequestParam用来获取查询字符串的参数值。
  3. HttpServletRequest也可以获取查询字符串的参数值。
  4. redirect: 用于重定向到新的url。
  5. @ModelAttribute:运用在参数上,会将客户端传递过来的参数按名称注入到指定对象中,并且会将这个对象自动加入ModelMap中,便于View层使用。
  6. @ModelAttribute:运用在方法上,会在每一个@RequestMapping标注的方法前执行,如果有返回值,则自动将该返回值加入到ModelMap中。
  7. redirectAttribute.addAttribute实现URL字符串拼接,类似于model.addAttribute,但是它并不把数据添加到model里。
  8. redirectAttribute.addFlashAttribute是安全的传参方法。

   下面是以上几点的实例:

  

 package com.example.demo.controller;

 import javax.servlet.http.HttpServletRequest;

 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.bind.annotation.ResponseBody; @Controller
public class ModelConclusion { /*
*从查询字符串里获取参数username的值
* 把name添加到model模型里
* 重定向到新的页面
*/
@RequestMapping("user")
public String setAttribute(@RequestParam(value="username",defaultValue="Leo") String name,Model model) {
model.addAttribute("name",name);
return "redirect:user/1";
} /*
* 再次绑定name到model * 查看req请求参数,发现添加到model里的属性也可以在请求参数中获得
*/
@RequestMapping("user/1")
@ResponseBody()
public String getAttribute(@ModelAttribute("name") String name,Model model,HttpServletRequest req) { String modelName="model->name:"+name;
String modelString = "model:"+model.toString();
String reqName = "req->name:"+req.getParameter("name"); return modelName+"<br>"+modelString+"<br>"+reqName;
} }

  页面输出结果:

  

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

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

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

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

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

  User:

 package com.example.demo.service;

 public class User {

     private String name;
private Integer age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
} }

  Controller:

 package com.example.demo.controller;

 import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody; import com.example.demo.service.User; @Controller
public class ModelConclusion3 { /*
* @ModelAttribute注解在方法前,在所有mapping前执行
* 可以实现统一配置
*/
//绑定参数到对象属性
@ModelAttribute
public User create(User newUser) {
return newUser;
} //获取名字
@RequestMapping("user/getname")
@ResponseBody()
public String getName(User newUser) {
return newUser.getName();
} //获取年龄
@RequestMapping("user/getage")
@ResponseBody()
public Integer getAge(User newUser) {
return newUser.getAge();
} }

  

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

  

 package com.example.demo.controller;

 import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.servlet.mvc.support.RedirectAttributes; @Controller
public class ModelConclusion2 { /*
* redirectAttribute.addAttribute功能时字符串拼接,类似于model.addAttribute,但是它并不把数据添加到model里
* redirectAttribute.addFlashAttribute时安全的传递参数方法,原理是将数据添加到session里,等页面渲染好后从session里移除,最后加入到model模型里
*/ @RequestMapping("user2")
public String setAttribute(Model model,RedirectAttributes redirectAttribute) { redirectAttribute.addAttribute("name","Jack");
redirectAttribute.addFlashAttribute("age",15);
System.out.println(model); return "redirect:user2/1";
} @RequestMapping("user2/1")
@ResponseBody()
public String getAttribute(String name,Integer age,Model model) { System.out.println(age);
System.out.println(name);
System.out.println(model); return "hello";
} }

  控制台结果:

  

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

  

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

  

  

SpringMVC归纳-1(model数据模型与重定向传参技术)的更多相关文章

  1. spring mvc controller间跳转 重定向 传参(转)

    spring mvc controller间跳转 重定向 传参 url:http://zghbwjl.blog.163.com/blog/static/12033667220137795252845/ ...

  2. jsp内部传参与重定向传参

    1 重定向地址栏会发生改变,因为它会发送两次请求,内部转发,地址栏不会发生改变,因为它只有一个请求2 重定向不能获取上一次请求中的参数,而内部转换可以3 内部转发可以访问WEB-INF下的资源,重定向 ...

  3. SpringMVC中使用RedirectAttributes重定向传参,防止暴露参数

    RedirectAttributes是SpringMVC3.1版本之后出来的一个功能,专门用于重定向之后还能带参数跳转的. 当我从jsp页面函数中带参数到controller层方法,方法执行完毕后返回 ...

  4. spring mvc controller间跳转 重定向 传参 (转)

    转自:http://zghbwjl.blog.163.com/blog/static/12033667220137795252845/ 1. 需求背景     需求:spring MVC框架contr ...

  5. Spring Mvc Controller间跳转 重定向 传参 (转)

    原文链接:http://zghbwjl.blog.163.com/blog/static/12033667220137795252845/ 1. 需求背景     需求:spring MVC框架con ...

  6. SpringMVC之接收请求参数和页面传参

    1.Spring接收请求参数 1>.使用HttpServletRequest获取 @RequestMapping("/login.do") public String log ...

  7. ModelAttribute注解使用与spring重定向传参

    @ModelAttribute可以用于修饰controller里的方法和参数,将被修饰的对象的值绑定到指定名称的属性里.当修饰方法时,方法返回的值会在该controller里每个访问处理前绑定一次.修 ...

  8. spring mvc controller间跳转 重定向 传参

    http://blog.csdn.net/jackpk/article/details/19121777/

  9. spring mvc 重定向传参

    参考链接如下: http://bbs.csdn.net/topics/391034118?page=1 自己的示例程序: 详细页面提交一个修改动作,修改完成后跳转到检索页面,把检索条件重新赋值给检索页 ...

随机推荐

  1. asp.net mvc 三层加EF两表联查

    首先打开vs软件新建项目创建web中的mvc项目再右击解决方案创建类库项目分别创建DAL层和BLL层再把DAL层和BLL层的类重命名在mvc项目中的Models文件夹创建model类在DAL创建ADO ...

  2. Java的内存泄露

    Java的内存泄露 1.静态集合类引起内存泄漏 像HashMap.Vector等的使用最容易出现内存泄露,这些静态变量的生命周期和应用程序一致,他们所引用的所有的对象Object也不能被释放,因为他们 ...

  3. 全球排名第一的开源ERP Odoo v12 最新一键安装体验版正式发布

    引言 Odoo 12.0是目前全球Odoo社区最新推出的产品版本代号,该产品具有划时代的意义,增加了如互联网级的知识库网盘功能.工业互联网的IOT设备矩阵管控功能,全新的Python Sass前端引擎 ...

  4. UML第二次作业

    一.plant UML语法学习小结 1.类之间的关系 使用.. 来代替 -- 可以得到点 线. 在这些规则下,也可以绘制下列图形 @startumlClass01 <|-- Class02 Cl ...

  5. winfrom 图片等比例压缩

    效果图: 核心代码: /// <summary> /// 等比例缩放图片 /// </summary> /// <param name="bitmap" ...

  6. mysql关联表更改表多个字段值

    关联表更改某一个字段值:更改部分数据,外层where条件控制更改记录的数量 BEGIN; " ; "; ROLLBACK; -- COMMIT; 关联表更改某一个字段值:更改全部记 ...

  7. 使用 connect http proxy 绕过 ssh 防火墙限制

    1.安装 connect brew install connect 2.配置 ~/.ssh/config Host * ProxyCommand connect -H your.proxy.serve ...

  8. Java 开发常用工具

    编译器 IDEA (个人觉得IDEA比较好用) Eclipse MyEclipse IDEA插件 Lombok: 使用注解,免去实体类中get /set/构造器等代码 ,需要引入lombok包 Ali ...

  9. dubbo 序列化机制之 hessian2序列化实现原理分析

    对于远程通信,往往都会涉及到数据持久化传输问题.往大了说,就是,从A发出的信息,怎样能被B接收到相同信息内容!小点说就是,编码与解码问题! 而在dubbo或者说是java的远程通信中,编解码则往往伴随 ...

  10. 【Linux篇】--sed的用法

    一.前述 Sed是一种流编辑器,它是文本处理中非常中的工具,能够完美的配合正则表达式使用,功能不同凡响.处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space),接着用 ...