Struts2 相对于Struts1是一个新框架,Struts2并不是Struts1的升级版,准确的来说Struts2是由webwork衍生出来的一个新框架,是webwork的升级
Struts2框架贯穿了java开发的整个周期,从开发到发布及维护的整个过程。
http://blog.csdn.net/minxwy/article/details/20210661 参考的这篇文章
Struts1和Struts2的区别
action类
Struts1要求action类继承一个抽象基类,Struts1是抽象类编程不是接口
(抽象基类和接口的区别,
抽象基类可以定义成员变量,可以定义成员函数,还可以定义抽象成员函数。 但是,抽象基类不能被实例化。
一个继承抽象基类的类可以部分或全部实现父类中的抽象成员函数。如果全部继承,那么这个类就是一个普通类,可以实例化;如果只部分继承,那这个类还是抽象类,不能被实例化。
接口中不能定义成员变量,不能定义成员函数(带函数体的函数),只能定义抽象函数(abstract关键字可选)。实现一个接口必须实现接口的所有方法,接口不能被实例化。
)
Struts2 action可以实现一个action接口也可以实现其他接口,Struts2提供了一个actionSupport基类去实现常用接口,action接口不是必须的,任何有execute标识的pojo对象都可以用作struts2的action对象
线程模式
Struts1 action是单例模式,并且必须是线程安全的,因为仅有action的一个实例来处理所有的请求,单例策略现在了action能做的事情,在开发时要小心,action资源必须是线程安全同步的,因此他存在线程完全问题
Struts2 action是线程安全的,每一个action会为每次请求创建一个实例,所以不存在安全问题
servlet的依赖
Struts1 action依赖于servlet api,因为当一个action被调用时 request和response被传递给execute方法
Struts2 不依赖于容器,允许action脱离容器单独被测试(例如junit单元测试,可以直接测试脱离了容器)
捕获输入
Struts1 使用actionform对象捕获输入,所有的actionform必须继承一个基类,因为其他的javabean不能作用actionform,开发者经常创建多余的类捕获输入,这样可能会导致创建了已存在的javabean,会导致冗余
Struts2直接使用action属性作为输入属性,消除了对第二个对象,也就是我们传建bean的需求,对象类型包括业务对象都能作为输入输出对象
语言表达式
Struts1 整合了jstl,使用jstlel 这种el对基本对象遍历,但是对集合索引属性支持很弱
Struts2 可以使用jstl,但更支持ognl
绑定值到页面
struts1使用了标准的jsp机制把对象绑定到页面中来访问
struts2 能够用taglib访问值而不需要页面(view)和对象绑定起来
action执行控制
struts1支持每一个模块有单独的生命周期,但是每个模块所有的action必须共享相同的生命周期
struts2 支持通过拦截器堆栈为每个action创建不同的生命周期
流程图
struts1
客户端发起request请求,被struts1的actionservlet接受,然后actionservlet根据status.xml里的映射文件找到对应的action,找不到就返回500错误到页面,找到就到action中的excute()方法去执行相应的逻辑,然后通过actionforward跳到相应的页面
struts2
客户端发起request请求,
interceptor做一些拦截的初始工作
当外部的httpservleterequest 到来 初始到servlet容器传递给一个标准的过滤链
调用fiterdispatecher过滤器查找相应的actionMapper
如果找到了相应的mapper,则把控制权限交给actionproxy 代理器
actionproxy会通过configurationManager来查找strutsx.xml
下一步通过actioninvocation来辅助命令模式的实现(包括调用一些拦截Interceptor框架在调用act
一旦action返回,会查找相应的result,result类型可以是jsp或者freemark等,这些组件和actionmapper一起返回给url
响应返回是通过我们web.xml配置的过滤器