C:(controller)控制器          M:(model)模型处理    V:(view)视图
Struts 2 的运行过程:
    核心控制器是FilterDispatcher会过滤所有的请求,如果请求以 action结尾,该请求会转入框架处理。当框架获取*action请求后,根据*action的前半部分决定调用哪个业务逻辑组件。最后根据业务逻辑组件的处理信息决定转发到哪个视图;
    Struts2有三部分组成:核心控制器是FilterDispatcher,业务控制器和业务逻辑组件组件,其中核心控制器FilterDispatcher由Struts2提供,而业务逻辑控制器和业务逻辑组件要用户自己实现。
  核心控制器FilterDispatcher:负责拦截所有用户的请求,如果用户的请求以action结尾,该请求就会转入Struts2框架处理。
 业务控制器组件:实现Action类的实例(或者继承了ActionSupport的实例),该类经常能够返回一个字符串(逻辑视图<result>的execute方法,用来实现业务控制)。
 业务逻辑组件:一般由javaBean或者EJB实现;
注意在Struts2中处理用户请求的并不是业务逻辑,而是Action代理:过程是这样的,在Struts2框架中有一系列的拦截器,这些拦截器将HttpServletRequest请求中的参数分析出来,传入Action中,并回调execute()方法来处理用户请求。
所有的请求被拦截器拦截时:执行流程
1,FilterDispatcher会将所有的请求转发给 ActionProxy(Action代理),Action代理会根据配置文件struts.xml决定转发给那个Action;
2,在请求转发给Action的过程中,会经过一系列拦截器,这些拦截器负责将请求解析并转发给相应的Action。
3,经过相应的Action的 execute()方法处理,会得到一个 视图名的结果集,根据结果结合相应的模版产生相应的输出流。
4,输出流也可以经过一些列的拦截器后,传给浏览器。

对于源码根据图的理解:在Struts2的doFilter()方法中,通过execute.executeAction(request, response, mapping)执行进入了Dispatcher,生成了Dispatcher的对象,并调用了serviceAction()方法;接下里调用了create()方法生成ActionProxy的对象proxy ,通过proxy调用了Actioninvaction的的invoke()方法,接下里,Actioninvaction调用interceptor()方法,然后再 继续调用invoke()方法返回,判断是否interceptor()调用完成,直到所有的interceptor()方法调用完成,就执行*Action所对应的execute().
模拟Struts2 实现的全过程代码;
public class Main
{
public static void main(String[] args)
{
new ActionInvaction().invoke();
}
}

public interface Interceptor
{
public void interceptor(ActionInvaction invaction);
}

public class FristInterceptor implements Interceptor
{
public void interceptor(ActionInvaction invaction)
{
System.out.println(1);
invaction.invoke();
System.out.println(-1);
}
}

public class SecondInterceptor implements Interceptor
{
public void interceptor(ActionInvaction invaction)
{
System.out.println(2);
invaction.invoke();
System.out.println(-2);
}
}

public class ActionInvaction
{
List<Interceptor> interceptors = new ArrayList<Interceptor>();
int index = -1;
Action a = new Action();
public ActionInvaction()
{
this.interceptors.add(new FristInterceptor());
this.interceptors.add(new SecondInterceptor());
}
public void invoke()
{
index++;
if(index >= interceptors.size())
{
a.execute();
}
else
{
this.interceptors.get(index).interceptor(this);
}
}
}

public class Action
{
public void execute()
{
System.out.println("execute!!!");
}
}

转载于:https://www.cnblogs.com/snake-hand/p/3151357.html

Struts2运行机制(MVC)的分析:相关推荐

  1. kubelet运行机制及架构分析

    背景 在对kubernetes 管理的容器进行监控时涉及到了cAdvisor,而cAdvisor 又运行在kublet中,在这里记录一下kubelet 相关的介绍 简介 kubelet 是在每个 No ...

  2. vlc内部运行机制以及架构分析

    VLC架构剖析1. VideoLan简介1.1 videolan组成Videolan有以下两部分组成:VLC:一个最主要的部分,它可以播放各种类型的媒体文件和流 vlc架构剖析 1. VideoLan ...

  3. 天龙源码框架分析_MySQL8-InnoDB总体架构和运行机制的系统分析(上)

    1. 前文回顾:四个阶段和两种方法 首先让我们回顾下,在上一篇文章介绍的MySQL8代码分析的四个阶段和两种方法. 四个阶段: 借鉴瀑布式软件开发流程,我们将从熟悉MySQL的使用和运维,到吃透MyS ...

  4. ActiveSupport::Concern 和 gem 'name_of_person'(300✨) 的内部运行机制分析

    理解ActiveRecord::Concern: 参考:include和extend的区别: https://www.cnblogs.com/chentianwei/p/9408963.html 传统 ...

  5. 分析内部运行机制,教你解决Redis性能问题

    摘要:聚焦Redis的性能分析,思考Redis 可以通过哪些机制来提高性能,当性能瓶颈发生的时候,我们又能做出哪些优化策略,最终确保业务系统的稳定运行. 本文分享自华为云社区<分析内部运行机制, ...

  6. uIP TCP Server 运行机制分析

    uIP TCP Server 运行机制分析 DanielLee_USTB 2013.9.22          对于任何一个协议栈而言,首先要实现的就是TCP Server,下面看看uIP的运行机制: ...

  7. 美国国防高级研究计划局(DARPA)组织管理运行机制分析

    美国国防高级研究计划局(DARPA)组织管理运行机制分析 作者:李丹丹,苏鑫鑫   来源:<飞航导弹>  已有 802人浏览 放大  缩小 1957年10月,苏联第一颗人造卫星升空,美国意 ...

  8. 计网实验四—TCP Tahoe与Reno运行机制对比分析

    计算机网络实验四--TCP Tahoe与Reno运行机制对比分析 一.实验目的 二.实验内容 三.实验原理 TCP 基于窗口的拥塞控制策略 1.加法增加乘法减少(AIMD)窗口算法 2. TCP 拥塞 ...

  9. 【设计模式】装饰者模式 ( 概念 | 适用场景 | 优缺点 | 与继承对比 | 定义流程 | 运行机制 | 案例分析 )

    文章目录 I . 装饰者模式概念 II . 装饰者模式适用场景 III . 装饰者模式优缺点 IV . 装饰者模式与继承对比 V . 装饰者模式相关设计模式 VI . 装饰者模式四个相关类 VII . ...

最新文章

  1. 又一届Google Cloud Next,李飞飞发布TPU 3.0,两大AutoML新品
  2. 4、Python —— 函数
  3. JDK动态代理和CGLIB代理的区别
  4. 百度发布机器人助理度秘 “三大基石”炼成
  5. 【Python】青少年蓝桥杯_每日一题_1.19_Python 求和
  6. 手脱EZIP v1.0
  7. oracle基本的查询语句,Oracle基本查询语句
  8. 教你在 Centos 7 中使用 DenyHosts防止ssh暴力破解(亲测)
  9. CoreData 执行executefetchrequest卡死解决办法
  10. AIX系统常用命令总结
  11. python 函数注释出现 :expected an indented block
  12. pm2 启动 nodejs 项目
  13. 【毕业设计】深度学习YOLO安检管制物品识别与检测 - python opencv
  14. 老外网络语言缩写总结
  15. [ 树形DP ] BZOJ4987
  16. sdkman软件开发工具包管理器
  17. 第13章 Python建模库介绍--Python for Data Analysis 2nd
  18. MugLife静态照片变3D动画算法研究
  19. wpf matlab混编,WPF(C#)与MATLAB混合编程
  20. e3d教程做logo教程_AE-炫酷LED灯动画 LOGO片头制作(E3D插件)

热门文章

  1. 如何用行为树开发游戏AI以及任务系统?
  2. 可穿插PC端浏览器任何位置的爱心分割
  3. PHP foreach遍历数组(多种方式)
  4. 那些《西游记》中你不知道的野史,信不信由你
  5. Ubuntu 16.04安装Tomcat 8 图解
  6. 常见的ORACLE锁模式汇总
  7. 好程序员分享Java开发常用规范技巧二
  8. ReactNative开发笔记(持续更新...)
  9. 【Oracle】查看死锁与解除死锁
  10. Jmeter笔记(5)线程组执行顺序