1.丑话说在前面,强忍着看完了springMVC,如果你看到这个blog请你不要再看任何关于JSP的内容,在前后端分离的今天,JSP毫无意义,毫无用处,只不过为了完善整个spring方案而已,强加的一环没必要的技术.
2.@RequestHeader
之前可以拿url里面的值,同样这个注解可以拿请求头里面的值
cookievalue自然也就是可以拿cookie里面的值了
3.POJO
POJO跟javaBean的区别,POJO就是完全没有实现接口的一组数据;而javabean会实现接口,而且可以序列化
这里举例:
1.支持级联属性,就表示这个POJO的全局变量,可以是一个 引用类的对象,相当于二级子分类
2.在h5的表单里面,也可以通过"."的方式,写级联
等于说这里.直接把一个POJO作为参数了,只要h5端参数名跟POJO保持一致就可以了
SringMVC会按照请求参数名和POJO属性名进行自动匹配
自动为该对象填充属性值,并且支持级联属性, 暂时不知道有啥用
4.使用servlet原生Api
可以使用servlet的原生api作为目标方法的参数,具体有以下类型
1.HttpServletRequest
2.HttpServletResponse
3.locale
4.reader
5.writer
6.Java.security.principal
7.InputStream
8.OutputStream
9.HttpSession
5.输出模型数据的几个方法:
1.ModelAndView:处理方法返回值类型为ModelAndView时,方法体即可通过该对象添加模型数据
2.Map及Model:
3.SessionAttirbutes:把模型中的某个属性值存到HttpSession中,
4.ModelAttributes
6.详细讲一下
1.ModelAndView
通过这个对象,往里面加键值对的objs
2.Map
这里也是往Map对象里面传参数,或者是Model对象或者是ModelMap对象
3.SessionAttributes
如果希望在多个请求之间,也就是跨不同的reqeust域,之间共用某个模型属性数据,则可以在控制器类上标注一个@SessionAttributes
这里的值,只在requestScope里面才有,如果想让他在session域里面也有的话,需要再整个类上面加一个@SessionAttributes( "user")注解
这样的话,在2个域都可以访问到了,这里@SesionAttiributes里面既可以放value,也可以放type,特别注意,整个注解只能放在类上面,而不能放在方法上面
4.ModelAttributes
在表单的时候,通过隐藏域写了id
标记有@ModelAttributes的方法,会在spring调用与前端一致名的调用方法之前调用.在所有的与前端名一致的方法,被调用之前调用
具体运行过程:
1.执行@ModelAttributes修饰的方法,把对象放在了Map中
2.springMVC帮我们取出user对象,再把表单里面的请求参数,赋个这个map里面的对象的对应属性,这里的map的key值一定要是跟目标方法的入参类小写的字符串一致
3.最后把参数传给目标方法的参数
源码分析流程:
1.首先调用使用@ModelAttributes注解修饰的方法,实际上把Map中的数据放在了implicitModel中
2.解析请求处理器的目标参数,实际上该目标参数来自于WebDataBinder对象的target属性
1).创建WebDataBinder对象:
确定ObjectName属性:
若传入的attrName属性值为"",则ObjectName为类名首字母小写
若目标方法的POJO属性用了@Attribute来修饰,则attrName的值,即为@ModelAttribute的value属性值
确定target属性
在implicitModel中查找attrName对应的属性值,如果不存在,则验证当前handler是否使用了@SessionAttributes进行修饰,若使用了,则尝试从Session中获取
AttrName,如果session中获取不到对相应的属性值,则抛出异常;如果handler没有使用sessionAttributes进行修饰或者sessionAttributes中没有使用 value值指定的健好attrName匹配,则通过反射创建POJO
3.SpringMVC把表单的请求参数赋值给了WebDataBinder的target对应的属性
4.SrpingMVC会把WebDataBinder的attrName和target给到implicitModel
5.把WebDataBinder的target当做一个参数传递给目标方法的入参,如果使用了@ModelAttributes的value写了值,那么那个attrName就不为类名的首字母小写值
用自己的话来说一遍,就是@ModelAttribute修饰的方法,当往里面赋值了一个POJO,其实是新创建了一个对象,WebDataBinder,往里面传了一组数据,key=attrName,value=POJO,然后表单也会发送过来几个数据,通过WebDataBinder把这些数据写到之前从数据库拿到WebDataBinder的POJO,最后再匹配给对应的目标方法,这个就是完整的实现流程.
7.域对象
根据有作用范围由小到大:
page(jsp有效)------》page域指的是pageContext.
request(一次请求)---》request域request HttpServletContext
session(一次会话)---》session域session HttpSession
application(当前web应用)---》application域指的是application ServletContext;
这里有一个四大域的ref,之后再看吧...https://www.cnblogs.com/ssjifm/p/7402579.html
8.SpringMVC确定目标方法POJO入参的过程:
1.确定一个key
2.在implicitModel中查找key对应的对象,若存在,则作为入参传入
3.若implicitModer中不存在key对应的对象,则检查当前的handler是否使用了sessionAttributes注解修饰,若使用了该注解,且这个注解的value属性值中包含了key,则会从httpSession中获取key所对应的value值,若存在,则直接存在目标方法的入参中,若不存在,则抛出异常
4.若handler没有标识@sessionAttributes注解或@sessionAttirbutes注解的value值中不包含key,则会通过反射来创建POJO
5.SpringMVC会把key和POJO保存到 implicitModel中,进而会保存到request中
这里的spring底层...真心先不用了解,先把整个框架用会了,实际去做项目了,回过头来再看,这些教人的,实在搞不懂怎么教的
9.springMVC视图解析器
这里的视图解析器,就是把数据变成物理视图
这里又写了一个i18.properties,什么国际视图...
这里搞的JSTL,居然...还是用的jsp技术写在前端里面的,这里就是用的fmt标签,jstl的view...所有jsp相关的,一律不看,一律跳过
10.重定向
如果返回的字符串带forward:或redirect前缀的,SpringMVC会对其进行特殊处理
把forward: 和 redirect: 当做指示符
11.Spring整合SpringMVC
datasource,tx,整合其他框架,全部都是放在spring里面而非springmvc
也可以把这些东西,写成很多其他的配置文件,然后用import导入到springMVC的配置文件里
如果spring和springmvc扫描的包有重合的,那么有的类就会创建两次,解决办法,springmvc的容器和spring的容器扫描不同的包
在实际开发中,很多包都是按照模块来规划的,所以这种做饭其实不好实现.
除了上面2个方法,有一个比较好用的,就是用2个子节点excluder-filter和include-filter这两个子节点来规定只能扫描的注解.use-defalut-filter="false"
12spring容器和SpringMVC的容器的关系
springMVC的容器可以引用spring的,反过来则不行
相当于是,局部的可以拿整体的变量,而整体的不能拿局部的
总结:SpringMVC草草结束,一个正确的学习顺序,方法是非常重要的,程序世界,坑非常的多,jsp就是坑中之坑,会浪费大量的时间,所以,一定要知道一定要清楚的了解,自己应该学什么,学以致用,不能抱有"贪婪"的心态,想把眼见的所有东西都学,东西是学不完的,学一些不好的坑爹的东西,还不如甩开手玩!