Struts 2 的动作模型
一直以来都没有很好地考究 Struts 2 用的是怎样一个模型。多数人认为 Struts 2 的精髓在于拦截器,如果单从 Struts 2 的包来看似乎的确这样,因为很多 Action 部分的包都由 xwork 提供了。
但我觉得,这个 interceptor (拦截器)的概念实际上和 Servlet 规范中的 Filter 十分像,Struts 1 是对 Servlet 规范进行一封封装,实际上架构还是依循 Servlet 而建立的。而 Struts 2 的架构和 Struts 1 类似吗?
就我们所知道的,Struts 2 是 Struts 1 和 WebWork 的结合,实际上更偏向于 WebWork 框架(具体历史不考究了,只看软件包结构可以看出)。Struts2 框架实际上并不直接封装请求的信息传递给 Java 类,而是通过配置文件和参数约定把逻辑类的参数和请求参数绑定起来,使用统一的控制器(请求分发器)作为边界。因此,这个模型和 Struts 1 的架构来说差异还是很大的。
Strus 1 的 Action 控制器实际上只是对 Servlet 进行了封装,分离了控制和视图(实际上用 Servlet 控制,转发给 JSP 同样可以做到),外加上 ActionForm 对标单提交和校验作了封装。
而 Struts 2 采用的实际上是另一套模型。大家知道为了复用而让请求和 Action 解耦,但是却没想过这时候 Action 应该算是什么。我觉得这个改变促使其对 Struts 1 下的 MVC 模型进行了补充,把 Struts 1 中的 Action 整合为组件,既可以模仿 Struts 1 的方式写 Action ,又可以把服务类直接当作 ction 。
Struts 2 的组件化实际上可以使得边界类可以不再出现(理想情况下),达到代码复用的最好情况。