小学生之浅谈Struts2与struts1的运行机制

Struts1工作原理图:

1、初始化:struts框架的总控制器ActionServlet是一个Servlet,它在web.xml中配置成自动启动的Servlet,在启动时总控制器会读取配置文件(struts-config.xml)的配置信息,为struts中不同的模块初始化相应的对象。(面向对象思想)

2、发送请求:用户提交表单或通过URL向WEB服务器提交请求,请求的数据用HTTP协议传给web服务器。

3、form填充:struts的总控制器ActionServlet在用户提交请求时将数据放到对应的form对象中的成员变量中。

4、派发请求:控制器根据配置信息对象ActionConfig将请求派发到具体的Action,对应的formBean一并传给这个Action中的excute()方法。

5、处理业务:Action一般只包含一个excute()方法,它负责执行相应的业务逻辑(调用其它的业务模块)完毕后返回一个ActionForward对象。服务器通过ActionForward对象进行转发工作。

6、返回响应:Action将业务处理的不同结果返回一个目标响应对象给总控制器。

7、查找响应:总控制器根据Action处理业务返回的目标响应对象,找到对应的资源对象,一般情况下为jsp页面。

8、响应用户:目标响应对象将结果传递给资源对象,将结果展现给用户。

Struts1与struts2有什么不同?

1.Action类 
 Stuts1要求Action类继承一个抽象基类。Struts1的一个普通问题是使用抽象类编程而不是接口。Struts2 Action类可以实现一个Action接口,也可以实现其它接口,使可选和定制的服务成为可能。Struts2提供一个ActionSupport基类去实现常用的接口。Action 接口不是必须的,任何有execute标识的POJO对象都可以用作Struts2的Action对象。

2. 线程模式:Struts1n Action是单例模式并且必须是线程安全的,因为仅有Action的一个实例来处理所有的请求。单例策略限制了Struts1 Action能作的事,并且要在开发时特别小心。Action资源必须是线程安全的或同步的。 Struts 2 Action对象为每一个请求产生一个实例,因此没有线程安全问题。

3. Servlet依赖:Struts1 Action依赖于Servletn API,因为当一个Action被调用时,HttpServletResquest和HttpServletResponse被传递给execute方法,即Action依赖了容器,测试变得非常麻烦。Struts2 Action不依赖于容器,允许Action脱离容器单独被测试。如果需要,Struts2Action仍然可以访问初始的request和response。但是,其它的元素减少或者消除了直接访问HttpServletRequset和HttpServletResponse的必要性。

4.捕获输入:Struts1使用ActionForm对象捕获输入。所有的ActionForm必须继承一个基类。因为其它JavaBean不能用作ActionForm,开发者经常创建多余的类捕获输入。动态Bean可以作为创建传统ActionForm的选择,但是,开发者可能是在重新描述已经存在的JavaBean,仍然会导致有冗余的javabean。Struts2直接使用Action属性作为输入属性,消除了对第二输入对象的需求。Action属性能够通过web页面上的taglibs访问。Struts2也支持ActionForm模式。(Struts2用普通的POJO来接收数据)

5.表达式语言:Struts1整合了JSTL,但对集合和索引属性的支持很弱。Struts2可以是使用JSTL,但是也支持一个更加强大和灵活的表达式语言 “Object Graph Notation Language”(OGNL).

6. 绑定值到页面(view):Struts1使用标准JSP机制把对象绑定到页面中来访问,Struts1要传递值的时候必须往request里放、往session里放,然后再传递到jsp里面,铜鼓el表达式得到。Struts2使用“ValueStack”技术,使taglib能够访问值而不需要把你的页面和对象绑定起来。ValueStack策略允许通过一系列名称相同但类型不同的属性重用页面。值栈技术非常著名。不需要request、不需要session,直接从Action中取值。

7.类型转换: Struts1ActionForm属性通常都是String类型。Struts1使用Commons-Beanutils进行类型转换。每个类一个转换器,对每一个实例来说是不可配置的。Struts2 使用OGNL进行类型转换。提供基本和常用对象的转换器。

8.校验:Struts1支持在ActionForm的validate方法中手动校验,或者通过Commons Validator的扩展来校验。同一个类可以有不同的校验内容,但不能校验子对象。Struts2支持通过validate方法和Xwork校验框架来进行校验。Xwork校验框架使用为属性类类型定义的校验和内容校验,来支持chain校验子属性。

9.Action执行的控制:Struts1支持每一个模块有单独的RequestProcessors(生命周期),但是模块中的所有Action必须共享相同的生命周期。(服务器重启时,Action生命周期结束,即生命周期无法控制)。Struts2支持通过拦截器堆栈(Interceptorn Stacks)为每一个Action创建不同的生命周期。堆栈能够根据需要和不同的Action一起使用。(可以控制Action的生命周期)

简单的说:
struts1 和struts2的核心原理不同: 
struts1.X是基于servlet的 
struts2是xwork的变体:他的核心是filter 
struts1是单力模式开发, 
struts2是多力模式。 
struts1的单力模式好处是节省内存,缺点是并发性查,非同步。 
struts2好处是线程安全是同步的每次使用开辟新的内存空间,缺点是占用资源多。

为什么要使用Struts框架 ?

既然本文的开始就说了,自己可以建这种框架,为什么要使用Struts呢?我想下面列举的这些理由是显而易见的:首先,它是建立在MVC这种公认的好的模式上的,Struts在M、V和C上都有涉及,但它主要是提供一个好的控制器和一套定制的标签库上,也就是说它的着力点在C和V上,因此,它天生就有MVC所带来的一系列优点,如:结构层次分明,高可重用性,增加了程序的健壮性和可伸缩性,便于开发与设计分工,提供集中统一的权限控制、校验、国际化、日志等等;其次,它是个开源项目得到了包括它的发明者Craig R.McClanahan在内的一些程序大师和高手持续而细心的呵护,并且经受了实战的检验,使其功能越来越强大,体系也日臻完善;最后,是它对其他技术和框架显示出很好的融合性。如,现在,它已经与tiles融为一体,可以展望,它很快就会与JSF等融会在一起。当然,和其他任何技术一样,它也不是十全十美的,如:它对类和一些属性、参数的命名显得有些随意,给使用带来一些不便;还有如Action类execute方法的只能接收一个ActionForm参数等。但瑕不掩瑜,这些没有影响它被广泛使用

Struts1与Struts2运行机制

struts1框架机制:

使用ActionForm进行用户数据收集,形成业务model 通过xml配置文件对应到特定的Action进行处理, ActionMapping提供页面跳转,兼有请求转发的功能 框架内置的Filter机制可以在formbean构造完成,Action处理之前做前期业务过滤工作 同时struts1自带标签库提供页面引用,并支持自定义标签开发,来丰富页面展示

struts2框架机制

自带的xwork依赖注入框架完成业务model数据的收集和创建,并直接注入到Controller里等待处理 Controller的多种实现方式方便开发员更自由的面向对象的进行业务数据的处理工作,同时摆脱了对软件服务器底层API的依赖, 内置强大的Inerceptor拦截器提供了许多常用的功能,实现在Action处理前和处理后的AOP拦截工作, struts2还支持自定义RusultType和Inerceptor的功能,方便了自主开发的扩展实现。

时间: 2024-12-28 01:23:04

小学生之浅谈Struts2与struts1的运行机制的相关文章

浅谈struts2标签中的2个很常用的标签的用法(radio和select)

1.如图所示我们需要在前台的页面通过radio和select将对应的数据库中的数据显示到选项当中,这也是我们做项目中经常需要做的,动态的显示,而不是静态的显示. 首先我们需要在页面中导入struts2的标签库<%@ taglib prefix="s" uri="/struts-tags"%>,一般的我们不用struts2写一个radio代码如下: <input type="RADIO" name="sex"

(转)浅谈移动操作系统的跨应用通信机制

[核心提示] 对开发者来说,在 iOS 上实现跨应用的通信依然是一件头疼的事.对于 iOS 的竞争对手们来说,这一问题是如何处理的呢?本文浅谈目前主流移动操作系统的跨应用通信机制. 在“应用间通信——iOS 的孤岛困境”一文中,我们曾经讨论过 iOS 上跨应用通信与内容分享的难题.而直到现在,在 iOS 上想实现跨应用的通信和内容分享依然是一件头疼的事,虽然我们已经可以使用 iOS 系统内部整合的分享功能,实现通过 Twitter.电子邮件.短消息的内容分享,但此功能尚未向第三方开发者开放,用户

浅谈getaddrinfo函数的超时处理机制

在sockproxy上发现,getaddrinfo 解析域名相比ping对域名的解析,慢很多.我觉得ping用了gethostbyname解析域名.问题变为getaddrinfo解析域名,是否比 gethostbyname慢.写测试程序,分别用getaddrinfo和gethostbyname解析,发现getaddrinfo确实慢. strace跟踪发现,getaddrinfo和DNS服务器通信10次,gethostbyname和DNS服务器通信2次. gethostbyname是古老的域名解析

Struts2架构分析和运行机制

实例分析 1.在浏览器中输入url地址后,会通过http协议发送给tomcat,tomacat收到请求后查看访问的是哪个 webapplication(如下图的Struts2_0100_Introduction),tomcat把Struts2_0100_Introduction交给对应的 webapplication程序去处理. 2.之后会参考Struts2_0100_Introduction下的对应的web.xml文件,将请求交给Struts2Filter去处理 ("/*"为这个项目

浅谈Struts2

计应134(实验班) 张人川 一.Struts2的优点: 在软件设计上Struts2没有像Struts1那样和Servlet AP紧密的耦合.Strus2设计属于无侵入设计. Struts2提供了拦截器,利用拦截器可以进行AOP编程,实现如权限拦截等功能. Struts2提供了类型转换器,我们可以吧特殊的请求参数转换成需要的类型. Struts2提供支持多种表现层技术,如JSP,freeMarker,Velocity Struts2的输入校验可以对指定方法进行校验 提供了全局范围,包范围和Act

浅谈Struts2的拦截器

拦截器:       在谈拦截器之前,我觉得有必要提一下和过滤器的区别.     1. 首先拦截器是Struts2自己的,只有用了Struts2框架才可以使用拦截器,而过滤器是servlet规范中的一部分,任何java web工程都可以使用: 2. 其次拦截器只可以拦截Action,而过滤器理论上可以拦截任何东西(jsp,html,css,image或者js等). 拦截器配置(在Struts2.xml中进行): 1 <package name="default" extends=

浅谈Struts2(三)

一.Struts2收集client的参数 核心思路: <form method="post" action="XXXX"> <input type="text" name="username"/> <input type="text" name="password"/> <input type="text" name=&quo

浅谈struts2的国际化----i18n

可能大家在使用struts框架的时候,偶尔会看到这个词: i18n.也就是 Internationalization    i 开头,n 结尾, 总共18个字母,今天的主要内容就是围绕这 四个字母. struts2国际化是建立在 java 国际化的基础上的,通过提供不同国家.语言环境的消息资源,然后通过 ResourceBundle 加载指定Locale 对应的资源文件,取得文件中指定的 key 对应的信息. Locale 对象表示了特定的地理.政治和文化地区.需要 Locale 来执行其任务的

浅谈Struts2拦截器的原理与实现

拦截器与过滤器           拦截器是对调用的Action起作用,它提供了一种机制可以使开发者定义在一个action执行的前后执行的代码,也可以在一个action执行前阻止其执行.同时也是提供了一种可以提取action中可重用的部分的方式,很多业务逻辑都是靠拦截实现的,比如校验,验证登录权限(比如下载时跳转到登陆页面)等等.     过滤器是对整个的请求过程起作用!换句话说就是拦截器没有过滤器的范围广.过滤器是在java web中,你传入的request,response提前过滤掉一些信息