Struts2操作与Servlets相比如何? 一个操作可以作为Servlet吗?
在Struts(Struts1 / Struts Classic)中,Action与servlet的联系更紧密。但在Struts2中,情况大不相同。一个Struts2 Action只是一个POJO(普通Java类),完全解耦了Servlet API。此解耦有助于测试。
在典型的Struts2 Web应用程序工作流程中,每个请求都会实例化一个Action,并与Servlet相关联(如果需要了解此关联,则可以实现 ServletAware
接口;通常不建议这样做)。
与Servlet(以及Struts Action)的一个重要概念区别是,Struts2 Action不会被不同的请求重用,因此是线程安全的:例如,可能会有一个Servlet实例为三个http请求提供服务(同时或非同时),但在这种情况下,我们仍将拥有三个不同的Struts2 Action实例,每个请求一个。
Struts是在原始Java servlet上的一个抽象层。动作本身由程序员定义,并在命中URL时由Struts框架调用(您可以配置哪个URL映射到哪个操作)。因此,它们不会真正“比较”与servlet相同,而是围绕servlet提供的功能进行抽象。您通常使用操作执行jsp输出,该输出等效于servlet。所以发生了什么 a)请求进来了,被映射到操作 b)操作加载一些数据 c)操作呈现jsp,将加载的数据传递给jsp。
如果您希望如此,操作可以直接输出到请求/响应,但在大多数情况下,这可能不是一个好的做法。