spring笔记

来源:互联网 发布:黑客编程书籍推荐 编辑:程序博客网 时间:2024/05/21 18:13

使用POJO绑定请求参数,springmvc会按请求参数名和POJO属性名进行 匹配,自动为POJO对象属性赋值,支持级联属性这里写图片描述常用于表单提交。

SpringMVC 可以使用以下Servlet原生API作为处理方法的参数:
HttpServletRequest
HttpServletResponse
Principal
Locale
Reader
Writer
处理model数据:
这里写图片描述可以 springmvc会把ModelAndView中的Model对象的键值对放入request域对象中.

SpringMVC使用org.springframework.ui.Model接口作为存储Model对象键值对数据的顶层接口,如图示
这里写图片描述
SpringMVC在调用控制器处理方法前提前创建一个对象作为存储模型对象的容器,当处理方法的形参是map类型,就把改对象的引用传递给map,程序员可以在方法体中遍历或者向容器中添加数据,因为你拥有了容器的引用。
3)@SessionAtrribute
可以通过value属性指定model对象的属性名放入HttpSession中。也可以通过types属性指定模型对象属性类型。

@ModelAtrribute典型应用
被@ModelAttribute注释的方法会在此controller每个方法执行前被执行
这里写图片描述
这里写图片描述
运行流程:
1执行@ModelAttribute注解修饰的方法:从数据库中取出对象,把对象放入map中
2)把表单参数值赋给model对象的相应属性,并覆盖放在map中对象的部分属性
3)把model对象传给处理方法
注意:放在map中的对象的键名字符串要和入参类型的小写字符串一样

SpringMVC是如何找处理方法的pojo对象的?
1)确定一个key
1.1)若处理方法的pojo类型的参数没有使用@ModelAttibute作为修饰,则key为pojo类名的第一个字母的小写
1.2)若使用@ModelAttribute来修饰,则key为@ModelAttribute注解的value属性值
2)在implicitModel中根据key找pojo对象,如果找不到key对应的对象执行下一个流程。(若在@ModelAttribue注解标记的方法中使用map保存过,就可以在implicitModel中找到)
3)检查当前的Handler类是否使用@sessionAttributes注解修饰,若使用了该注解且@SessionAttributes注解的value属性值包含key,则会从HttpSession中来获取key所对应的value,否则抛出异常。如果Handler类没有@SessionAttributes注解则会通过反射来创建pojo类型的参数,传给目标方法。
4)springmvc会把key和对应的pojo对象保存到implicitModel中,进而保存到request域中
使用@ModelAttribute标注的方法会在其他每一个处理方法执行之前调用!
这里写图片描述
说明:无论处理类的方法的返回值是什么,都会被springmvc转换为ModelAndView,然后把该对象交给ViewResolver实现类,也就是说ViewResolver是一个接口,程序员指定具体的解析视图的实现类,这样也实现了解耦。这里的视图是广义的视图,不仅仅是jsp,只要可以渲染模型数据就可以称为视图,比如xml.
这里写图片描述
数据绑定流程:
springmvc将请求消息绑定到处理方法的入参中,数据绑定的核心部件是DataBinder,运行机制如下:
这里写图片描述
由@initBinder标示的方法,可以对WebDataBinder对象进行初始化。WebDataBinder时DataBinder的子类,用于完成由表单字段到javaBean属性的绑定。
1)@InitBinder修饰的方法不能有返回值,必须声明为void
2) @InitBinder修饰的方法的参数通常是WebDataBInder
上代码:

这里写图片描述

springmvc数据校验
前景知识
JSR303是java为bean数据合法性校验提供的标准框架,它已经包含在javaEE6.0中
JSR303通过在bean属性中标注类似@NotNull,@Max等标准的注解指定校验规则,并通过标准的验证接口对bean进行验证
常见注解:
这里写图片描述
spring编写了自己的校验框架并且支持JSR303校验规则,步骤如下:
这里写图片描述
上代码

import javax.validation.Valid;import org.springframework.stereotype.Controller;import org.springframework.validation.BindingResult;import org.springframework.web.bind.annotation.ModelAttribute;import org.springframework.web.bind.annotation.RequestMapping;import entity.User;@Controllerpublic class Test {    @RequestMapping("/test_binding_validate_converter")    public  String test_binding_validate_converter(@Valid @ModelAttribute("user")            User user,BindingResult bindingResult            ){        if(bindingResult.hasErrors())            return "forward:/index.jsp";        else{            System.out.println("验证通过");            return "success";        }    }}

扩展:
HibernateValidator是JSR303的一个参考实现,除支持所有标准的校验注解外,它还支持一下的扩展注解
这里写图片描述
如果没有用到以上注解就可以不用加入hibernate validator的jar包

SpringMVC处理静态资源
如果在web.xml中映射dispatchServlet为 /,那么dispatchServlet会拦截所有的请求,包括请求静态资源,dispatchServlet会把它看成是一般的请求,由于没有找到映射的处理类就会报no map found错误。
解决办法有很多,推荐一种如下:
这里写图片描述
是不是觉得servlet知识储备不足?请自行脑补!

关于

自动注册一些类
还将提供一下支持
支持使用ConversionService实例对表单参数进行类型转换
支持使用@NumberFormat,@DateTimeFormat注解
支持使用@Valid注解对javaBean实例进行JSR303验证
支持使用@RequestBody和@ResponseBody注解

0 0
原创粉丝点击