10520171011

strtus2核心工作流程_struts2工作流程


10520171011
1、问:Strtus2为什么说是MVC框架?

1)、StrutsPrepareAndExecuteFilter:属于控制器(前端控制器)

2)、Action:属于模型(后端控制器)

3)、Result:属于视图

2、Strtus2的工作流程

1)、StrutsPrepareAndExecuteFilter:获取用户请求,根据用户请求做出相应处理(整个strtus2最核心的组件)

2)、ActionMapper:它会根据uri去寻找是够存在对应的Action,根据strtus.xml文件去寻找

3)、ActionProxy:执行ActionInvocation代理类

4)、ConfigurationManger:读取struts.xml文件的配置类

5)、ActionInvocation:执行拦截器[真正执行Action对象的类]

6)、Interceptor:拦截器[作用:1、数据校验 2、文件上传等等]

7)、Action:业务逻辑的处理类

8)、Result:视图组件

3、StrutsPrepareAndExecuteFilter源码分析

1)、String uri = RequestUtils.getUri(request); //获取uri地址

2)、boolean handled = execute.executeStaticResourceRequest(request, response);//是否是访问静态资源(jpeg、css、html、js)

3)、prepare.setEncodingAndLocale(request, response); //设置请求的编码

4)、prepare.createActionContext(request, response); //创建值栈(ValueStack)和ActionContext的对象
ValueStack:用于保存页面显示的数据
ActionContext对象:
Action类的上下文,通过此获取可以获取Servlet的api、获取四大作用域的对象,获取值栈对象 request、session、servletContext、page

5)、prepare.assignDispatcherToThread();将当前的请求委派一个线程去处理

6)、request = prepare.wrapRequest(request); //重新对request对象进行包装,主要处理的上传文件的request,重写getAttribute方法

7)、ActionMapping mapping = prepare.findActionMapping(request, response, true);//根据请求信息,从struts.xml文件去寻找是否存在对应的Action
mapping = dispatcher.getContainer().getInstance(ActionMapper.class).getMapping(request, dispatcher.getConfigurationManager());

8)、execute.executeAction(request, response, mapping);//执行Action类对象
//创建ActionProxy组件
ActionProxy proxy = getContainer().getInstance(ActionProxyFactory.class).createActionProxy(
namespace, name, method, extraContext, true, false);
Result result = mapping.getResult();
//执行ActionInvocation.invoke();
result.execute(proxy.getInvocation());
invoke()方法
1、先将全部的拦截器执行完毕之后
2、invokeActionOnly(); //才会执行Action
3、executeResult();//执行result

9)、prepare.cleanupRequest(request); //清理资源工作