`

struts1 和struts2 关联和区别

 
阅读更多
先说一下struts2的工作流程:

核心控制器FilterDispatcher是Struts 2框架的基础,包含了框架内部的控制流程和处理机制。

业务控制器Action和业务逻辑组件是需要用户来自己实现的。用户在开发Action和业务逻辑组件

的同时,还需要编写相关的配置文件,供核心控制器FilterDispatcher来使用。



Struts 2的工作流程相对于Struts 1要简单,与WebWork框架基本相同,所以说Struts 2是

WebWork的升级版本。Struts 2框架按照模块来划分,可以分为Servlet Filters、Struts核心模

块、拦截器和用户实现部分。Struts 2框架结构图如图3.1所示。

一个请求在Struts 2框架中的处理大概分为以下几个步骤。







客户端提交一个(HttpServletRequest)请求,如上文在浏览器中输入 http://localhost:
 

8080/bookcode/ch2/Reg.action就是提交一个(HttpServletRequest)请求。





请求被提交到一系列(主要是3层)的过滤器(Filter),如(ActionContextCleanUp、其他过

滤器(SiteMesh等)、 FilterDispatcher)。注意:这里是有顺序的,先ActionContext 

CleanUp,再其他过滤器(Othter Filters、SiteMesh等),最后到FilterDispatcher。

FilterDispatcher是控制器的核心,就是MVC的Struts 2实现中控制层(Controller)的核心。

FilterDispatcher询问ActionMapper是否需要调用某个Action来处理这个(HttpServlet 

Request)请求,如果ActionMapper决定需要调用某个Action,FilterDispatcher则把请求的处

理交给ActionProxy。

ActionProxy通过Configuration Manager(struts.xml)询问框架的配置文件,找到需要调用的

Action类。例如,用户注册示例将找到UserReg类。

ActionProxy创建一个ActionInvocation实例,同时ActionInvocation通过代理模式调用Action

。但在调用之前,ActionInvocation会根据配置加载Action相关的所有Interceptor(拦截器)



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

result。





说完struts2还应该说一下struts1的工作原理:

 由ActionForm和JavaBean组成,其中ActionForm用于封装用户的请求参数,封装成ActionForm

对象,该对象被ActionServlet转发给Action,Action根据ActionFrom里面的请求参数处理用户

的请求。把我看到的和知道的整理出来。

对于采用Struts框架的Web应用,在Web应用启动时就会加载并初始化ActionServlet,ActionServlet从struts-config.xml文件中读取配置信息,把它们存放到各种配置对象中,例如Action的映射信息存放在ActionMapping对象中。(struts的配置文件struts-config.xml:一个用户请求是通过ActionServlet来处理和转发的。那么,ActionServlet如何决定把用户请求转发给哪个Action对象呢?这就需要一些描述用户请求路径和Action映射关系的配置信息了。在Struts中,这些配置映射信息都存放在特定的XML文件struts-config.xml中。在该配置文件中,每一个Action的映射信息都通过一个元素来配置。这些配置信息在系统启动的时候被读入内存,供Struts在运行期间使用。在内存中,每一个元素都对应一个org.apache.struts.aciton.ActionMapping的实例)

/**********************

用户通过客户端向服务器发出一个请求,而我们已经在web.xml配置了所有符合某某格式的请求都将由指定的Servlet来处理。比如说:只要是以.do结尾的请求(*.do)都由org.apache.struts.action.ActionServlet来对其进行处理。而ActionServlet和ActionMapping都已经在服务器启动的时候被加载到内存里面。

结合登录例子:

当用户登录时,地址栏的URL为:http://localhost:8080/struts_login/login.do


ActionServlet会拿到用户的请求,并且去分析这个URL,它会截下/login(不包含.do)这一部分,截来之后,它的目的是为了去struts-config.xml这个配置文件里面找标签path属性的值等于所截部分的那个Action。找到之后,ActionServlet会把表单提交的数据给存放到ActionForm上,那ActionServlet又是怎么找到ActionForm的呢?因为Action标签里面有一个属性是name,它的值就是所要找的ActionForm的名字,这样ActionServlet会去上面的标签里面找(注意不是)标签里面的name属性的值是与Action标签里面的name的值相等的,然后根据里面type属性的值,也就是所指的对象new一个实例,再把表单上相应的数据set进去。同时把标签里面的东西放到继承Action类的那个指定类(本例子用的是LoginAction)的public ActionForward execute(ActionMapping mapping, ActionForm form,

HttpServletRequest request, HttpServletResponse response)

throws Exception

这个方法里面参数mapping里面去,放好之后,再去调用我们自己写的类(LoginAction),并把mapping,form,request,response作为参数传到execute方法里面去。

至于如何转向的问题:这是由Struts完成的,只要你的execute能返回一个ActionForward对象,并且里面包含有转向的信息,Struts就会根据参数(mapping.findForward("success")里面的"success")去找相应配置文件(struts-config.xml)里面的相应标签(),然后再由Struts框架决定转向谁。由于上面已经说过,整个转向的相关信息已经存放在mapping里面,所以mapping.findForward("success")能够找到相应的标签。

*/--这部是我自己增加的,其余都是出自《精通Struts基于MVC的Java.Web设计与开发》

当ActionServlet接收到一个客户请求时,将执行如下流程:

(1) 检索和用户请求匹配的ActionMapping实例,如果不存在,就返回用户请求路径无效的信息。

(2) 如果ActionForm实例不存在,就创建一个ActionForm对象,把客户提交的表单数据保存到ActionForm对象中。

(3) 根据配置信息决定是否需要表单验证。如果需要验证,就调用ActionForm的validate()方法。

(4) 如果ActionForm的validate()方法返回null返回一个不包含ActionMessage的ActionErrors对象,就表示表单验证成功。

(5) ActionServlet根据ActionMapping实例包含的映射信息决定将请求转发给哪个Action。如果相应的Action实例不存在,就先创建这个实例,然后调用Action的execute()方法。

(6) Action的execute()方法返回一个ActionForward对象,ActionServlet再把客户请求转发给ActionForward对象指向的JSP组件。

(7) ActionForward对象指向的JSP组件生成动态网页,返回给客户。

对于以上流程的流程(4),如果ActionForm的validate()方法返回一个包含一个或多个ActionMessage的ActionErrors对象,就表示表单验证失败,此时ActionServlet将直接把请求转发给包含用户提交表单的JSP组件。在这种情况下,不会再创建Action对象并调用Action的execute()方法。





最后旧的谈一谈struts1与struts2的区别了:

首先:struts1是通过servlet启动的。

一、struts1要求Action类继承一个抽象基类,而不是接口。

    struts2的action类可以实现一个action接口,也可以实现其他接口。



二、sturts1 action是单例模式,线程是不安全的。

    struts2 action线程是安全的,action为每一个请求都生成了一个实例。

   

三、sturts1过去依赖serlet API,不容易测试。

    struts2不依赖于容器,允许Action脱离容器单独被测试。

   

四、Struts1 使用ActionForm对象捕获输入。所有的ActionForm必须继承一个基类。

    Struts 2直接使用Action属性作为输入属性,消除了对第二个输入对象的需求。

   

五、Struts1 整合了JSTL,因此使用JSTL EL。这种EL有基本对象图遍历,但是对集合和索引属性的支持很弱。

      Struts2可以使用JSTL,但是也支持一个更强大和灵活的表达式语言--"Object Graph Notation Language"  (OGNL).



六、Struts 1使用标准JSP机制把对象绑定到页面中来访问。

    Struts 2 使用 "ValueStack"技术,使taglib能够访问值而不需要把你的页面(view)和对象绑定起来。



七、Struts 1 ActionForm 属性通常都是String类型。Struts1使用Commons-Beanutils进行类型转换。

    Struts2 使用OGNL进行类型转换。提供基本和常用对象的转换器。

   

八、Struts 1支持在ActionForm的validate方法中手动校验,或者通过Commons Validator的扩展来校验。

    Struts2支持通过validate方法和XWork校验框架来进行校验。

   

九、Struts1支持每一个模块有单独的Request Processors(生命周期),但是模块中的所有Action必须共享相同的生命周期。

    Struts2支持通过拦截器堆栈(Interceptor Stacks)为每一个Action创建不同的生命周期。堆栈能够根据需要和不同的Action一起使用。
分享到:
评论

相关推荐

    Struts1和Struts2区别

    下面我们将深入探讨Struts1和Struts2的区别。 1. 设计模式: - **Struts1**:基于Front Controller模式,只有一个Servlet(ActionServlet)处理所有请求。它使用Plug-In和Dispatcher机制来实现业务逻辑和视图的...

    struts2.1.8 struts2源码 Eclipse关联这个可以

    1. **Struts2的核心概念** - **Action**: Action是业务逻辑的载体,负责处理用户请求并返回结果。在Struts2中,Action可以通过实现`com.opensymphony.xwork2.Action`接口或继承`org.struts2.interceptor栈...

    struts1和struts2获取相对路径的方法

    Struts1和Struts2分别是该框架的两个不同版本,它们在处理相对路径的方式上有所不同。本文将详细讲解在Struts1和Struts2中如何获取相对路径。 ### Struts1 获取相对路径的方法 在Struts1中,我们通常会用到`...

    struts1和struts2的增删改查

    Struts1和Struts2是两个非常著名的Java Web框架,它们在开发企业级应用程序时用于实现MVC(Model-View-Controller)设计模式。增删改查(CRUD:Create, Read, Update, Delete)是任何数据管理应用的基础操作,这两款...

    struts1与struts2的区别

    Struts1和Struts2是两个非常著名的Java Web框架,它们在处理MVC(Model-View-Controller)架构方面有着显著的区别。以下是关于这两个框架差异的详细解释: 1. **Action类**: - **Struts1**:要求Action类继承自一...

    struts2简单例子

    这个“struts2简单例子”是初学者理解Struts2工作原理和核心概念的一个很好的起点。让我们深入探讨一下Struts2的基础知识。 1. **MVC架构**: MVC模式是软件设计中的一个经典模式,它将应用逻辑分为三个主要部分:...

    Struts1+Spring2+Hibernate2整合详细例子

    Struts1、Spring2和Hibernate2是Java Web开发中的三个重要框架,它们分别负责MVC模式中的表现层、业务层和服务层。这个整合例子旨在展示如何将这三个框架协同工作,以构建一个完整的Java Web应用程序。 Struts1是...

    Struts2框架及注释和用法

    Struts2中的模型驱动模式允许将Action与业务对象直接关联,使得Action可以直接操作这些对象。值栈是Struts2中的一种数据管理机制,它存储Action、结果和其他对象,方便在Action之间共享数据。 **5.拦截器...

    struts1和struts2源代码详解

    本篇将深入探讨Struts1和Struts2的源代码,揭示其内部工作原理及核心组件。 **一、Struts1详解** 1. **架构概述**:Struts1基于Servlet API,通过FilterDispatcher拦截请求,将控制权交给ActionServlet。Action...

    struts2.3.1源代码 直接可以关联到eclipse

    在Eclipse中关联Struts2的源代码,可以让开发者在遇到问题时快速定位到源码中查看具体的实现,提高开发效率。以下是如何在Eclipse中关联Struts2.3.1源代码的步骤: 1. **导入源码**:首先,你需要将解压后的"src...

    STRUTS2站点,STRUTS2学习实例8

    Struts2是一个强大的Java web应用程序框架,用于构建和维护可扩展、易于维护的Web应用程序。这个"STRUTS2学习实例8"显然旨在深化对Struts2的理解和应用,通过具体的实战项目来教学。让我们深入探讨一下Struts2的关键...

    struts1和struts2的比较

    Struts1和Struts2是两个非常著名的Java Web框架,它们在处理MVC(Model-View-Controller)架构方面有着不同的设计和实现。以下是对两者关键特性的详细比较: 1. **Action类**: - **Struts1**:Action类需要继承自...

    马士兵Struts2笔记2013

    1. **建立Struts2工程** 创建一个Struts2工程通常涉及在集成开发环境中(如MyEclipse)创建一个新的Web项目,然后将必要的Struts2库添加到项目的`lib`目录,并配置`web.xml`以启用Struts2 Filter。 2. **Action的...

    张龙圣思园struts2学习笔记word

    总的来说,张龙圣思园的Struts2学习笔记是全面了解和掌握Struts2框架的宝贵资源,无论你是初学者还是有经验的开发者,都能从中受益。它会帮助你深入理解Struts2的工作原理,掌握其核心特性和最佳实践,从而提升你的...

    struts2标签使用例子

    1. **Struts2核心标签库**: - `s:textfield`:用于创建输入字段,与Action中的属性绑定。 - `s:textarea`:生成多行文本输入框。 - `s:checkbox` 和 `s:radio`:用于创建复选框和单选按钮。 - `s:submit`:创建...

    struts2文件上传下载源代码

    1. **配置Struts2 Action**:在`struts.xml`配置文件中,你需要定义一个Action,该Action负责处理文件上传请求。Action的类需要继承自`ActionSupport`,并覆盖`execute()`方法,以便处理上传的文件。 2. **设置...

    基于Struts2和Hibernate的简单学生选课系统

    **基于Struts2和Hibernate的学生选课系统** 这个项目是一个简化的在线选课系统,它主要涉及了三个关键角色:管理员、学生和教师,并涵盖了课程内容的管理。系统利用了Struts2作为前端MVC框架,以及Hibernate作为...

Global site tag (gtag.js) - Google Analytics