Struts2的由来:
Struts2虽然和Struts1名字很近,但其中的设计思想有很大的不同,Struts2是以WEBWork的设计思想为核心,之所以没有延续Struts1的设计思想原因是Struts1的以下缺点:
支持的表现层技术单一,主要支持jsp;与Servlet API严重耦合,这点可以从Action的Execute的方法声明里面可以看出。代码依赖性,有侵入性,Action类和FormBean中,Action必须实现Struts的Action类。Struts2的WebWork思想更符合MVC的设计思想,也更利于代码的复用。
Struts1是使用ActionServlet做为中心处理器,Struts2使用一个拦截器FilterDispatcher做为中心处理器。这样做就可以将Action类和Servlet API进行了分离。
Struts2的简单处理流程如下:
浏览器发送请求
中心处理器根据struts.xml文件查找请求的Action类
WebWork的拦截器自动对请求应用通用功能,例如:WorkFlow,Validation等功能
如果Struts.xml文件中配置Method参数,则调用Method参数对应的Action类中的Method方法,否则调用通用的Execute方法来处理用户请求
将Action类中对应的方法返回的结果响应给浏览器
二者的区别:
Action类的对比:
Struts1的Action在实现的时候必须扩展Action类或者Action的子类,Struts2的Action类实现的时候可以不实现任何类和接口,虽然Struts2中提供一个ActionSupport类,但是,不是必须的。
Struts1的Action类是单例模式,必须设计成线程安全的,Struts2则为每一个请求产生一个实例
Struts1的Action类依赖于Servlet API ,从其execute的方法签名可看出,execute方法有两个Servlet的参数HttpServletRequest和HttpServletResponse,Struts2则不依赖于Servlet API
由于Struts1依赖于Servlet API 这些web元素,因此对Struts1的Action进行测试的时候是很困难的,需要借助与其他测试工具,Struts2的Action可以测试其他的一个简单的POJO进行数据传递,而Struts2将这变成了现实。
Struts1绑定了JSTL,为页面的编写带来了方便,Struts2整合了ONGL,也可以使用JSTL,因此Struts2下的表达式语言更加强大
扩展
Struts2与WebWork对比:
Struts2实际上就是WebWork2.3,不过有少许的差别:
Struts2不再支持内置IOC容器,改用Spring的IOC容器
Struts2对于Webwork的一些Ajax特性的标签改用Dojo进行替换。