要说Struts1的工作流程。就必需要说一下Model1和Model2了。由于这个框架是踏着他们的尸骨一步一步的发展起来的。

Model1开发模式,想想我们刚刚開始接触Java的时候,我们用的就是这样的模式了,一个jsp页面+处理业务逻辑JavaBean+负责处理数据的DaoBean。更有甚者,你能够在这里直接连接数据库获取数据。非常简单,非常好理解,开发起来速度足够快。没有繁琐的转换。非常easy上手,所以说要做一个小项目,使用Model1这样的开发模式,还是非常不错的选择。可是我们想象一下,假设说Jsp页面。纪要负责显示,还要负责业务逻辑,那么假设我们想更换一下的话,可想而知。我们要做的工作。将会是非常大的。另一个问题就是程序逻辑开发与页面设计纠缠在一起,既不便于分工合作也不利于代码的重用。这样的程序其健壮性和可伸缩性都不好。

Model 2引入了"控制器"这个概念,控制器一般由Servlet来担任,client的请求不再直接送给一个处理业务逻辑的JSP页面。而是送给这个控制器,再由控制器依据详细的请求调用不同的事务逻辑,并将处理结果返回到合适的页面。

因此,这个servlet控制器为应用程序提供了一个进行前-后端处理的中枢。

一方面为输入数据的验证、身份认证、日志及实现国际化编程提供了一个合适的切入点。还有一方面也提供了将业务逻辑从JSP文件剥离的可能。

业务逻辑从JSP页面分离后。JSP文件蜕变成一个单纯完毕显示任务的东西。这就是常说的View。而独立出来的事务逻辑变成人们常说的Model,再加上控制器Control本身,就构成了MVC模式。实践证明,MVC模式为大型程序的开发及维护提供了巨大的便利。

而Struts1能够说是Model2的一个增强版,来自客户的全部须要通过框架的请求。统一由ActionServlet接收(ActionServlet Struts已经为我们写好了。仅仅要您应用没有什么特别的要求,它基本上都能满足您的要求),依据接收的请求參数和Struts配置(struts-config.xml)中ActionMapping,将请求送给合适的Action去处理。解决由谁做的问题,它们共同构成Struts的控制器。 Action则是Struts应用中真正干活的组件。它解决的是做什么的问题,它通过调用须要的业务组件(模型)来完毕应用的业务,业务组件解决的是怎样做的问题。并将运行的结果返回一个代表所需的描绘响应的JSP(或Action)的ActionForward对象给ActionServlet以将响应呈现给客户。

这里要特别说明一下的是:就是Action这个类,它不应该包括过多的业务逻辑。而应该仅仅是简单地收集业务方法所须要的数据并传递给业务对象。实际上,它的主要职责是: 校验前提条件或者声明 调用须要的业务逻辑方法 检測或处理其它错误 路由控制到相关视图 。

我们来看一下Struts1的工作时的流程原理图!

相信通过看着一张图,加上前边的描写叙述,我们都能够非常清楚的了解了Struts1的工作流程及其执行机理!然后在跟大家说几点要注意的

ActionServlet是通过process()方法来处理所有逻辑的。

Aaction配置信息并非所有载入,而是找与截取的url相应的action配置信息,载入到ActionMapping中,也就是一个action相应一个ActionMapping。

ActionForm也并非每次都反射,而是会先推断一下request或者session中是否已经创建。假设没有。则创建一次。并保存在request或者session中。

Action处理类相同是先检查是否已经创建过。然后在操作。

并且struts1中的Action创建过程存在线程安全问题。

ActionServlet依据Action返回的ActionForward,调用processForwardConfig,进行页面导航。

深入了解Struts1的执行机理的更多相关文章

  1. Android之键盘监听的执行机理【看清键盘监听的本质】【入门版】

    以EditText为例: 1.Activity本身也有按键监听 editText按键监听与Activity按键监听关系: Activity本身也有按键监听 并且分按下和松开两个事件监听 editTex ...

  2. Struts1的基础知识

    struts1.0的配置 在web.xml文件中的配置 <servlet> <!--配置ActionServlet类,一启动就创建该类对象--> <servlet-nam ...

  3. javascript预编译和执行过程总结

    javascript相对于其它语言来说是一种弱类型的语言,在其它如java语言中,程序的执行需要有编译的阶段,而在javascript中也有类似的“预编译阶段”(javascript的预编译是以代码块 ...

  4. sizeof、strlen、字符串、数组,整到一块,你还清楚吗?

    写在前面 sizeof.strlen.字符串.数组,提到这些概念,相信学过C语言的人都能耳熟能详,也能谈得头头是道,但是,在实际运用中,当这些内容交织在一起时,大家却不一定能搞地清清楚楚,本文的目的正 ...

  5. struts 拦截器 Interceptor

         拦截器是AOP中的概念,它本身是一段代码,可以通过定义“织入点”,来指定拦截器的代码在“织入点”的前后执行,从而起到拦截的作用.正如上面 Struts2的Reference中讲述的,Stru ...

  6. hibernate中持久化对象的生命周期(三态:自由态,持久态,游离态 之间的转换)

    三态的基本概念: 1,  暂时状态(Transient):也叫自由态,仅仅存在于内存中,而在数据库中没有对应数据.用new创建的对象,它没有持久化,没有处于Session中,处于此状态的对象叫暂时对象 ...

  7. hibernate在持久对象的生命周期(三州:自由状态,持久状态,自由状态 之间的转换)

    三种状态的基本概念: 1.  临时身份(Transient):也被称为自由状态,它只存在于内存中,并且在数据库中没有相应的数据. 使用new创建的对象,久化,没有处于Session中,处于此状态的对象 ...

  8. 进程,线程,GIL,Python多线程,生产者消费者模型都是什么鬼

    1. 操作系统基本知识,进程,线程 CPU是计算机的核心,承担了所有的计算任务: 操作系统是计算机的管理者,它负责任务的调度.资源的分配和管理,统领整个计算机硬件:那么操作系统是如何进行任务调度的呢? ...

  9. LEAPMOTION开发UI专题(1)

    非常 抱歉的是,之前说的LEAP/UI框架设计可能仅仅有两篇 由于个人时间实在是不同意 这个问题假设展开去写的话 那么说写本书都是不为过的 且由于内容改动非常是杂乱 所以我第一篇文章用来介绍LEAP预 ...

随机推荐

  1. java根据开始时间结束时间计算中间间隔日期

    public static void main(String[] args) throws Exception { String beginDate = "2016-07-16"; ...

  2. Python基础教程笔记 第一章

    /  表示整除,当导入_future_模块中的version时,/ 表示正常的的除法, 此时可用//表示整除,不论数字是整型还是浮点型,都可以用//表示整除. ** 表示幂次方  例如 2**3    ...

  3. 【09】react 之 表单组件

    不太清楚有多少初学React的同学和博主当时一样,在看完React的生命周期.数据流之后觉得已经上手了,甩开文档啪啪啪的开始敲了起来.结果...居然被一个input标签给教做人了. 故事是这样的:首先 ...

  4. 【03】Vue 之列表渲染及条件渲染

    3.1. 条件渲染 有时候我们要根据数据的情况,决定标签是否进行显示或者有其他动作.最常见的就是,表格渲染的时候,如果表格没有数据,就显示无数据.如果有数据就显示表格数据. Vue帮我们提供了一个v- ...

  5. 水晶报表 IE设置

    水晶报表:Crystal Reports(水晶报表)是一款商务智能(BI)软件,主要用于设计及产生报表.水晶报表是业内最专业.功能最强的报表系统,它除了强大的报表功能外,最大的优势是实现了与绝大多数流 ...

  6. this关键字、this()、super()

    对于下面的代码怎么区分是哪个对象调用当前方法: Class Banana { void peel(int i); } publci Class BananaPeel { public static v ...

  7. AC日记——[Sdoi2010]星际竞速 bzoj 1927

    1927 思路: 连边,拆点: 每个点拆成i,i+n,都向t连边: i到t表示高速模式,i+n到t表示跳跃模式: 然后读入路径,如果u>v,则交换u,v: u向v+n连边: spfa跑最小费用: ...

  8. 用Wireshark分析Socket连接建立的过程

    0. 安装Wireshark,但是默认情况下,Wireshark无法捕获127.0.0.1的报文 解决方案:安装npcap,替换默认的winpacp,重新启动Wireshark,就可以看到一个名字中含 ...

  9. VS如何反汇编

    1. 打开反汇编窗口:调试模式下,按Ctrl+F11.2. 术语: 2.1 ESP(Extended Stack Pointer): 堆栈指针,寄存器存放当前线程的栈顶指针: i.e: move eb ...

  10. mysql-实现远程连接(授权法)

    远程连接阿里云主机的mysql,遇到以下问题: 1.连接被拒,无法连接 可能原因:1.3306(默认)端口未开放,在控制台设置防火墙规则: 2. host字段的值改为%就表示在任何客户端机器上能以ro ...