30-SpringMVC-2

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就是坑中之坑,会浪费大量的时间,所以,一定要知道一定要清楚的了解,自己应该学什么,学以致用,不能抱有"贪婪"的心态,想把眼见的所有东西都学,东西是学不完的,学一些不好的坑爹的东西,还不如甩开手玩!

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值