比较Struts1.x和struts2.0 and struts2.1

Struts实现了MVC模式,结构清晰,使开发者能过关注业务逻辑的实现.在应用Struts框架做项目开发的过程中我们更能体会到这种模式的优越性。下面就简单的谈谈不同Struts版本之间的差异:

首先,从web.xml配置文件中所配置的前端控制器谈起.

  Struts1.x的前端控制器是一个Servlet;

  Struts2的前端控制器是一个filter,Struts2.0中的名字是Filterdispatcher;Struts2.1中的名字是StrutsPrepareAndExecuteFilter

 

再来看看他们的Action.

Struts1.x的Action需要继承Action类,Struts1.x中一个普遍的问题就是使用抽象类编程而不是接口编程.

Struts2中的Action可以不继承任何类,可是实现一个Action接口,也可以实现其他接口。这就使可选和定制的服务成为可能.并且Struts2提供一个ActionSupport基类实现常用的接口.

 

public class ActionSupport implements Action, Validateable, ValidationAware, TextProvider, LocaleProvider, Serializable{

 

        ......//部分省略

 

      /**
     * A default implementation that does nothing an returns "success".
     * <p/>
     * Subclasses should override this method to provide their business logic.
     * <p/>
     * See also {@link com.opensymphony.xwork2.Action#execute()}.
     *
     * @return returns {@link #SUCCESS}
     * @throws Exception can be thrown by subclasses.
     */
    public String execute() throws Exception {
        return SUCCESS;
    }

 

}

 

 

在线程安全方面Struts2明显优于Struts1.x.Struts1.x中的Action是单例模式并且必须是线程安全的.因为仅仅有Action的一个实例来处理所有的请求。单例模式限制了Action可以完成的事情并且在开发时候必须保证Action的线程是安全的或是同步的.

这个问题在Struts2中得到了很好的解决,Struts2中的Action对同一路径的每一个请求产生一个独立的Action实例对象,因此Struts2不用考虑线程安全问题.

 

在容器依赖方面:

Struts1.x中的Action依赖于Servlet API.因为当一个Action被调用时HttpServletRequest和HttpServletResponse被传递给execute()方法;

Struts2中的Action并不需要依赖于特定的容器,在Struts2的Action中我们看不到类似于HttpServletRequest和HttpServletResponse等Web容器相关的对象.并且允许Action脱离容器被单独测试.也许你会产生疑问,既然Action并不带有任何Web容器相关的对象,Action中又是如何与Web容器进行通信并获取Web容器的相关对象的呢?情况是这样的,Struts2会为每个Http的请求建立一个执行环境数据环境。其中,数据环境就成为了Action获取Web容器的基础。所以,当Action需要获取Web容器的相关对象,需要通过数据环境来进行。既然是这样的,那么数据环境(ActionContext)就是每一个Action与Web容器之间的桥梁了. 这里我们还可以再深入的思考一下这个ActionContext应该具备哪些特征呢?我觉得至少应该有如下两个特征:

1、ActionContext中应该保存有针对某个请求的详细信息

2、ActionContext应该是个线程安全的类对象

在处理请求参数方面:

Struts1是通过formBean封转请求参数,所有的ActionForm必须继承一个基类,因为其他的JavaBean不能作为ActionForm

Struts2中直接用Action的属性封转请求参数(依赖注入思想的体现).

 

不得不提一下的是在表达式语言方面:

Struts1.x使用的jstl+el;

Struts2在支持jstl和el表达式的基础上引入了另一种更为强大和灵活的表达式语言--OGNL

看看一下官方网站上对OGNL的解释:

     OGNL is the Object Graph Navigation Language . The framework sets the OGNL context to be our ActionContext, and the value stack to be the OGNL root object. (The value stack is a set of several objects, but to OGNL it appears to be a single object.) Along with the value stack, the framework places other objects in the ActionContext, including Maps representing the application, session, and request contexts. These objects coexist in the ActionContext, alongside the value stack (our OGNL root).

 

对于Struts2的研究还需要深入,要理解Struts2中Action的生命周期就必须弄清楚Action的五大元素:

ActionContext--数据环境、Interceptor--拦截器、result--执行结果、Actionproxy--执行环境、Actioninvocation执行调度者.

具体的就不在这里描述了,有兴趣的朋友可以到网上找一下相关的资料(这才是理解Struts的重点!)

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值