当前位置: 首页 > news >正文

【struts2】Struts2的系统架构

  Struts2的官方文档里附带了Struts2的架构图,下面这张图上展示了Struts2的内部模块,以及它们的运行流程。

  这张图上分了好多块,彼此之间相互联系,先浏览一下各块的名字,再留心一下运行图最下面的图例,分为四种颜色。

  • 橙色是Servlet Filters,过滤器链,所有的请求都要经过Filter链的处理。
  • 浅蓝色是Struts Core,Struts2的核心部分,Struts2中已经做好的功能,在实际开发中不需要动它们。
  • 浅绿色是Interceptors,Struts2的拦截器。Struts2提供了很多默认的拦截器,可以完成日常开发的绝大部分工作;当然,也可以自定义拦截器,用来实现具体业务需要的功能。
  • 浅黄色是User Created,由开发人员创建的,包括struts.xml、Action、Template,是每个使用Struts2来进行开发的人员都必须会的。

  各模块说明

  架构图上有好多东西,接下来逐个击破。首先看看它们各自是做什么的,跟着图上的箭头一个一个来看:

  • FilterDispatcher是整个Struts2的调度中心,根据ActionMapper的结果来决定是否处理请求,如果ActionMapper指出该URL应该被Struts2处理,那么它将会执行Action处理,并停止过滤器链上还没有执行的过滤器。
  • ActionMapper提供了HTTP请求与action执行之间的映射,简单点说,ActionMapper会判断这个请求是否应该被Struts2处理,如果需要Struts2处理,ActionMapper会返回一个对象来描述请求对应的ActionInvocation的信息。
  • ActionProxy是一个特别的中间层,位于Action和xwork之间,使得我们在将来有机会引入更多的实现方式,比如通过WebService来实现等。
  • ConfigurationManager是xwork配置的管理中心,通俗的讲,可以把它看做struts.xml这个配置文件在内存中的对应。
  • struts.xml是Stuts2的应用配置文件,负责诸如URL与Action之间映射的配置、以及执行后页面跳转的Result配置等。
  • ActionInvocation:真正调用并执行Action,它拥有一个Action实例和这个Action所依赖的拦截器实例。ActionInvocation会执行这些拦截器、Action以及相应的Result。
  • Interceptor(拦截器):拦截器是一些无状态的类,拦截器可以自动拦截Action,它们给开发者提供了在Action运行之前或Result运行之后来执行一些功能代码的机会。类似于我们熟悉的javax.servlet.Filter。
  • Action:动作类是Struts2中的动作执行单元。用来处理用户请求,并封装业务所需要的数据。
  • Result:Result就是不同视图类型的抽象封装模型,不同的视图类型会对应不同的Result实现,Struts2中支持多种视图类型,比如Jsp,FreeMarker等。
  • Templates:各种视图类型的页面模板,比如JSP就是一种模板页面技术。
  • Tag Subsystem:Struts2的标签库,它抽象了三种不同的视图技术JSP、velocity、freemarker,可以在不同的视图技术中,几乎没有差别的使用这些标签。

  参考资料:http://my.oschina.net/exit/blog/153385

转载于:https://www.cnblogs.com/ningvsban/p/3733931.html

相关文章:

  • STM32中用 stop 模式 配合低功耗模式下的自动唤醒(AWU) 能否实现FreeRTOS tickless 模式...
  • ECMAScript中所有的函数的参数都是按值传递的
  • 《快学 Go 语言》第 3 课 —— 分支与循环
  • spark中的动态executor分配
  • zeroclipboard无法正常使用的解决办法
  • Sublime Text 2 安装Package Control和插件的两种方法
  • SpringBoot整合RabbitMQ之典型应用场景实战一
  • MetaMask/provider-engine-3-test
  • Http长连接200万尝试及调优
  • 压缩图片C#算法
  • SSM框架pom.xml的配置
  • unrecognized import path golang.org/x/sync
  • 〔开发系列〕一次关于小程序开发的深度总结
  • [译]2.1-Key-Value Coding Programming Guide 官方文档第二部分
  • Oracle 11g win32位 window7下安装教程
  • 【跃迁之路】【477天】刻意练习系列236(2018.05.28)
  • AzureCon上微软宣布了哪些容器相关的重磅消息
  • Git 使用集
  • js写一个简单的选项卡
  • PaddlePaddle-GitHub的正确打开姿势
  • spring boot下thymeleaf全局静态变量配置
  • 百度地图API标注+时间轴组件
  • 大型网站性能监测、分析与优化常见问题QA
  • 基于Mobx的多页面小程序的全局共享状态管理实践
  • 区块链分支循环
  • 人脸识别最新开发经验demo
  • 使用parted解决大于2T的磁盘分区
  • 推荐一个React的管理后台框架
  • 小而合理的前端理论:rscss和rsjs
  • gunicorn工作原理
  • linux 淘宝开源监控工具tsar
  • (1)SpringCloud 整合Python
  • (MonoGame从入门到放弃-1) MonoGame环境搭建
  • (论文阅读23/100)Hierarchical Convolutional Features for Visual Tracking
  • (四) 虚拟摄像头vivi体验
  • .\OBJ\test1.axf: Error: L6230W: Ignoring --entry command. Cannot find argumen 'Reset_Handler'
  • .Family_物联网
  • .NET Reactor简单使用教程
  • .NET 的静态构造函数是否线程安全?答案是肯定的!
  • .net 前台table如何加一列下拉框_如何用Word编辑参考文献
  • .NET6 开发一个检查某些状态持续多长时间的类
  • .net之微信企业号开发(一) 所使用的环境与工具以及准备工作
  • .NET中的Event与Delegates,从Publisher到Subscriber的衔接!
  • @NestedConfigurationProperty 注解用法
  • [ linux ] linux 命令英文全称及解释
  • [AI]文心一言出圈的同时,NLP处理下的ChatGPT-4.5最新资讯
  • [AIGC] Nacos:一个简单 yet powerful 的配置中心和服务注册中心
  • [AIR] NativeExtension在IOS下的开发实例 --- IOS项目的创建 (一)
  • [BJDCTF2020]The mystery of ip
  • [ffmpeg] x264 配置参数解析
  • [IE9] 解决了傲游、搜狗浏览器在IE9下网页截图的问题
  • [java进阶]——方法引用改写Lambda表达式
  • [Kubernetes]4. 借助腾讯云TKE快速创建Pod、Deployment、Service部署k8s项目
  • [leetcode]56. Merge Intervals归并区间
  • [leetcode]Flatten Binary Tree to Linked List