Struts框架原理分析之我见
struts是早期的成熟MVC前端控制层框架,具有诸多优点,近两天又系统了研究了一下框架的原理,
希望能够从原理上研究一下struts框架的实现思路。也就是说如果理解了这些原理的相关应用技术,就可以自己写出
一个山寨版的struts了,当然根据水平的不同,写出的框架的健壮性、扩展性、重用性肯定会相差很多的。
struts的有两个控制器,分别是前端的ActionServlet中心控制器,和后端所有action都需要继承的
Action控制器。真正的开发过程中,项目开发人员并不需要对ActionServlet有过多的了解就可以开发的很happy。
但是这篇随笔我想系统的写一下我最近的研究体会,解析struts架构。从ActionServlet开始,让我们看透struts。
struts并不神秘,构建起这个框架的技术是servlet,jsp,javabean,dom4j或jdom,反射。
1.ActionServlet(中心控制器)
ActionServlet需要做的工作是,根据web.xml的struts配置文件的路径,解析struts配置文件(一般用的都是
/WEB-INF/struts-config.xml)。当然不只找配置文件这么简单,还需要初始化一些属性值,如果web.xml没有
指定,就使用默认的值,这是第一个重要步骤。第二步填充ActionFrom,struts框架构建于“Action-Form”模式上
所以这一步非常重要,也是难点。首先根据配置文件,利用反射的Class.forName方法查找匹配的类,如果存在则填充,
不存在则抛出异常。提取页面所有参数名(request.getParameterNames()--Enumeration),接着把参数名与bean
中的属性名进行匹配,若匹配把取出的值填充到bean中(使用BeanUtils技术)保存form对象。如果使用ActionForm
的子类DynaActionForm,则是走另一套类似的方法,只不过不需要使用反射,而是直接对比配置文件的配置属性和
所配置数据类型是否一致。一致就构建进一个内致的formbean对象。然后需要借助Action后端控制器进行操作默认会
调用对应的action的execute方法(前提:action没有继承自DispatchAction之类的特殊Action控制器子类的话)。最终
接收返回的ActionForward,派发请求并查找响应。
--------------------------这就是神秘的ActionServlet。
2.Action(后端控制器)
主要包含execute方法,还有其他加起来多达21种可覆写方法。当然这也就体现出了struts框架的完善度。如果我们自己想要在
不看源码的情况下实现这个控制器,我觉得需要挑战一下自己的能力。这里不过多的叙述了。
3.ActionFrom
包含方法:Reset、validate.....9种可覆写方法。实现诸如校验、重置的功能。
4.ActionMapping
这是action的控制方法都要传的一个重要参数对象,包含属性:path,name,type,validate,HashMap:forwards....
5.ActionForward
这是action的控制方法都要返回的一个参数对象,包含属性:name,path,redirect....
---------------------------以上就是struts的核心类。
struts的插件实现是给了一个Plugin接口,其中有两个接口方法来实现的。说白了就是在struts启动的时候,会加载
插件的初始化方法或者配置文件。
当然除了上述的主要核心内容外struts也要实现许多其他的功能类,来实现国际化,模块异常,链式结构,页面标签处理,
可视化结构,以及一些我所没有用到的功能。这些源代码没有研究,目前资历尚浅,有待今后研究。
总结:
不要因为现在有了struts2,JSF,甚至更新的JavaFX技术,就不去学好老框架,每个框架都有它的智慧所在。况且掌握
一个框架又不难,所以更没有理由拒绝。
作者:Steven(Steven's Think out)
出处:http://shiyangxt.cnblogs.com
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· 字符编码:从基础到乱码解决
· Open-Sora 2.0 重磅开源!