文档章节

SpringMVC (5) -- Helloworld

测试-雨
 测试-雨
发布于 2016/08/22 15:44
字数 916
阅读 79
收藏 2
    /**☆☆☆☆☆常用
     * 1.由 @ModelAttribute 标记的方法,会在每个目标方法被调用之前被 SpringMvc 调用
     *
     * 2.@ModelAttribute 注解也可以来修饰目标方法 POJO 类型的入参,其 value 属性值有如下作用:
     *   1)SpringMVC 会使用 value 属性值在 implicitModel 中查找对应的对象,若不存在则会直接传入到目标方法的入参中。
     *   2)SpringMVC 会一 value 为 key, POJO 类型的对象为 value ,存入到 request 中。
     * @param id
     * @param map
     */
    @ModelAttribute
    public void getUser(@RequestParam(value = "id", required = false) Integer id, Map<String, Object> map) {
        if (id != null) {
            //模拟从数据库中获取对象
            User user = new User(1, "Dog", "123456", "tom@dog.com", 18);
            System.out.println("user:" + user);
            map.put("user", user);
        }

    }

    /**
     * 运行流程:
     * 1.执行 @ModelAttribute 注释修饰的方法:从数据库中取出对象,把对象放入到 Map 中,键为 user
     * 2.SpringMVC 从 Map 中取出 User 对象,并把表单的请求参数赋给该 User 对象的对应属性
     * 3.SpringMVC 把上述对象传入目标方法的参数。
     *
     * 注意:在 @ModelAttribute 修饰的方法中 ,放入到 Map 时的键需要和目标方法放入参数类型的第一个字母小写的字符串一致。
     *
     * SpringMVC 确定目标方法 POJO 类型入参的过程
     * 1.确定一个 key:
     *   1)若目标方法的 pojo 类型的参数 没有使用 @ModelAttribute 作为修饰,则 key 为 POJO 类名第一个字母的小写
     *   2)若使用@ModelAttribute 来修饰,则 key 为 @ModelAttribute 注解的 value 属性值。
     *
     * 2.在 implicitModel 中查找 key 对应的对象,若存在,则作为入参传入
     *   1)若在 @ModelAttribute 标记的方法中在 Map 中保存过,且 key 和 1 确定的 key 一致,则会获取到。
     *
     * 3.若 implicitModel 中不存在 key 对应的对象, 则检查当前的 Handler 是否使用 @SessionAttributes 注释修饰,若使用了该注
     * 解,且 @SessionAttribute 注解的 value 属性值中包含了 key,则会从 HttpSession 中来获取 key 所对应的 value 值,若存在则
     * 直接传入到目标方法的入参中,若不存在则将抛出异常。
     * 4.若 Handler 没有标识 @SessionAttributes 注解,或 @SessionAttributes 注解的 value 值中不包含 key, 则会通过反射来创建
     * POJO类型的参数,传入为目标方法参数。
     * 5.SpringMVC 会把 key 和 POJO 类型的对象保存到 implicitModel 中,近而会保存到 request 中。
     *
     * 源代码分析的流程
     * 1.调用 @ModelAttribute 注解修饰的方法。 实际上把 @ModelAttribute 方法中 Map 种的数据放在了 implicitModel 中。
     * 2.解析请求处理器的目标参数,实际上该目标参数来自于 WebDataBinder 对象的 target 属性
     *   1).创建 WebDataBinder 对象:
     *      ①.确定 objectName 属性:若传入的 attrName 属性值为"",则 objectName 为类名第一个字母小写。
     *      *注意:attrName. 若目标方法的 POJO 属性使用了 @ModelAttribute 来修饰,则 attrName 值即为 @ModelAttribute 的 value 属性值
     *      ②.确定 target 属性:
     *         >在 implicitModel 中查找 attrName 的属性值。若存在,ok
     *         >*若不存在:则验证当前 Handler 是否使用了 @SessionAttributes 进行修饰,若使用了,则尝试从 Session 中获取 attrName 所对应的属性值。
     *         若 Session 中没有对应的属性值,则抛出了异常。
     *         >若 Handler 没有使用 @SessionAttributes 进行修饰,或 @SessionAttributes 中没有使用 value 值指定的 key 和 attrName 相匹配,则通过反射创建了POJO对象
     *
     *   2)SpringMVC 把请求表单的请求参数赋给了 WebDataBinder 的 target 对应的属性
     *
     *   3)*SpringMVC 会把 WebDataBinder 的 attrName 和 target 给到 implicitModel 近而传到 request 域对象中。
     *
     *   4)把 WebDataBinder 的 target 作为参数传递给目标方法的入参。
     *
     * @param user
     * @return
     */
    @RequestMapping("testModelAttribute")
    public String testModelAttribute(User user) {
        System.out.println("修改:" + user);

        return SUCCESS;
    }

 

本文转载自:笔记

测试-雨
粉丝 10
博文 81
码字总数 19747
作品 0
杨浦
QA/测试工程师
私信 提问
加载中

评论(3)

测试-雨
测试-雨 博主

引用来自“秋水潺流”的评论

你现在学的这个是什么来的
没有方向,所以多看看, 你有什么好的建议?
测试-雨
测试-雨 博主

引用来自“秋水潺流”的评论

你现在学的这个是什么来的
什么意思?
秋水潺流
秋水潺流
你现在学的这个是什么来的
BeanFactory和ApplicationContext的区别

Spring Bean 先从SpringBean说起,Spring Beans是被Spring容器管理的Java对象,比如: 我们一般通过Application.xml配置Spring Bean元数据。 Spring Bean被Spring容器管理之后,可以在程序中...

春哥大魔王的博客
07/02
43
0
【第2章 Spring快速入门】2.2 WEB应用之HelloWorld

上一节:【第2章 Spring快速入门】2.1 Java应用之HelloWorld 本章节主要介绍在WEB开发过程中,Spring是怎么使用的?上一节中我们已经讲到在普通的Java Project中如何使用Spring容器了,那么在...

陶邦仁
2015/07/07
685
0
Eclipse搭建Spring开发环境

这篇文章简单介绍下如何利用Eclipse搭建Spring开发环境。 一、软件准备 1. Eclipse, 下载地址:http://www.eclipse.org,可下载3.6版本 2. SpringIde, 有两种安装方法,官网:http://www.spri...

小梅菜鸟
2012/04/26
1K
0
SpringBoot系列三:SpringBoot自定义Starter

原文出处:晴枫 在前面两章 SpringBoot入门 、SpringBoot自动配置原理 的学习后,我们对如何创建一个 SpringBoot 项目、SpringBoot 的运行原理以及自动配置等都有了一定的了解。如果我们系统...

晴枫
2018/11/21
0
0
Spring mvc试用小结--HelloWorld

1.创建Java Web项目,然后下载spring的jar包放到lib下 2.修改web.xml,和配置struts2差不多 <?xml version="1.0" encoding="UTF-8"?><web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema......

王二铁
2012/03/06
1K
0

没有更多内容

加载失败,请刷新页面

加载更多

链表中环的入口节点

给一个链表,若其中包含环,请找出该链表的环的入口结点,否则,输出null。 思路: public ListNode EntryNodeOfLoop(ListNode pHead) { if (pHead == null || pHead.next == null) ...

Garphy
6分钟前
2
0
Spring5 源码分析-容器刷新-invokeBeanFactoryPostProcessors()方法

上一篇:Spring5 源码分析-容器刷新-prepareBeanFactory()方法 该方法主要完成以下功能: 1.实例化ConfigurationClassPostProcessor,并调用ConfigurationClassPostProcessor.postProcessBe...

特拉仔
6分钟前
3
0
为什么MySQL用B+树做索引

索引这个词,相信大多数人已经相当熟悉了,很多人都知道MySQL的索引主要以B+树为主,但是要问到为什么用B+树,恐怕很少有人能把前因后果讲述的很完整。本文就来从头到尾介绍下数据库的索引。...

小致Daddy
31分钟前
4
0
网站前台的三级联动数据封装

我在进行项目时候遇到了一个进行数据封装的一个功能,进行数据的封装的功能也挺复杂,来回试了好几十种方法.最后使用的是这种方法. 使用一个pojo进行封装两个数据,一个是list一个是实体类. 具体...

小天丶羽
34分钟前
4
0
创龙基于TI AM437x ARM Cortex-A9 + Xilinx Spartan-6 FPGA的SPI FLASH、硬件加密芯片

TL437xF-EVM是一款广州创龙基于TI AM437x ARM Cortex-A9 + Xilinx Spartan-6 FPGA设计的开发板,底板采用沉金无铅工艺的4层板设计,尺寸为240mm*130mm,它为用户提供了SOM-TL437xF核心板的测...

Tronlong创龙
36分钟前
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部