Struts的前世今身

1.Struts1的运行原理

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

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

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

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

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

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

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

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

2.Struts2的基本原理

a. 客户端初始化一个指向Servlet容器(例如Tomcat)的请求 
b. 这个请求经过一系列的过滤器(Filter)(这些过滤器中有一个叫做ActionContextCleanUp的可选过滤器,这个过滤器对于Struts2和其他框架的集成很有帮助,例如:SiteMesh Plugin) 
c. 接着FilterDispatcher被调用,FilterDispatcher询问ActionMapper来决定这个请是否需要调用某个Action 
d. 如果ActionMapper决定需要调用某个Action,FilterDispatcher把请求的处理交给ActionProxy 
e. ActionProxy通过Configuration Manager询问框架的配置文件,找到需要调用的Action类 
f.ActionProxy创建一个ActionInvocation的实例。 并通过IoC方式,将值注入给Aciton.

g.ActionInvocation实例使用命名模式来调用,在调用Action的过程前后,涉及到相关拦截器(Intercepter)的调用。 
h 一旦Action执行完毕,ActionInvocation负责根据struts.xml中的配置找到对应的返回结果。返回结果通常是(但不总是,也可 能是另外的一个Action链)一个需要被表示的JSP或者FreeMarker的模版。在表示的过程中可以使用Struts2 框架中继承的标签。在这个过程中需要涉及到ActionMapper

3.Struts1与Struts2的区别

Action:Struts1要求Action类继承一个抽象基类,Struts 2 Action类可以实现一个Action接口,也可实现其他接口,使可选和定制的服务成为可能。

线程模式:Struts1 Action是单例模式并且必须是线程安全的,因为仅有Action的一个实例来处理所有的请求;Struts2 Action对象为每一个请求产生一个实例,因此没有线程安全问题。

Servlet 依赖:Struts1 Action 依赖于Servlet API ,因为当一个Action被调用时HttpServletRequest 和 HttpServletResponse 被传递给execute方法。Struts 2 Action不依赖于容器,允许Action脱离容器单独被测试。如果需要,Struts2 Action仍然可以访问初始的request和response。

可测性:测试Struts1 Action的一个主要问题是execute方法暴露了servlet API(这使得测试要依赖于容器);Struts 2 Action可以通过初始化、设置属性、调用方法来测试。

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

表达式语言:Struts1 整合了JSTL,因此使用JSTL EL。这种EL有基本对象图遍历,但是对集合和索引属性的支持很弱;Struts2可以使用JSTL,但是也支持一个更强大和灵活的表达式语言--"Object Graph Notation Language" (OGNL)。

绑定值到页面(view):Struts 1使用标准JSP机制把对象绑定到页面中来访问;Struts 2 使用 "ValueStack"技术,使taglib能够访问值而不需要把你的页面(view)和对象绑定起来。ValueStack策略允许通过一系列名称相同但类型不同的属性重用页面(view)。

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

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

Action执行的控制:Struts1支持每一个模块有单独的Request Processors(生命周期),但是模块中的所有Action必须共享相同的生命周期。Struts2支持通过拦截器堆栈(Interceptor Stacks)为每一个Action创建不同的生命周期。堆栈能够根据需要和不同的Action一起使用。

时间: 2024-08-08 02:35:49

Struts的前世今身的相关文章

Java基础概叙

写在开头 我没有很牛逼的技术来概括Java的前世今身,这里主要是结合自己对Java的基础的理解,大致给到一些总结. 结合自己最近读的一些书籍,总结下,正如这句话所说:Read a bit and take it out,then come back read some more. 正文 1. Java语言支持4种类型:Interface.class.array.primitive 前三种通常称为引用类型,class实例.array是对象(Object),而primitive的值则不是Object

Openstatck第一天——初识openstatck

一. 什么是openstatck? OpenStack是一个由NASA(美国国家航空航天局)和Rackspace合作研发并发起的,以Apache许可证授权的自由软件和开放源代码项目. 二.openstatck前世今身 openstatck是一个跟Eucalyptus,AWS(Amazon web Service)类似的IaaS框 openst最有由美国国家航空航天局NASA研发的Nova和Rackspace研发swift组成.后来以Apache许可授权,指在为公共及私有云平台建设.opensta

Python学习目录

2.1 Python介绍2.1.1 编程语言对比2.1.2 Python的前世今身2.1.3 Python分类2.2 编程基础2.2.1 字节码和机器码2.2.2 堆和栈2.2.3 Python解释器原理2.2.4 字符编码2.2.5 进制转换2.3 Python基础语法2.3.1 Python编码规范2.3.2 变量和赋值2.3.3 获取输入2.4 流程控制2.4.1 if--else--2.4.2 if--elif--else--2.5 常用数据类型 2.1 Python介绍 2.1.1 编

1DAY 初识Python

一 本节目标 了解编程语言 了解python及与其他语言的优劣对比 安装python解释器及环境变量配置.运行python交互式环境 打印hello world程序 初识变量.用户输入,流程控制,while循环 二 了解编程语言 2.1 为什么要编程? 解放人力:让机器(比如计算机)按照人们事先为其编写好的程序自发地去工作 2.2 什么是编程语言? 人----------->汉语--------------->中国人                    八格牙路----------->

重磅干货!揭秘波士顿动力背后的专利技术

[导读]本文从波士顿动力背后申请的专利入手,从动力系统.步态分析,详细探讨了波士顿动力机器人背后的技术实现. 波士顿动力四足机器人的发展历程(前世今身) 相比于轮式或履带机器人,波士顿足式机器人具有更强的地形适应能力,身体十分灵活,可以在各种崎岖不平的地面行走. 奔跑性能极强的Wildcat 平衡力极强的Spot 欢乐起舞的新版SpotMini 经过一年年的技术迭代,波士顿动力的四足机器人不再仅仅是应对军方的大狗机器人,而越来越变得小巧灵活,适应力极强. 为了探索其背后的技术路线,我们对波士顿动

Go中使用seed得到相同随机数的问题

1. 重复的随机数 废话不多说,首先我们来看使用seed的一个很神奇的现象. func main() { for i := 0; i < 5; i++ { rand.Seed(time.Now().Unix()) fmt.Println(rand.Intn(100)) } } // 结果如下 // 90 // 90 // 90 // 90 // 90 可能不熟悉seed用法的看到这里会很疑惑,我不是都用了seed吗?为何我随机出来的数字都是一样的?不应该每次都不一样吗? 可能会有人说是你数据的样

两分钟让你明白Go中如何继承

最近在重构代码的时候,抽象了大量的接口.也使用这些抽象的接口做了很多伪继承的操作,极大的减少了代码冗余,同时也增加了代码的可读性. 然后随便搜了一下关于Go继承的文章,发现有的文章的代码量过多,并且代码format极其粗糙,命名极其随意,类似于A.B这种,让人看着看着就忘了到底是谁继承谁,我又要回去看一遍逻辑. 虽然只是样例代码,我认为仍然需要做到简洁.清晰以及明了.这也是我为什么要写这篇博客的原因.接下里在这里简单分享一下在Go中如何实现继承. 1. 简单的组合 说到继承我们都知道,在Go中没

WEB前端演化

VUE前世今身 vue的作者尤雨溪(Evan You),无锡人,复旦附中,本科毕业于Colgate University,后在Parsons设计学院获得Design & Technology艺术硕士学位,现任职于纽约Google Creative Lab.同时还加盟阿里巴巴Weex团队,作为技术顾问.2015年的时候花了两天时间,打造了一个HTML5版的Clear.再某群讨论的时候,说vue是他2014年的时候花了三天时间搭的框架.现在经过版本迭代官方现在2.x版本了.vue-cli已经到3.0

struts(IDEA)的应用

目标 任务,完成以上功能. 第一步:模拟组长建project 1.建立一个空白工程(里面是没有文件的) 2.到此,我们见到新建的工程,目录里面没有其他文件,只有.idea目录 (这个是相关配置信息,可以不管它) 3.点击托管项目到码云 4. 输入账号和密码 注意:这里是直接创建远程仓库(在码云的服务器创建,不是本地) 作用:把本地的代码,统统托管到服务器上 5. 提示提交文件,但是没有文件可以提交,因为本项目本来就是空. 6.右下角,提示创建仓库成功. 同时,仓库里面,什么代码代码都没有 8.按