与Struts1比较,Struts2有以下几点比较明显的优点:
Struts2在处理action时并不是将所有的信息处理交给action来处理,而是由ActionProxy来创建调用action的ActionInvacation实例。这种处理方式的好处是:可以创建多个ActionInvacation实例调用不同的Action,所以Struts2的action是线程安全的;而Struts1的Action是单例模式的,是线程不安全的。
Struts2的Action是不依赖于Servlet容器的,在Action中的可以通过ActionContext取得request和response的信息,而Struts必须依赖于Servlet容器与HttpServletRequest和HttpServletResponse绑定,来取得reponse和request中的信息。这种对容器的紧密的依赖性,不利于代码的单元测试。Struts2与Servlet的解耦很好的解决了这个问题。
对于开发者来说,最明显的区别就在于ActionFrom,在Struts中,每个JSP表单都需要带一个特定的ActionForm,这个ActionForm用于在JSP和Action之间传递表单上的数据。而正是由于Struts2的每个Action不依赖于Servlet容器,Action可以是一个普通的对象不需要和特定的ActionForm绑定,表单上的数据也可以作为Action中普通的成员变量来操作。Struts2的这种存储数据的方式不仅减轻了开发人员的工作量,而且可以使开发人员更好的用面向对象的思想编程。