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

Struts工作原理

转自:http://book.51cto.com/art/200909/152101.htm

图2.3简单描述了Struts的工作原理。它把Struts框架处理客户请求的整个过程细分为八个步骤,下面就来详细分析这些步骤。

 
(点击查看大图)图2.3  struts工作原理示意图

1. 读取配置(初始化ModuleConfig对象)

采用Struts框架的Web应用,在Web应用启动时就会加载并初始化ActionServlet,在ActionServlet初始化ModuleConfig的时候,调用initModuleConfigFactory()初始化配置工厂,然后由配置工厂通过initModuleConfig("", config)获得ModuleConfig对象。

通过ModuleConfig对象调用下列方法去初始化相关模块。

 
  1. initModuleMessageResources(moduleConfig);  
  2. initModuleDataSources(moduleConfig);  
  3. initModulePlugIns(moduleConfig); 

这些方法的功能就是:容器在加载Struts应用程序时,会先加载web.xml中与Struts相关的一些配置参数,找到struts-config.xml文件,然后通过循环来读取此文件和解析里面的内容,并初始化相关对象。

2. 用户请求

用户提交表单或调用url向Web应用程序服务器提交一个请求,请求的数据用HTTP协议上传给Web服务器。

3. 填充FormBean

填充FormBean的过程包括实例化、复位、填充数据、校验、保存等操作。根据*.do请求从ActionConfig中找出对应该请求的Action子类,如有对应的Action且这个Action有一个相应的ActionForm,则ActionForm被实例化并用HTTP请求的数据填充其属性,并保存在ServletContext中,这样它们就可以被其他Action对象或JSP调用。如果没有对应的Action,控制器则直接转发给JSP或静态页面。

4. 转发请求

控制器根据配置信息ActionConfig将请求派发到具体的Action,与请求相应的FormBean将一并传给这个Action对象。

5. 处理业务

Action一般只包含一个execute()方法,它负责执行相应的业务逻辑。执行完毕后返回一个ActionForward对象,控制器通过该ActionForward对象进行转发工作。

6. 返回响应

Action根据业务处理的不同结果返回一个响应对象给总控制器,该目标响应对象对应一个具体的JSP页面或另一个Action。

7. 查找响应

总控制器根据业务功能Action返回的目标响应对象找到对应的资源对象,通常是一个具体的JSP页面。

8. 响应用户

目标响应对象将结果展现给用户目标响应对象,即具体的JSP页面,这样客户就得到响应的结果。

相关文章:

  • 【git】git知识梳理(一):基本操作远程控制分支管理
  • Java 反射机制模拟hibernate实现持久化
  • JNDI是什么?
  • OI队测题解:
  • JDBC使用总结
  • freeCodeCamp:Convert HTML Entities
  • JDBC中驱动加载的过程分析(上)
  • JavaScript--substring 和 substr 方法手记
  • 颜色选择器插件
  • JDBC中驱动加载的过程分析(下)
  • 条件控制语句
  • hibernate重要接口说明
  • 微信开发个人总结
  • Hibernate中对象的三种状态及相互转化
  • hibernate脏数据检查
  • 11111111
  • android高仿小视频、应用锁、3种存储库、QQ小红点动画、仿支付宝图表等源码...
  • Android框架之Volley
  • chrome扩展demo1-小时钟
  • docker容器内的网络抓包
  • Git学习与使用心得(1)—— 初始化
  • HashMap ConcurrentHashMap
  • Hibernate【inverse和cascade属性】知识要点
  • Just for fun——迅速写完快速排序
  • JWT究竟是什么呢?
  • Node.js 新计划:使用 V8 snapshot 将启动速度提升 8 倍
  • PHP 小技巧
  • tensorflow学习笔记3——MNIST应用篇
  • Vue学习第二天
  • 阿里云前端周刊 - 第 26 期
  • 测试如何在敏捷团队中工作?
  • 持续集成与持续部署宝典Part 2:创建持续集成流水线
  • 多线程 start 和 run 方法到底有什么区别?
  • 马上搞懂 GeoJSON
  • 批量截取pdf文件
  • 学习JavaScript数据结构与算法 — 树
  • 由插件封装引出的一丢丢思考
  • mysql 慢查询分析工具:pt-query-digest 在mac 上的安装使用 ...
  • puppet连载22:define用法
  • 积累各种好的链接
  • ​​快速排序(四)——挖坑法,前后指针法与非递归
  • ​力扣解法汇总1802. 有界数组中指定下标处的最大值
  • #Lua:Lua调用C++生成的DLL库
  • #前后端分离# 头条发布系统
  • $(selector).each()和$.each()的区别
  • (C#)Windows Shell 外壳编程系列9 - QueryInfo 扩展提示
  • (超简单)使用vuepress搭建自己的博客并部署到github pages上
  • (二)什么是Vite——Vite 和 Webpack 区别(冷启动)
  • (附源码)计算机毕业设计SSM智能化管理的仓库管理
  • (欧拉)openEuler系统添加网卡文件配置流程、(欧拉)openEuler系统手动配置ipv6地址流程、(欧拉)openEuler系统网络管理说明
  • (算法)Game
  • (转)http-server应用
  • (转)Sql Server 保留几位小数的两种做法
  • (轉貼) VS2005 快捷键 (初級) (.NET) (Visual Studio)
  • .bat批处理(二):%0 %1——给批处理脚本传递参数