1.struts1和struts2 是2个完全不同的框架

  其实struts2核心就是 webwork框架   struts1以ActionServlet作为核心控制器,由ActionServlet负责拦截用户的所有请求。Struts 1框架有3个重要组成部分:Action、ActionForm和ActionForward对象。ActionForm必须实现ActionForm的基类,设计上并不是真正的POJO。   struts2核心控制器是FilterDispatcher,Struts 2用于处理用户请求的Action实例,并不是用户实现的业务控制器,而是Action代理——因为用户实现的业务控制器并没有与Servlet API耦合,显然无法处理用户请求。而Struts 2框架提供了系列拦截器,该系列拦截器负责将HttpServletRequest请求中的请求参数解析出来,传入到Action中,并回调Action的execute方法来处理用户请求。显然,上面的处理过程是典型的AOP(面向切面编程)处理方式。

2.先说一下struts2的工作流程:

  核心控制器FilterDispatcher是Struts 2框架的基础,包含了框架内部的控制流程和处理机制。 
  业务控制器Action和业务逻辑组件是需要用户来自己实现的。用户在开发Action和业务逻辑组件的同时,还需要编写相关的配置文件,供核心控制器FilterDispatcher来使用。 
  Struts 2的工作流程相对于Struts 1要简单,与WebWork框架基本相同,所以说Struts 2是WebWork的升级版本。Struts 2框架按照模块来划分,可以分为Servlet Filters、Struts核心模块、拦截器和用户实现部分。
  Struts 2框架结构图如下:
  

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

1、客户端初始化一个指向Servlet容器(例如Tomcat)的请求,如上文在浏览器中输入 http://localhost:8080/bookcode/ch2/Reg.action就是提交一个(HttpServletRequest)请求。

2、这个请求经过一系列的过滤器(Filter)(这些过滤器中有一个叫做ActionContextCleanUp的可选过滤器,这个过滤器对于Struts2和其他框架的集成很有帮助,例如:SiteMesh Plugin);注意:这里是有顺序的,先ActionContextCleanUp,再其他过滤器(Othter Filters、SiteMesh等),最后到FilterDispatcher。 FilterDispatcher是控制器的核心,就是MVC的Struts 2实现中控制层(Controller)的核心。

3、接着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中的配置找到对应的返回结果。返回结果通常是(但不总是,也可能是另外的一个Action链)一个需要被表示的JSP或者FreeMarker的模版。在表示的过程中可以使用Struts2框架中继承的标签。在这个过程中需要涉及到ActionMapper。

3.说完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一起使用。http://www.linuxso.com/architecture/7694.html

十.执行流程 a)struts1  jsp发起httprequest请求->servlet捕获->struts.xml->namespace+ActionName-> Action->填充表单setXxx()->action.execute()->”success”->Result->设置request属性->跳转目标页

b) Action(jsp发起httprequest请求,被过滤器捕获)->FilterDispatcher->struts.xml->namespace+ActionName->new Action->填充表单setXxx()->action.execute()->”success”->Result->设置request属性->跳转目标页

struts1和struts2原理解析的更多相关文章

  1. 面试问到struts1与struts2的解析对比

    一.struts1要继承一个抽象类.struts1是类编程而不是接口编程. struts2的action可以实现一个action接口,也可以实现其他的接口,使其成为可选的定制的服务. 二.struts ...

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

    浅析Struts1和Struts2的Action线程安全问题  转 http://blog.csdn.net/virgoboy2004/article/details/5876133 [问题描述]最近 ...

  3. Struts2 原理

    .Struts2原理 .Struts 1 原理 .Struts1 和webwork的关系 .HttpServletRequest Struts2原理

  4. struts1与struts2的区别

    Struts2其实并不是一个陌生的Web框架,Struts2是以Webwork的设计思想为核心,吸收了Struts1的优点,因此,可以认为Struts2是Struts1和Webwork结合的产物. 简 ...

  5. Struts1、Struts2和SpringMVC剖析【转载】

    前段框架用了不少,今天就来做个总结.网上关于Struts1.Struts2.SpringMVC的文章有很多,这里的内容就是基于它们,来做个比较. 这三个框架是按照上面的顺序,依次出现的,它们都是对MV ...

  6. struts1和struts2和springMVC的区别和介绍

    MVC是web开发常用的模式,M即模型层(Model):主要由javabean来实现.V即视图层(View):主要由jsp.velocity.freemarker等.C即控制层(Controller) ...

  7. Struts1与Struts2的那些事

    一.概述 Struts1以ActionServlet作为核心控制器,由ActionServlet负责拦截用户的全部请求.Struts1框架有3个重要组成部分:Action.ActionForm和Act ...

  8. Struts在Web.xml中的配置及Struts1和Struts2的区别

    (1)配置Struts的ActionServlet     <servlet>元素来声明ActionServlet    <servlet-name>元素:用来定义Servle ...

  9. Struts2 原理(转载)

    图来源于Struts2官方站点,是Struts 2 的整体结构. Struts2框架由3个部分组成:核心控制器FilterDispatcher.业务控制器和用户实现的业务逻辑组件.在这3个部分里,St ...

随机推荐

  1. MySQL-5.7 创建及查看触发器

    触发器的作用是当表上有对应SQL语句发生时,则触发执行. 1.语法 CREATE [DEFINER = { user | CURRENT_USER }] TRIGGER trigger_name tr ...

  2. knudson hypothesis 二次突变假说

    二次突变假说是由诺丁在1953年提出的,他发现似乎随着年龄的增长,患有癌症的概率有上升.对这种现象有一种解释,即癌症的发生需要多个突变的累积. 克努森在1971通过研究正式地提出该观点.他对具有遗传性 ...

  3. 2018-2019-2 20165114《网络对抗技术》Exp4 恶意代码分析

    Exp4 恶意代码分析 目录 一.实验目标 (1)监控你自己系统的运行状态,看有没有可疑的程序在运行. (2)分析一个恶意软件,就分析Exp2或Exp3中生成后门软件:分析工具尽量使用原生指令或sys ...

  4. xshell 常用命令

    一.grep 命令 (1)命令格式 grep [选项] pattern [file] (2)常用参数 参数 描述 -c 计算找到 '搜寻字符串'(即 pattern) 的次数 -i 忽略大小写的不同, ...

  5. maven项目在eclipse的library中没有Maven Dependencies

    今天使用maven创建了一个多模块的项目,在分别创建完父项目和各个子模块后,编译父项目的时候,父项目工程目录上出现了一堆红叉叉,点进去一看,是找不到依赖的类,但是pom文件中相应jar的depende ...

  6. 1044: [HAOI2008]木棍分割

    1044: [HAOI2008]木棍分割 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 2161  Solved: 779[Submit][Statu ...

  7. HDU 1263 二维map

    题意:给出一份水果的交易表,根据地区统计出水果的交易情况.   思路:二维map使用.   #include<cstdio> #include<string> #include ...

  8. SSL证书是“盾牌“还是”鸡肋“?

    德国联邦安全与IT办公室(BSI,职能相当于美国的国家安全与信息技术局)近日发布公告警告:网络攻击者冒充其发布了“关于Meltdown与Spectre攻击信息”的垃圾邮件,该邮件中包含指向修复补丁的页 ...

  9. Spring Boot 热部署的实现 - 原创

    实现方式有两大种(其中包含3种): 一.基于springloaded 1.1)Maven启动方式 第一步:在pom.xml中的“plugin节点”里面添加如下依赖: <dependencies& ...

  10. sklearn学习笔记之开始

    简介   自2007年发布以来,scikit-learn已经成为Python重要的机器学习库了.scikit-learn简称sklearn,支持包括分类.回归.降维和聚类四大机器学习算法.还包含了特征 ...