两者的结合原理
底层源码分析
栈原理 先进后出
我们的valuestack其实是一个接口
在实现类中有这个参数
CompoundRoot的类继承的是ArrayList,具体实现弹栈和压栈的方法具体实现原理
在OgnlValueStack实现类中分别有弹栈和压栈的方法
查看值栈中两部分的内容 (Root部分和context) 使用DEBUG标签
页面需要倒入标签库
输入地址栏回车出现一个Deug的链接,点击即可
Root部分
默认情况下,栈中放置当前访问的Action对象
Context部分
Context部分就是ActionContext数据中心
struts2与ognl结合体现
地址栏
控制台显示null值
问题分析
由拦截器交给ognl,先走完20个拦截器在到ognl,在Action中才压栈
到底层分析
默认走的拦截器
要在这之前完成赋值
准备工作在这个拦截器的时候完成实现
在struts-default.xml 中找到这个注册拦截器的类 进去查看PrepareInterceptor类
将action类强转为Preparable接口 执行parpare方法
so在我们的Demo2Action中修改代码
在控制台能打印出来我们能的用户名了
上面是我们的第一种解决方案,下面是我们的第二种实现方案(人性化的操作)
实现模型驱动接口,获得参数属性
同样的我们继续来源码分析ModelDriven 的实现思路 这些事默认的栈需要走的拦截器
找到了具体的实现类
分析实现的方法
ValueStack stack = invocation.getStack(); 值栈ValueStack也是通过invocation来获取的,在调用push方法把对象压入栈顶