数据回显

  1. pojo 数据回显的支持 ,springMvc 会默认的将传进来的 pojo 保存到 request 域里面,keypojo 类的名字首字母小写,简短类名而非全限定名;
  2. 也可以使用 model 将传进来的 pojo ,传到页面
  3. 使用注解,指定传到页面的参数的名字,@ModelAttribute

不过需要注意的是,不要使用重定向,使用转发。否则将是新的请求的 request,导致数据回显失败;


@ModelAttribute && @SessionAttributes 注解

这两个注解的知识,转载于 https://blog.csdn.net/xiejx618/article/details/43638537

先看一个没有使用 @ModelAttributeController 方法.

    @RequestMapping("/save")
public String save(User user) {
user.setUsername("U love me");
userService.save(user);
return "result";
}

其中 User 包含 idusername 两个私有属性,含有公共 settergetter 方法.

执行此方法时会将 key 为 “user” (注意:这里即使参数名称是 user1 ,key 一样还是 "user" ),valueuser 的对象加入到 model. 在 jsp 页面可以通过 ${user.id}${user.name} 得到值的,即上面方法和下面方法是相当的.

@RequestMapping("/save")
public String save(Model model,int id,String username) {
User user=new User();
//这里是通过反射从request里面拿值再set到user
user.setId(id);
user.setUsername(username);
model.addAttribute("user",user); user.setUsername("U love me");
userService.save(user);
return "result";
}

一.下面再来看看 @ModelAttribute 的基本用法.

  1. 在方法上使用 @ModelAttribute

    @ModelAttribute("user1")
    public User addUser(User user) {
    return new User(520,"I love U");
    }

    假设此方法是写在 UserController 内,那么执行 UserController 内带有 @RequestMapping 的方法之前,都会先执行此 addUser 方法.并且执行 addUser 过程中会添加两个对象到 model,先将 key"user" 的对象(由 addUser 方法的 User user 引起的),再添加key为 "user1" 的对象(由注解 @ModelAttribute("user1") 引起的).

  2. 在方法参数上使用 @ModelAttribute

    @RequestMapping("/save")
    public String save(@ModelAttribute User user) {
    user.setUsername("U love me");
    userService.save(user);
    return "result";
    }

    此方法会先从 model 去获取 key"user" 的对象,如果获取不到会通过反射实例化一个User 对象,再从 request 里面拿值 set 到这个对象,然后把这个 User 对象添加到model (其中 key"user" ).

    使用了 @ModelAttribute 可修改这个 key ,不一定是 "user" ,此情况下,用与不用@ModelAttribute 没有区别.

  3. 再来看看在方法和方法参数上结合使用 @ModelAttribute

    即上面两步的两个方法都添加 UserController ,如下:

    @ModelAttribute("user1")
    public User addUser(User user) {
    return new User(520,"I love U");
    }
    @RequestMapping("/save")
    public String save(@ModelAttribute User user) {
    user.setUsername("U love me");
    userService.save(user);
    return "result";
    }

    假设要执行保存用户操作,根据一分析可知,先执行完会产生两个 User 类型的对象(一个 key"user" ,另一个 key"user1" )添加到 model ,再执行 save 方法,此时会先从 model 去找 key"user" 的对象,能找到再从 request 取值 set 到这个 User 对象.最后返回到 jsp 页面, model 里也只有两个 User 类型对象.

    再来个小小假设,将上面 @ModelAttribute("user1")user1 改为 user ,其它不变.虽然执行了 addUser 方法,那么执行到 save 方法内, user 对象的字段值还是来源于请求,最后返回到 jsp 页面,model 里也只有一个 User 类型对象.

  4. 另类:

    @ModelAttribute
    @RequestMapping("/save")
    public String save(@ModelAttribute User user) {
    user.setUsername("U love me");
    userService.save(user);
    return "result";
    }

    此种情况,会添加一个 key"user"User 对象到 model ,还会添加一个 key"string" , value"result" 的对象到 model,而视图名称则变为了 "save" 而不是 "result" .相信一般开发者都不会这样用.

二.下面再看看结合 @SessionAttributes 的用法.

  1. 先看看这段代码

    @Controller
    @RequestMapping("user")
    @SessionAttributes("test")
    public class UserController {
    @RequestMapping(value = "test1")
    public String test1(Map<String, Object> model, SessionStatus sessionStatus) {
    model.put("test","something");
    //sessionStatus.setComplete();
    return "user/list";
    } @RequestMapping(value = "test2")
    public String test2(Map<String,?> model) {
    Object test = model.get("test");
    System.out.println(test);
    return "user/list";
    }
    }

    在类级别上使用 @SessionAttributes("test"),它的作用是在 controller 共享 model 属性博主备注下:注意是共享属性哦,而非共享整个 model ,共享具体的哪一个属性,根据@SessionAttributes("")的值),直到调用 org.springframework.web.bind.support.SessionStatus#setComplete 会清除此 session 值.否则长期保留(session过期,这个值也不再保留).因此先调用/user/test1,再调用/user/test2.在test2方法能得到test1方法put进去的值.当移除上面的注解,因为属性为testsession也被清除了,所以test2方法会得到是null.

  2. 再看结合 @ModelAttribute 的用法.

    @Controller
    @RequestMapping("user")
    @SessionAttributes("test")
    public class UserController {
    @RequestMapping(value = "test1")
    public String test1(HttpServletRequest request) {
    User user = new User("xiejx618");
    request.getSession().setAttribute("test",user);
    return "user/list";
    }
    @RequestMapping(value = "test2")
    public String test2(@ModelAttribute("test") User user,SessionStatus sessionStatus) {
    System.out.println(user.getUsername());
    sessionStatus.setComplete();
    return "user/list";
    }
    }

    一样先调用/user/test1,再调用/user/test2.在test2方法能得到test1方法set进去的值.使用了@SessionAttributes,如果在controller的方法参数上有@ModelAttribute,那么此方法会确保属性testsession会存在,否则会抛org.springframework.web.HttpSessionRequiredException异常,即上面代码先不调/user/test1,直接调/user/test2就会抛此异常

    我个人很少这样用,用原始的写法就清晰很多了,但要看明白别人写的代码。


    作者:xiejx618

    来源:CSDN

    原文:https://blog.csdn.net/xiejx618/article/details/43638537

    版权声明:本文为博主原创文章,转载请附上博文链接!

(十六)springMvc 补充的更多相关文章

  1. Spring+SpringMVC+MyBatis深入学习及搭建(十六)——SpringMVC注解开发(高级篇)

    转载请注明出处:http://www.cnblogs.com/Joanna-Yan/p/7085268.html 前面讲到:Spring+SpringMVC+MyBatis深入学习及搭建(十五)——S ...

  2. Java开发学习(二十六)----SpringMVC返回响应结果

    SpringMVC接收到请求和数据后,进行了一些处理,当然这个处理可以是转发给Service,Service层再调用Dao层完成的,不管怎样,处理完以后,都需要将结果告知给用户. 比如:根据用户ID查 ...

  3. {Django基础十之Form和ModelForm组件}一 Form介绍 二 Form常用字段和插件 三 From所有内置字段 四 字段校验 五 Hook钩子方法 六 进阶补充 七 ModelForm

    Django基础十之Form和ModelForm组件 本节目录 一 Form介绍 二 Form常用字段和插件 三 From所有内置字段 四 字段校验 五 Hook钩子方法 六 进阶补充 七 Model ...

  4. Android系统--输入系统(十六)APP跟输入系统建立联系_InputChannel和Connection

    Android系统--输入系统(十六)APP跟输入系统建立联系_InputChannel和Connection 0. 核心:socketpair机制 1. 回顾Dispatch处理过程: 1.1 放入 ...

  5. OSGi 系列(十六)之 JDBC Service

    OSGi 系列(十六)之 JDBC Service compendium 规范提供了 org.osgi.service.jdbc.DataSourceFactory 服务 1. 快速入门 1.1 环境 ...

  6. ASP.NET MVC深入浅出系列(持续更新) ORM系列之Entity FrameWork详解(持续更新) 第十六节:语法总结(3)(C#6.0和C#7.0新语法) 第三节:深度剖析各类数据结构(Array、List、Queue、Stack)及线程安全问题和yeild关键字 各种通讯连接方式 设计模式篇 第十二节: 总结Quartz.Net几种部署模式(IIS、Exe、服务部署【借

    ASP.NET MVC深入浅出系列(持续更新)   一. ASP.NET体系 从事.Net开发以来,最先接触的Web开发框架是Asp.Net WebForm,该框架高度封装,为了隐藏Http的无状态模 ...

  7. python自动华 (十六)

    Python自动化 [第十六篇]:JavaScript作用域和Dom收尾 本节内容: javascript作用域 DOM收尾 JavaScript作用域 JavaScript的作用域一直以来是前端开发 ...

  8. Python 爬虫十六式 - 第七式:正则的艺术

    RE:用匹配来演绎编程的艺术 学习一时爽,一直学习一直爽   Hello,大家好,我是 Connor,一个从无到有的技术小白.上一次我们说到了 pyquery 今天我们将迎来我们数据匹配部分的最后一位 ...

  9. 我的MYSQL学习心得(十六) 优化

    我的MYSQL学习心得(十六) 优化 我的MYSQL学习心得(一) 简单语法 我的MYSQL学习心得(二) 数据类型宽度 我的MYSQL学习心得(三) 查看字段长度 我的MYSQL学习心得(四) 数据 ...

  10. Bootstrap <基础二十六>进度条

    Bootstrap 进度条.在本教程中,你将看到如何使用 Bootstrap 创建加载.重定向或动作状态的进度条. Bootstrap 进度条使用 CSS3 过渡和动画来获得该效果.Internet ...

随机推荐

  1. 高效率编辑器 Vim——操作篇,非常适合 Vim 新手

    原文地址:https://linuxtoy.org/archives/efficient-editing-with-vim.html vim教程:http://vimcasts.org/ https: ...

  2. Spring中集成Ehcache缓存

    1.导入依赖包 <dependency> <groupId>org.springframework</groupId> <artifactId>spri ...

  3. 基础学习笔记之opencv(3):haartraining生成.xml文件过程[转]

    1.准备正负样本: 在上一讲http://www.cnblogs.com/tornadomeet/archive/2012/03/27/2420088.html 中,我们已经收集到了训练所用的正样本. ...

  4. 使用idea创建第一个springboot项目

    版权声明:版权归作者所有,转载请注明出处. https://blog.csdn.net/qq_34205356/article/details/81098354 前言:如今springboot越来越火 ...

  5. 固定权重 关于Mxnet的一些基础知识理解(1)

    https://blog.csdn.net/pandav5/article/details/53993684 (1)Mxnet的数据格式为NDArray,当需要读取可观看的数据,就要调用: numpy ...

  6. linux内核的0号进程是在哪里创建的?

    1. 0号进程即为idle进程或swapper进程,也就是空闲进程 2. 0号进程特点 idle是一个进程,其pid为0. 主处理器上的idle由原始进程(pid=0)演变而来.从处理器上的idle由 ...

  7. 使用TFA启动需要知道哪些概念?

    1. Boot stage BL1,BL2,BL31,BL32,BL33 2. Exception level EL3, EL1S, EL2 3. 那么放在表格里比较一下咯 Boot stage Ex ...

  8. Docs-.NET-C#-指南-语言参考-预处理器指令:#pragma warning(C# 参考)

    ylbtech-Docs-.NET-C#-指南-语言参考-预处理器指令:#pragma warning(C# 参考) 1.返回顶部 1. #pragma warning(C# 参考) 2015/07/ ...

  9. 为什么static成员必须在类外初始化,而不能在类的头文件中初始化

    为什么static成员必须在类外初始化 为什么静态成员不能在类内初始化 在C++中,类的静态成员(static member)必须在类内声明,在类外初始化,像下面这样.   class A { pri ...

  10. Flink 在IDEA执行时的webui

    不过Flink IDEA中执行的webui 需要 flink-runtime-web 包的支持 pom 如下: <dependency> <groupId>org.apache ...