Struts2的工作原理

上图来源于Struts2官方站点,是Struts 2 的整体结构。

一个请求在Struts2框架中的处理大概分为以下几个步骤(可查看源码:https://github.com/apache/struts):

1 客户端初始化一个指向Servlet容器(例如Tomcat)的请求

2 这个请求经过一系列的过滤器(Filter)(这些过滤器中有一个叫做ActionContextCleanUp的可选过滤器,这个过滤器对于Struts2和其他框架的集成很有帮助,例如:SiteMesh Plugin)

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

在上述过程中所有的对象(Action,Results,Interceptors,等)都是通过ObjectFactory来创建的。

Struts开源架构很好的实现了MVC模式,MVC即Model-View-Controller的缩写,是一种常用的设计模式。MVC 减弱了业务逻辑接口和数据接口之间的耦合,以及让视图层更富于变化。MVC的工作原理,如下图1所示:

Struts 是MVC的一种实现,它将 Servlet和 JSP 标记(属于 J2EE 规范)用作实现的一部分。Struts继承了MVC的各项特性,并根据J2EE的特点,做了相应的变化与扩展。下面是Struts实现MVC的原理。如下图2所示:

控制:通过图2大家可以看到有一个XML文件Struts-config.xml,与之相关联的是Controller, ,它可以称作为Struts神经中枢。

视图:主要由JSP生成页面完成视图,Struts提供丰富的JSP 标签库: Html,Bean,Logic,Template等,这有利于分开在Struts中,承担MVC中Controller角色的是一个Servlet,叫ActionServlet。ActionServlet是一个通用的控制组件。这个控制组件提供了处理所有发送到Struts的HTTP请求的入口点。它截取和分发这些请求到相应的动作类(这些动作类都是Action类的子类)。另外控制组件也负责用相应的请求参数填充 Action From(通常称之为FromBean),并传给动作类(通常称之为ActionBean)。动作类实现核心商业逻辑,它可以访问java bean 或调用EJB。最后动作类把控制权传给后续的JSP 文件,后者生成视图。所有这些控制逻辑利用Struts-config.xml文件来配置。表现逻辑和程序逻辑。

模型:模型以一个或多个java bean的形式存在。这些bean分为三类:Action Form、Action、JavaBean or EJB。Action Form通常称之为FormBean,封装了来自于Client的用户请求信息,如表单信息。Action通常称之为ActionBean,获取从ActionSevlet传来的FormBean,取出FormBean中的相关信息,并做出相关的处理,一般是调用Java Bean或EJB等。

流程:在Struts中,用户的请求一般以*.do作为请求服务名,所有的*.do请求均被指向ActionSevlet,ActionSevlet根据Struts-config.xml中的配置信息,将用户请求封装成一个指定名称的FormBean,并将此FormBean传至指定名称的ActionBean,由ActionBean完成相应的业务操作,如文件操作,数据库操作等。每一个*.do均有对应的FormBean名称和ActionBean名称,这些在Struts-config.xml中配置。

Struts2和struts1的比较

struts2相对于struts1来说简单了很多,并且功能强大了很多,我们可以从几个方面来看:

从体系结构来看:struts2大量使用拦截器来处理请求,从而允许与业务逻辑控制器 与 servlet-api分离,避免了侵入性(所谓侵入性就是指的这个架构设计出来的部件对系统的影响范围,比如框架的侵入性就很高,因为在一个工程中引入一个框架,你的整个设计都必须围绕这个框架来进行,一旦使用了,框架的可替代性几乎为0,这样子就是高侵入性。组件的侵入性就比较低);而struts1.x在action中明显的侵入了servlet-api.

从线程安全分析:struts2.x是线程安全的,每一个对象产生一个实例,避免了线程安全问题;而struts1.x在action中属于单线程。

性能方面:struts2.x测试可以脱离web容器,而struts1.x依赖servlet-api,测试需要依赖web容器。

请求参数封装对比:struts2.x使用ModelDriven模式,这样我们 直接 封装model对象,无需要继承任何struts2的基类,避免了侵入性。

标签的优势:标签库几乎可以完全替代JSTL的标签库,并且 struts2.x支持强大的ognl表达式。

当然,struts2和struts1相比,在文件上传,数据校验 等方面也 方便了好多。

原文:http://www.cnblogs.com/langtianya/archive/2013/04/09/3011090.html

java struct工作原理_Struts2的工作原理(图解)详解相关推荐

  1. java voliate,voliate 的实现原理是什么【面试题详解】

    今天爱分享给大家带来voliate 的实现原理是什么[面试题详解],希望能够帮助到大家. volatile可以保证线程可见性且禁止指令重排序,但是无法保证原子性.在JVM底层volatile是采用&q ...

  2. Clickhouse的数据存储原理、二进制文件内容分析与索引详解

    Clickhouse的数据存储原理.二进制文件内容分析与索引详解 Clickhouse以其强大的性能著称,已经被越来越多的使用在OLAP分析查询等场景中.Clickhouse是一个列式存储的数据库,而 ...

  3. java list 元素去重_小猿圈Java开发之list按照元素某个字段去重详解

    小猿圈Java老师给大家分享一篇关于如何实现Java8中list按照元素的某个字段去重的详细介绍,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,下面我们一起来看一下吧. ...

  4. java调用javascript函数_[Java教程]JavaScript函数的4种调用方法详解

    [Java教程]JavaScript函数的4种调用方法详解 0 2016-08-09 00:00:12 在JavaScript中,函数是一等公民,函数在JavaScript中是一个数据类型,而非像C# ...

  5. Java中print、printf、println的区别 详解

    Java中print.printf.println的区别详解 printf主要是继承了C语言的printf的一些特性,可以进行格式化输出 print就是一般的标准输出,但是不换行 println和pr ...

  6. java 三种将list转换为map的方法详解

    这篇文章主要介绍了java 三种将list转换为map的方法详解的相关资料,需要的朋友可以参考下 java 三种将list转换为map的方法详解 在本文中,介绍三种将list转换为map的方法: 1) ...

  7. java io类库,Java利用io类库对各种文件的操作详解

    Java中文网 - Java利用io类库对各种文件的操作详解 java中提供了io类库,可以轻松的用java实现对文件的各种操作.下面就来说一下如何用java来实现这些操作. 新建目录 //Strin ...

  8. Java生产环境下性能监控与调优详解 大纲 学习感悟

    Java生产环境下性能监控与调优详解 生产环境发生了内存溢出如何处理? 生产环境应该给服务器分配多少内存合适? 如何对垃圾收集器的性能进行调优? 4.生产环境CPU负载飙高该如何处理? 5.生产环境应 ...

  9. Java生产环境下性能监控与调优详解 第2章 基于JDK命令行工具的监控

    Java生产环境下性能监控与调优详解 第2章 基于JDK命令行工具的监控 2-1 JVM的参数类型 标准参数 x参数 XX参数 2-2 查看JVM运行时参数 2-3 jstat查看JVM统计信息 2- ...

  10. 农夫过河算法java,Java农夫过河问题的继承与多态实现详解

    Java农夫过河问题的继承与多态实现详解 发布时间:2020-08-22 06:04:29 来源:脚本之家 阅读:61 作者:小任性嘛 题目描述: 一个农夫带着一匹狼.一只羊.一颗白菜要过河,只有一条 ...

最新文章

  1. 网站常规基本优化工作有哪些?
  2. STM32 keil中编译遇到的问题
  3. FFmpeg代码导读——基础篇
  4. 树莓派kail linux安装wine,在ubuntu14.04中安装wine
  5. 【渝粤教育】国家开放大学2018年秋季 0222-22T模拟电子电路 参考试题
  6. AngularJS表单验证,手动验证或自动验证
  7. 飞行计算机配置,微软飞行模拟器配置要求一览 最低/最高PC配置详情
  8. 软件测试方法——单元测试、集成测试、系统测试、确认测试
  9. [PKUWC2018] Minimax
  10. c语言把鼠标变成别的图案,鼠标指针图案怎么换?换成自己喜欢的可以吗?
  11. 蘑菇街2016校园招聘——聊天
  12. 基于javaweb的教室信息管理系统
  13. 马丁富勒微服务论文学习
  14. JS 数组,对象。中划线、数字属性时值获取
  15. vue+echarts的组件封装
  16. android 输入法如何启动流程_Android输入法显示流程
  17. 《电子设计工程》期刊简介
  18. 如何采集微信公众号历史数据
  19. Swarm服务开启滚动更新
  20. 主流杀毒软件多已支持windows7

热门文章

  1. 在 Exchange 服务器上的操作系统中的防病毒软件
  2. MySQL系列之E-1------MySQL主从复制原理
  3. hibernate 程序运行时的错误,及解决办法(不定期更新)
  4. 接收xml参数_SpringBoot实战(二):接收xml请求
  5. 从业回忆,一次大胆的冒险,程序员转岗项目经理
  6. tar解压出错tar: Child returned status 1
  7. sklearn的train_test_split
  8. 什么是html的混杂模式_HTML的完整形式是什么?
  9. Java LinkedList getFirst()方法与示例
  10. java system类_Java System类mapLibraryName()方法及示例