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!!!");
}
}

Struts2运行机制(MVC)的分析:的更多相关文章

  1. struts2运行机制

    struts2是web应用中一个常用的mvc框架,下面探讨一下其内部运行机制: 1.从客服端浏览器输入的url后,客服端通过http协议发送一个请求到服务器(tomcat),Tomcat收到这个请求之 ...

  2. ECMALL模板解析机制.MVC架构分析及文件目录说明.二次开发指南手册(转)

    ECMALL模板解析语法与机制 http://www.nowamagic.net/architecture/archt_TemplateSyntaxAndAnalysis.php ECMALL模块开发 ...

  3. Spark 运行机制及原理分析

  4. 小学生之浅谈Struts2与struts1的运行机制

    Struts1工作原理图: 1.初始化:struts框架的总控制器ActionServlet是一个Servlet,它在web.xml中配置成自动启动的Servlet,在启动时总控制器会读取配置文件(s ...

  5. ASP.NET MVC 学习1、新增Controller,了解MVC运行机制

    1,turorial ,根据链接教程新建一个MVC项目 http://www.asp.net/mvc/tutorials/mvc-4/getting-started-with-aspnet-mvc4/ ...

  6. ASP.NET MVC的运行机制--url的全局分析

    全局 首先我们来看一副图片       首先,用户通过Web浏览器向服务器发送一条url请求,这里请求的url不再是xxx.aspx格式,而是http://HostName/ControllerNam ...

  7. <转>ASP.NET学习笔记之理解MVC底层运行机制

    ASP.NET MVC架构与实战系列之一:理解MVC底层运行机制 今天,我将开启一个崭新的话题:ASP.NET MVC框架的探讨.首先,我们回顾一下ASP.NET Web Form技术与ASP.NET ...

  8. MVC运行机制[转]

    原:http://www.cnblogs.com/jyan/archive/2012/06/29/2569566.html#3122335 ASP.NET是一种建立动态Web应用程序的技术.它是.NE ...

  9. [原创]java WEB学习笔记70:Struts2 学习之路-- struts2拦截器源码分析,运行流程

    本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...

随机推荐

  1. Collection用法

    Queue接口与List.Set同一级别,都是继承了Collection接口.LinkedList实现了Queue接 口.在队列这种数据结构中,最先插入的元素将是最先被删除的元素:反之最后插入的元素将 ...

  2. IT第四天 - 运算符、随机数、Math类

    IT第四天 上午 运算符 1.%运算符的应用 2.运算符优先级:小括号 ! 算数运算符 关系运算符 && ||   赋值运算符 3.三元运算符:?表示条件为true的结果,:表示条件为 ...

  3. Oracle执行计划——处理一种并行hint不生效的情况

    刚刚在itpub上看到有人在问并行hint不生效的一个问题.我做了实验也出现一样的问题,如下: 原因在这是小表,在联合时走索引了,加上full的hint,就可以启动并行的执行计划. 当然也可以采用pa ...

  4. android软键盘enter键

    enter键,回车键,电脑键盘上enter键就有多种响应.android软键盘也不例外 你在EditText上输入以后,想在下一行输入框输入,可能需要去点击下一行输入框,让它获取焦点,也可能要隐藏软键 ...

  5. Codeforces Round #246 (Div. 2)

    题目链接:Codeforces Round #246 (Div. 2) A:直接找满足的人数,然后整除3就是答案 B:开一个vis数组记录每一个衣服的主场和客场出现次数.然后输出的时候主场数量加上反复 ...

  6. 已经上架的app(可供销售)在AppStore上搜不到的解决办法

    这两天很是头大, 因为3天前手动发布的app到现在都还没在AppStore上看到,打了无数电话给苹果和发邮件给review团队. 下面说说怎么解决我们在iTunes后台看到是绿灯(可供销售)但是就是在 ...

  7. mac 下搭建 Android 开发环境

    因工作需要,要在mac 下搭建 Android 开发环境.谷歌.度娘了好久,没有找个一个完整又系统的方法,很是苦恼.最终,皇天不负有心人,找到了下面这篇文档,结合亲身体验,特此记录.也为有这方面需求的 ...

  8. ajaxfileupload.js 文件上传

    一,前台代码. <input id="fileToUpload" type="file" size="25" name="f ...

  9. ASP.net 学习路线(详细)

    .net学习路线 入门篇1.         学习面向对象(OOP)的编程思想 许多高级语言都是面向对象的编程,.NET也不例外.如果您第一次接触面向对象的编程,就必须理解类.对象.字段.属性.方法和 ...

  10. Struts2-ActionContext

    官方解释: The ActionContext is the context in which an {@link Action} is executed. Each context is basic ...