众所周知Struts2是MVC模式在web开发中经典的框架之一,学习web开发,这也是一个必经过之路吧,实在不行也得瞅瞅,万一哪天用到了。

技术优势:
Struts2有两方面的技术优势,一是所有的Struts2应用程序都是基于client/server HTTP交换协议,The Java Servlet API揭示了Java Servlet只是Java API的一个很小子集,这样我们可以在业务逻辑部分使用功能强大的Java语言进行程序设计。
二是提供了对MVC的一个清晰的实现,这一实现包含了很多参与对所以请求进行处理的关键组件,如:拦截器、OGNL表达式语言、堆栈。

工作原理:

一个请求在Struts2框架中的处理大概分为以下几个步骤
官方给出的Struts2官方给出的一张工作原理图:

1、客户端初始化一个指向Servlet容器(例如Tomcat)的请求
2、这个请求经过一系列的过滤器(Filter)(这些过滤器中有一个叫做ActionContextCleanUp的可选过滤器,这个过滤器对于Struts2和其他框架的集成很有帮助,例如:SiteMesh Plugin)
3、接着FilterDispatcher被调用,FilterDispatcher询问ActionMapper来决定这个请是否需要调用某个Action
FilterDispatcher是控制器的核心,就是mvc中c控制层的核心。下面粗略的分析下我理解的FilterDispatcher工作流程和原理:FilterDispatcher进行初始化并启用核心doFilter

    public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException ...{HttpServletRequest request = (HttpServletRequest) req;HttpServletResponse response = (HttpServletResponse) res;ServletContext servletContext = filterConfig.getServletContext();// 在这里处理了HttpServletRequest和HttpServletResponse。DispatcherUtils du = DispatcherUtils.getInstance();du.prepare(request, response);//正如这个方法名字一样进行locale、encoding以及特殊request parameters设置try ...{request = du.wrapRequest(request, servletContext);//对request进行包装} catch (IOException e) ...{String message = "Could not wrap servlet request with MultipartRequestWrapper!";LOG.error(message, e);throw new ServletException(message, e);}ActionMapperIF mapper = ActionMapperFactory.getMapper();//得到action的mapperActionMapping mapping = mapper.getMapping(request);// 得到action 的 mappingif (mapping == null) ...{// there is no action in this request, should we look for a static resource?String resourcePath = RequestUtils.getServletPath(request);if ("".equals(resourcePath) && null != request.getPathInfo()) ...{resourcePath = request.getPathInfo();}if ("true".equals(Configuration.get(WebWorkConstants.WEBWORK_SERVE_STATIC_CONTENT)) && resourcePath.startsWith("/webwork")) ...{String name = resourcePath.substring("/webwork".length());findStaticResource(name, response);} else ...{// this is a normal request, let it pass throughchain.doFilter(request, response);}// WW did its job herereturn;}Object o = null;try ...{//setupContainer(request);o = beforeActionInvocation(request, servletContext);
//整个框架最最核心的方法,下面分析du.serviceAction(request, response, servletContext, mapping);} finally ...{afterActionInvocation(request, servletContext, o);ActionContext.setContext(null);}}
du.serviceAction(request, response, servletContext, mapping);
//这个方法询问ActionMapper是否需要调用某个Action来处理这个(request)请求,如果ActionMapper决定需要调用某个Action,FilterDispatcher把请求的处理交给ActionProxypublic void serviceAction(HttpServletRequest request, HttpServletResponse response, String namespace, String actionName, Map requestMap, Map parameterMap, Map sessionMap, Map applicationMap) ...{ HashMap extraContext = createContextMap(requestMap, parameterMap, sessionMap, applicationMap, request, response, getServletConfig());  //实例化Map请求 ,询问ActionMapper是否需要调用某个Action来处理这个(request)请求extraContext.put(SERVLET_DISPATCHER, this); OgnlValueStack stack = (OgnlValueStack) request.getAttribute(ServletActionContext.WEBWORK_VALUESTACK_KEY); if (stack != null) ...{ extraContext.put(ActionContext.VALUE_STACK,new OgnlValueStack(stack)); } try ...{ ActionProxy proxy = ActionProxyFactory.getFactory().createActionProxy(namespace, actionName, extraContext);
//这里actionName是通过两道getActionName解析出来的, FilterDispatcher把请求的处理交给ActionProxy,下面是ServletDispatcher的 TODO: request.setAttribute(ServletActionContext.WEBWORK_VALUESTACK_KEY, proxy.getInvocation().getStack()); proxy.execute(); //通过代理模式执行ActionProxyif (stack != null)...{ request.setAttribute(ServletActionContext.WEBWORK_VALUESTACK_KEY,stack); } } catch (ConfigurationException e) ...{ log.error("Could not find action", e); sendError(request, response, HttpServletResponse.SC_NOT_FOUND, e); } catch (Exception e) ...{ log.error("Could not execute action", e); sendError(request, response, HttpServletResponse.SC_INTERNAL_SERVER_ERROR, e); }
} 

4、如果ActionMapper决定需要调用某个Action,FilterDispatcher把请求的处理交给ActionProxy
5、ActionProxy通过ConfigurationManager询问框架的配置文件,找到需要调用的Action类 ,这里,我们一般是从struts.xml配置中读取。
6、ActionProxy创建一个ActionInvocation的实例。
7、ActionInvocation实例使用命名模式来调用,在调用Action的过程前后,涉及到相关拦截器(Intercepter)的调用。

参考原文

【框架学习】Struts2(一)工作原理相关推荐

  1. 谈谈struts2的工作原理

    2019独角兽企业重金招聘Python工程师标准>>> 一.谈谈struts2的工作原理: 最近学习struts2,其实它就是webwork2.2的升级版,现附上原理图 上图来源于S ...

  2. Struts2的工作原理及工作流程

    众所周知,Struts2是个非常优秀的开源框架,我们能用Struts2框架进行开发,同时能 快速搭建好一个Struts2框架,但我们是否能把Struts2框架的工作原理用语言表达清楚,你表达的原理不需 ...

  3. TI CC1101学习笔记:工作原理简单入门

    众所周知,在IOT的市场应用中,从通信协议细分的话,有SUB-1G,2.4G,3G, 4G,以及最新推出的5G,虽然5G通信协议已经在崭露头角,但是不同的通信协议在不同的应用领域之中还是占据着一定的重 ...

  4. Struts2的工作原理

    Struts2是在Struts1的基础上发展而来的,Struts是WebWork和Struts1的集合,采用的正是WebWork的核心,更多的是WebWork. 下载的Struts2源代码文件 主要的 ...

  5. Unity游戏通用mod框架BepInEx生态的工作原理简介

    背景   几个月前, 游戏雨中冒险2 (Risk of Rain2)出了新的DLC, 工作之余跟伙伴联机受受苦还是惬意的.RoR2 这个游戏在设计上的一些机制(比如没有小地图)使得本来操作就不精湛的我 ...

  6. react构建小程序框架及remax的工作原理

    1.为什么要用 React 来构建小程序? react生态体系完善. 自Facebook在2013年5月开源React,经历了7年多的发展,react的社区生态体系非常庞大,若是使用react来构建小 ...

  7. 什么是深度学习?其工作原理是什么?

    什么是深度学习? 简单来说,深度学习就是样本研究. 从最基本的概念上看,深度学习就是机器学习的一种方法,教计算机筛选输入的信息,进而对信息进行预测和分类.其观察结果可以通过图片.文字或声音的方式呈现. ...

  8. Git学习——Git基本工作原理(入门级教程,通过玩转Git本地仓库,帮助新手快速入手Git)

    如果你只是想知道如何用Git上传代码至托管平台,请看:创建码云仓库并完成第一次上传(https) 及 使用ssh协议上传代码 如果你想了解Git本地仓库的工作原理,欢迎阅读本文. 文章目录 一.分区及 ...

  9. Servlet学习笔记-Servlet工作原理和过程

    1.前言   Java Servlet技术简称Servlet技术,是Java开发Web应用的底层技术.由Sun公司于1996年发布,用来代替CGI--当时生成Web动态内容的主流技术.官方文档对Ser ...

  10. Struts2核心工作原理解析

    这篇文章对应的并非Struts2的最新版本,但其原理还是相同的. 这是Struts2官方站点提供的Struts 2 的整体结构. 一个请求在Struts2框架中的处理大概分为以下几个步骤: 客户端提起 ...

最新文章

  1. 解题报告:P5960 【模板】差分约束算法(及常用技巧)
  2. MRI原理谁都看得懂版
  3. javascript 閉包
  4. 【Groovy】闭包 Closure ( 闭包类 Closure 简介 | this、owner、delegate 成员区别 | 静态闭包变量 | 闭包中定义闭包 )
  5. 开源内容管理系统 php mysql_「分享」7 个精致的 PHP 开源内容管理系统(CMS)
  6. 零基础学python
  7. 浮栅场效应管 符号_场效应管主要参数与特点,场效应管与其他管子的对比
  8. python的collections模块的学习
  9. ES aggr terms nested study
  10. Google 网站打不开
  11. R语言批量生成CaseWhen的解决方案
  12. MSN 通信协议学习笔记(转)
  13. 计算机管理删除打印机驱动,彻底删除打印机驱动的方法
  14. Python优化机制:常量折叠
  15. MCE | 外泌体的检测提取机制
  16. 用 Python 进行 OCR 图像识别
  17. 内容交付网络(CDN)的全球与中国市场2022-2028年:技术、参与者、趋势、市场规模及占有率研究报告
  18. AI面临产业大考:落地虽难,但产业化路径已日渐清晰
  19. python excel处理重复行并统计个数_python统计一个文本中重复行数的方法
  20. 推荐一款牛逼的Windows神器!功能很强大!

热门文章

  1. mysqli数据库连接
  2. Android 应用程序签名、发布
  3. 谈我的算法工程师校招经历
  4. WebBench压力测试工具(详细源码注释+分析)
  5. [转载] 信息系统项目管理师视频教程——29 信息系统监理
  6. 安防网络摄像头互联网直播视频流媒体服务器EasyNVR输出直播流 RTMP、HTTP-FLV、 HLS 的对比分析
  7. SAS学习笔记4:实战
  8. 【Word】实习证明简易模板
  9. CCS导入项目后中文是乱码
  10. 小学奥数思维训练题(三)