Strut2流程分析-----从请求到Action方法()
首先请求会调用strutsPrepareAndExcuteFliter----(这个就是我们在web.xml文件中所配置的那个拦截器吧,所有Action请求都要过这个拦截器)的doFilter()方法
然后会调用StrutsActionProxy类的excute()方法,生成一个代理类(ActionProxy)
ActionProxy 是 Action 的一个代理类,也就是说Action的调用是通过 ActionProxy 实现的,就是我们定义的Action不能直接去访问各种拦截器栈吧,那我们得找一个代理代替我们干这活吖
而该方法又调用了ActionInvocation.invoke()方法
然后调用DefaultActionInvocation的invoke()//通过不断的回调这个方法,调用了所有拦截器,直到调用完
ActionInvocation就是Action的调用者。
ActionInvocation在Action的执行过程中,负责Interceptor、Action和Result等一系列元素的调度。
*/
public String invoke() throws Exception {
String profileKey = "invoke: ";
try {
UtilTimerStack.push(profileKey);

if (executed) {
throw new IllegalStateException("Action has already executed");
}

if (interceptors.hasNext()) {//拦截器集合,不断的回调,
final InterceptorMapping interceptor = interceptors.next();
String interceptorMsg = "interceptor: " + interceptor.getName();
UtilTimerStack.push(interceptorMsg);
try {
resultCode = interceptor.getInterceptor().intercept(DefaultActionInvocation.this);
}
finally {
UtilTimerStack.pop(interceptorMsg);//拦截器回调完后,最终通过这个方法来调用Action类方法
}
} else {
resultCode = invokeActionOnly();
}
1Action请求流程:
每次发生一个Action请求时,并不是把立刻跳到相应的Action中,而是先生成一个Action实例,
把Action实例的属性都放入值栈中的栈顶,此时放入值栈的Action对象的属性还是没有赋值的,
再继续生成Actionproxy(代理)实例,由ActionProxy调用所有的拦截器,直到调用接 Parameters 拦截器将把表单字段映射到 ValueStack 栈的栈顶对象的各个属性中.
然后当执行到Action相对应的方法,为Action类的各个属性赋值
2Action类的对象在controller中实例化,并且利用OGNL方式进行自动赋值
1)声明需要用到的Action类对象
2)实现ModelDriver接口,实现getModel方法,并在getModel方法里实例化Action类对象,并返回实例化的对象(ps:不能直接的返回new Action()对象)

最新文章

  1. 让hammer完美支持Pixi.js - 2D webG库
  2. Nginx系列4之基础配置
  3. IPC-----POSIX消息队列
  4. DT时代即将到来
  5. 专题:『Channel Bonding/team』——EXPERIMANTAL!!!
  6. WdatePicker.js的使用方法
  7. mfc控件学习
  8. 直接查数据导出xls
  9. Css基础-派生选择器
  10. Android软件的国际化
  11. 去除input[type=number]最右边的spinners(默认加减符号)
  12. postgres-xl 集体搭建(1)
  13. DataGuard实战1
  14. Python——正则表达式
  15. Mysql之触发器的操作:
  16. storm入门基础实例(无可靠性保证实例)
  17. CodeForces755F 贪心 + 多重背包二进制优化
  18. 006_netstat中state详解
  19. P499 usebrass2
  20. docker(三)容器的基本操作

热门文章

  1. 错了:用流量能够放肆,有wifi则要节制
  2. 大数据学习之Scala中main函数的分析以及基本规则(2)
  3. delphi无边框可拖动窗体
  4. 算法5-6:Kd树
  5. Android 资源保护问题——探索
  6. Makefile 8——使用依赖关系文件
  7. [I2C]pca9555应用层测试代码
  8. 在后台运行Python脚本服务
  9. 在项目中使用JMail发送邮件
  10. 测试网站访问速度的方法(GTmetrix)