Struts1和Struts2对比

最近学习了Struts1和Struts2.很多人、很多资料都提到。Struts2不是从Struts1发展而来的。Struts2的前身是WebWork。那它俩到底有多大的不同呢,看了一些资料,下边就来比较比较。

一、架构分析

Struts1的架构图:

执行流程:

1.用户在浏览器端发送请求,服务器(比如:Tomcat)创建HttpServletRequest和HttpServletResponse对象。并将用户的请求的表单信息放到HttpServletRequest对象中。

2.创建ActionServlet对象,在ActionServlet中有一个核心对象RequestProcessor,(1)截取用户请求的地址path,查询得到ActionMapping对象,对应于Struts-config.xml中的acion-mapping标签中的信息。(2)利用ActionMapping中的name,创建ActionForm对象。对应于Struts-config.xml中的form-bean标签中的信息。

3.ActionForm通过reset,获取用户提交的表单信息中所有为name的属性,相应的设置到ActionForm对象的属性中。

4.通过ActionMapping对象中action的完整路径,创建Action(如果有则返回,如果没有则创建,放到map,下次用就不用再创建了。所以,struts1的action是只创建一个实例的)。通过指定的Action,ActionMapping对象、ActionForm对象、HttpServletRequest对象、HttpServletResponse对象作为参数调用调用execute方法。根据用户的请求,控制调用Model,操作数据库,返回操作数据库的结果信息,放到request中。并返回要跳转到的页面。

Struts2的架构图:

执行流程:

1 客户端初始化一个指向Servlet容器(例如Tomcat)的请求。

2 这个请求经过一系列的过滤器(Filter)。

3 接着FilterDispatcher(struts2.1.3之后,strutsPrepareAndExcuteFilter就代替了FilterDispatcher)被调用,FilterDispatcher询问ActionMapper来决定这个请是否需要调用某个Action。

4 如果ActionMapper决定需要调用某个Action,FilterDispatcher把请求的处理交给ActionProxy。

5 ActionProxy通过Configuration Manager询问框架的配置文件,找到需要调用的Action类。

6 ActionProxy创建一个ActionInvocation的实例。

7 ActionInvocation实例使用命名模式来调用,在调用Action的过程前后,涉及到相关拦截器(Intercepter)的调用。

8 一旦Action执行完毕,ActionInvocation负责根据struts.xml中的配置找到对应的返回结果。

Struts2的核心就是拦截器。Struts.xml中所有的package都要extends=”struts-default”。同理与所有的Java类都要extends自Object一样。struts-default.xml里面就是要做以上事情。

二、对比

对比struts1和struts2的执行流程,我没觉得它俩有什么太大的差别。大致是相同的:用户发送请求,通过request到核心控制器上(struts1中是ActionServlet,Struts2中是StrutsPrepareAndExcuteFilter),控制器根据配置文件中的配置,决定调用哪个Action,通过Action的execute()方法,控制调用哪个Model,处理用户的请求,操作数据库,并返回操作结果,并返回跳转的页面。

那Struts2到底是哪里的设计,让它大放异彩?

Struts1的缺点:

1.在struts1中,用户请求提交到request,所有的request都需经过核心控制器ActionServlet判断、处理,要调用哪个Action。创建Action后在调用Model进行业务处理。如果只是访问一个jsp页面,也还是需要经过配置,通过ActionServlet管理的。

Struts2中,ActionInvocation在创建Action时,是经过ActionMapper判断,是否要调用某个Action。只有需要调用的时候才创建。

2.Struts1的Action需要继承一个基类Action的。这里用到了HttpServletRequest、HttpServletResponse作为参数,所以struts1依赖了Servlet API的。存在这种依赖,架构是不容易扩展的,这就是入侵式的设计。此外因为依赖HttpServletRequest、HttpServletResponse,那我们的Action类的测试,是必须依赖web容器,web服务器的。这样的话,单元测试很不容易进行。

Strut2的Action可以不依赖于任何类,只是作为一个单独的,纯粹的类而存在,这样进行单元测试就简便了很多。

3.struts1的Action创建,是单例的。如果创建了就不在创建,所以所有的请求都在使用这一个实例,这就需要保证线程安全。

Struts2的Action创建,是为每一个请求创建一个实例,所以不用考虑线程安全问题。

4.struts1的view部分采用jsp实现。提供了JSTL标签库,标签库可以输出控制器的处理结果。 但struts1支持的表现层技术非常单一:既不支持FreeMarker、Velocity等模版技术,也不支持JasperReports等报表技术 。

比较之下,struts2支持更多的表现层技术,如velocity,freemarker和xslt等

struts1使用标准JSP机制把对象绑定到视图页面;struts2使用“ValueStack”技术,使标签库能访问值,而不需要把对象和视图页面绑定到一起。

所以,通过以上对比,就会发现struts1的设计虽然较于Model2有了很大的提升,但是随着时代、技术的发展,它的缺点会越来越放大。再看struts2,它和struts1的实现机制上有很大的不同,它弥补了struts1的不足。所以struts2并不是struts1的继承和发展,而是webwork的。

时间: 2024-11-08 10:26:08

Struts1和Struts2对比的相关文章

Struts1和Struts2的区别和对比(完整版)

Struts2其实并不是一个陌生的Web框架,Struts2是以Webwork的设计思想为核心,吸收了Struts1的优点,因此,可以认为Struts2是Struts1和Webwork结合的产物. 简单来说二者的区别是: 一个是Stuts1 ,一个是Stuts2,这是最大的区别,技术方面,Stuts1有个核心控制器,但是只提供了一个接口,也就是execute,还要配置actionform之类的,很麻烦,所以依赖性比较强:而Stuts2是针对拦截器开发的,也就是所谓的AOP思想,可以配置多个act

Struts1和Struts2的区别和对比

Struts1和Struts2的区别和对比: Action 类: • Struts1要求Action类继承一个抽象基类.Struts1的一个普遍问题是使用抽象类编程而不是接口. • Struts 2 Action类可以实现一个Action接口,也可实现其他接口,使可选和定制的服务成为可能.Struts2提供一个ActionSupport基类去 实现 常用的接口.Action接口不是必须的,任何有execute标识的POJO对象都可以用作Struts2的Action对象. 线程模式: • Stru

Struts1和Struts2的区别和对比(完整版)(转)

Struts1和Struts2的区别和对比: Action 类: • Struts1要求Action类继承一个抽象基类.Struts1的一个普遍问题是使用抽象类编程而不是接口,而struts2的Action是接口. • Struts 2 Action类可以实现一个Action接口,也可实现其他接口,使可选和定制的服务成为可能.Struts2提供一个ActionSupport基类去 实现 常用的接口.Action接口不是必须的,任何有execute标识的POJO对象都可以用作Struts2的Act

Struts1和struts2的区别(总结)?

struts1和Struts2的区别和对比:(欢迎补充) Action类: ?Struts1要求Action类继承一个抽象基类.Struts1的一个普遍问题是使用抽象类编程而不是接口. ?Struts2 Action类可以实现一个Action接口,也可实现其他接口,使可选和定制的服务成为可能.Struts2提供一个ActionSupport基类去实现常用的接口.Action接口不是必须的,任何有execute标识的POJO对象都可以用作Struts2的Action对象. 线程模式: ?Strut

Struts1 和 Struts2区别

关于Struts2的出现缘由和好处就不多说啦,看了几篇总结的不错的文章,整理下贴出来,共同学习了. Action的区别 对于有着丰富的Struts1.x开发经验的朋友来说,都十分的清楚Action是整个Struts框架的核心内容,当然Struts2也不例外.不过,Struts1.x与Struts2的Action模型很大的区别. Struts2和Struts1.x的差别,最明显的就是Struts2是一个pull-MVC架构.这是什么意思呢?从开发者角度看,就是说需要显示给用户的数据可以直接从Act

浅析Struts1和Struts2的Action线程安全问题

[问题描述]最近公司安排我面试Java的FreshMan,面试者一般是工作1年多点的新人(这里我就装老一下,其实我也才工作3年不到),在被问及Struts1和Struts2的Action的线程安全问题的时候,大多是支支吾吾,答不出所以然.所以在这里我整理一下我个人的理解. [问题答案] 这是由于Servlet的工作原理产生的.我们先来简单回顾一下Servlet的生命周期“初始化->init->service->destroy->卸载”. 这里大家都知道,我们在web.xml里面定义

线程安全 ---Struts1与Struts2

1.线程安全 如果你的代码所在的进程中有多个线程在同时运行,而这些线程可能会同时运行这段代码.如果每次运行结果和单线程运行的结果是一样的,而且其他的变量的值也和预期的是一样的,就是线程安全的. 或者说:一个类或者程序所提供的接口对于线程来说是原子操作或者多个线程之间的切换不会导致该接口的执行结果存在二义性,也就是说我们不用考虑同步的问题. 线程安全问题都是由全局变量及静态变量引起的. 若每个线程中对全局变量.静态变量只有读操作,而无写操作,一般来说,这个全局变量是线程安全的:若有多个线程同时执行

Struts1、Struts2和SpringMVC剖析

前段框架用了不少,今天就来做个总结.网上关于Struts1.Struts2.SpringMVC的文章有很多,这里的内容就是基于它们,来做个比较. 这三个框架是按照上面的顺序,依次出现的,它们都是对MVC模式的实现.为什么会出现这三个.甚至更多的MVC框架呢?他们都是为了将URL世界映射到Java世界.尽管它们它们内部的实现思路不同,有着各自的优缺点,但是它们都做到了个自己的使用目的. 历史介绍 大多Web应用程序,都是运行在HTTP上的.HTTP协议是一系列无状态的文本传输协议.无状态的协议不记

浅析Struts1和Struts2的Action线程安全问题 转

浅析Struts1和Struts2的Action线程安全问题  转 http://blog.csdn.net/virgoboy2004/article/details/5876133 [问题描述]最近公司安排我面试Java的FreshMan,面试者一般是工作1年多点的新人(这里我就装老一下,其实我也才工作3年不到),在被问及Struts1和Struts2的Action的线程安全问题的时候,大多是支支吾吾,答不出所以然.所以在这里我整理一下我个人的理解. [问题答案] 这是由于Servlet的工作