您的位置:首页 > 编程语言 > Java开发

Struts2运行机制(MVC)的分析:

2013-06-23 17:47 465 查看
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!!!");

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: