Struts2的一些不尽人意的地方,兼答hantsy
程序员文章站
2022-05-17 23:14:43
...
hantsy 写道
在 Webwork 合并到Apache Struts项目,曾经对它的期望很大,后来使用后才知道失望更多。
直到现在,Struts2 一个最基本的问题就是对Java标准响应太慢。
这个和Struts2自身的设计有很大的关系。对于一个高度解耦的系统来说,对于Java标准的响应,Struts2全部都理解为可以以Plugin的形式插入到主系统。因此,Struts2对于其核心运行平台的技术升级始终步子迈的不够大。
hantsy 写道
1. 2.X 对Annotation的支持,比 Spring MVC 晚了至少 2年了。相对 Spring MVC,Stripes等框架,Struts 的Annotation可以说是 XML配置的Translation,根本没体现COC(Convention Over Configuration)。
Annotation的支持是以插件形式出现的,但是一直没有一个完整的官方版本。CoC倒是有,不过做得比较弱智一点。
我想强调一下的是,对于配置这个层面,官方迟迟没有给出最为完整的Annotation或者CoC支持的本质原因是其初始化程序中初始化容器的处理架构的缺陷。这个缺陷来自于Webwork时代,至今都没有得到改进。
因为Struts2所定义的配置结构是一个以namespace为中心的Map结构。因此,如果有多个不同的配置源,例如来自XML的,来自Annotation的,甚至来自于CoC的,最终都会在初始化时融合在一起。一旦这些配置源中含有相同的namespace下的众多配置,那么Struts2就无法正确处理。目前市面上所有的插件都采取了回避的措施,使用Unknownhandler的方法来进行处理,不仅效率降低,而且并没有从本质上解决问题。
hantsy 写道
2. 2.x 对Rest的支持相对 Spring MVC来说,可以说弱智,虽然它出了rest1,rest2 两个插件。对于现在的Web程序要求 Rest支持是很常见的。
这个问题也来自于Struts2对于请求映射设计的缺陷。Struts2对于请求的映射最终以一个叫做ActionMapping的类来表述。这个类天然就没有考虑到许多Restful的需求。而构造这个ActionMapping的实现却只是一个非常简单的接口ActionMapper,那么可想而知,ActionMapper的众多实现类要实现Rest实在是一个很困难的事情。更何况实现Rest最好是和配置结构结合起来,光靠一个接口,是很有难度的。
hantsy 写道
3. 直到最近 2.3.1 才支持 JSR330,而Spring 已经支持两年多了。
4. 目前还不支持JSR 303,虽然有第三方,但不是Out of box的,Spring MVC支持得很好。
JSR330和JSR303都可以以插件的形式加入到Struts2中,这个我认为都不是很大的问题。只不过插件的作者水平有高有低,官方没有出正式的支持倒是一个值得商榷的地方。