写在前面:

  1. Struts1官方已经停止更新,现在用的也比较少,但是了解Struts1可以帮助我们更好的理解Struts2.
  2. 我们不能简单的把Struts2理解为Struts1的升级,甚至可以说这样理解是错误的。Struts2与Struts1有巨大的差别,Struts2以WebWork为核心,吸收了Struts1的优点,尽量解决Struts1存在的问题。正是这种差距,将两者放到一起对比,可以更好的理解一些技术点的优缺点。

MVC简介

Struts2是一个兼容Struts1和WebWork的MVC框架,既然,提到了MVC框架,就不得不对MVC框架做一个简单介绍,仅限于简单介绍,如果,想了解更多的MVC的知识可以查看相关的文档。言归正传,其实,Java目前出现的这些框架而言,其最终目的都是为了接触耦合,不论是Spring、Hibernate或MVC框架,目的都是为了接触耦合增加复用。MVC接触的是View和Model间的耦合。
MVC包含三个基础部分:Model、View和Controller,这三个部分以最小的耦合协同工作,以增加程序的可扩展性和可维护性。各个部分的实现技术可以总结如下:
1)Model:JavaBean、EJB的EntityBean
2)View:JSP、Struts的TagLib
3)Controller:Struts的ActionServlet、Action
概括起来MVC的优点主要有一下方面:
1) 多个视图可以对应一个模型。按MVC设计模式,一个模型对应多个视图,可以减少代码的复制及代码的维护量,一旦模型发生改变,也易于维护 。
2) 模型返回的数据与显示逻辑分离。模型数据可以应用任何的显示技术,例如,使用JSP页面、Velocity模板或直接产生Excel文档等。
3) 应用被分隔为三层,降低了各层之间的耦合,提供了应用的可扩展性 。
4) 控制层的概念也很有效,由于它把不同的模型和不同的视图组合在一起,完成不同的请求。因此,控制层可以说是包含了用户请求权限的概念 。
5) MVC更符合软件工程化管理的精神。不同的层各司其职,每一层的组件具有相同的特征,有利于通过工程化和工具化产生管理程序代码 。

MVC更多的时候是一种思想,这个阶段我们可以更多的去关注各个模块的实现技术是什么。

Struts1

特点

Struts 1以ActionServlet作为核心控制器,由ActionServlet负责拦截用户的所有请求。Struts 1框架有3个重要组成部分:
Action、ActionForm和ActionForward对象。
ActionForm必须实现ActionForm的基类,设计上并不是真正的POJO。ActionForward就是一个逻辑视图,通过在配置文件中定义ActionFoward的映射,完成逻辑视图名和实际视图资源之间的映射。
Struts 1的Action类与Struts 2的Action类有一定的类似性,都通过调用execute方法来处理用户请求。但最大的区别在于Struts 1 Action的execute方法与Servlet API耦合(ActionServlet继承自HttpServlet),但Struts 2 Action类的execute方法无需与Servlet API耦合。

缺点:

1). 只支持JSP作为表现层技术,不能与Velocity,FreeMarker等技术整合。
(2). 与Servlet API严重耦合,难于测试。一个exute有四个参数ActionMapping、ActionForm、HttpServletRequest和HttpServletResponse,初始化困难。
(3). 侵入式设计,严重依赖于Struts1API,如如ActionMapping、ActionForm和ActionForward类。一旦系统需要重构时,这些类完全没有利用价值,导致较低的代码复用。

Struts2

特点

Struts2之所以以WebWork的设计思想为其核心,就是WebWork没有Struts1上面的那些缺点,更符合MVC的设计思想,也更利于代码的复用。
基于以上介绍可以看的出,Struts2体系结构与Struts1的体系结构有很大的差别,Struts1是使用ActionServlet做为其中心处理器,Struts2则使用一个拦截器(FilterDispatcher)做为其中心处理器,这样做的一个好处就是将Action类和Servlet API进行了分离。
Struts2的简单处理流程如下:
1. 浏览器发送请求 。
2. 中心处理器根据struts.xml文件查找对应的处理请求的Action类。
3. WebWork的拦截器链自动对请求应用通用功能,例如:WorkFlow、Validation等功能 。
4. 如果Struts.xml文件中配置Method参数,则调用Method参数对应的Action类中的Method方法,否则调用通用的Execute方法来处理用户请求 。
5. 将Action类中的对应方法返回的结果响应给浏览器。

核心控制器:FilterDispatcher

Struts 2用于处理用户请求的Action实例,并不是用户实现的业务控制器,而是Action代理——因为用户实现的业务控制器并没有与Servlet API耦合,显然无法处理用户请求。而Struts 2框架提供了系列拦截器,该系列拦截器负责将HttpServletRequest请求中的请求参数解析出来,传入到Action中,并回调Action 的execute方法来处理用户请求。显然,上面的处理过程是典型的AOP(面向切面编程)处理方式。

Action

  1. Action类完全是一个POJO,因此具有很好的代码复用性。
  2. Action类无需与Servlet API耦合,因此进行单元测试非常简单。
  3. Action类的execute方法仅返回一个字符串作为处理结果,该处理结果可映射到任何的视图,甚至是另一个Action。

配置文件

  1. 配置Action的struts.xml文件。
  2. 配置Struts 2全局属性的struts.properties文件。

下面是struts.xml配置文件的示例:

Xml代码

<struts>  <!-- Struts 2的Action都必须配置在package里 -->  <package name="default" extends="struts-default">  <!-- 定义一个Logon的Action,实现类为lee.Logon -->  <action name="Logon" class="lee.Logon">  <!-- 配置Action返回input时转入/pages/Logon.jsp页面 -->  <result name="input">/pages/Logon.jsp</result>  <!-- 配置Action返回cancel时重定向到Welcome的Action-->  <result name="cancel" type="redirect-action">Welcome</result>  <!-- 配置Action返回success时重定向到MainMenu的Action -->  <result type="redirect-action">MainMenu</result>  <!-- 配置Action返回expired时进入ChangePassword的Action链 -->  <result name="expired" type="chain">ChangePassword</result>  </action>  <!-- 定义Logoff的Action,实现类为lee.Logoff -->  <action name="Logoff" class=" lee.Logoff">  <!-- 配置Action返回success时重定向到MainMenu的Action -->  <result type="redirect-action">Welcome</result>  </action>  </package>  </struts>

总结:

了解学习Struts1与Struts2的基础知识和工作流程,可以让我们更好的理解两者的区别和为什么要这样改进。通过对两者的基础学习,我们发现,两者虽然是完全不同的框架,但是Struts2完全是为了解决Struts1存在的问题而产生的。下篇文章我们将讨论两者的区别。

Struts2与Struts1的对比学习(一)相关推荐

  1. Struts2与Struts1的对比

    Struts2与Struts1的对比 Action 类: • Struts1要求Action类继承一个抽象基类.Struts1的一个普遍问题是使用抽象类编程而不是接口. • Struts 2 Acti ...

  2. Struts1和Struts2的区别和对比(完整版)

    struts2不是struts1的升级,而是继承的webwork的血统,它吸收了struts1和webwork的优势. 先看struts的Action官方注释(struts1.3.8源代码) /** ...

  3. Struts1和Struts2的区别和对比(完整版)(转)

    Struts1和Struts2的区别和对比(完整版)(转) Struts1和Struts2的区别和对比: Action 类:  • Struts1要求Action类继承一个抽象基类.Struts1的一 ...

  4. Struts2和Struts1.x的全面比较

    Struts2和Struts1.x的全面比较 为了对Struts2和Strtus1.x进行全面的比较,让读者了解这两种框架各自的优缺点,以便于在自己的项目中,根据实际情况,选择合适的框架,对它们两者进 ...

  5. 语义表征的无监督对比学习:一个新理论框架

    点击上方↑↑↑蓝字关注我们~ 「2019 Python开发者日」7折优惠最后3天,请扫码咨询 ↑↑↑ 译者 | Linstancy 责编 | 琥珀 出品 | AI科技大本营(ID:rgznai100) ...

  6. NeurIPS 2020 :ReID任务大幅领先,港中文开源自步对比学习框架,充分挖掘无监督学习样本...

    作者丨葛艺潇 来源丨https://zhuanlan.zhihu.com/p/269112325 编辑丨极市平台 导语:本文介绍一篇作者发表于NeurIPS-2020的论文: <Self-pac ...

  7. 华人博士提出原型对比学习,非监督学习效果远超MoCo和SimCLR

    点上方蓝字视学算法获取更多干货 在右上方 ··· 设为星标 ★,与你不见不散 仅作分享,不代表本公众号立场,侵权联系删除 转载于:新智元 继MoCo和SimCLR之后非监督学习的又一里程碑!Sales ...

  8. MolCLR | 对比学习在分子图表示任务中大有作为

    今天给大家介绍卡耐基梅隆大学Amir Barati Farimani团队近期发表在arxiv上的关于如何利用对比学习和图神经网络进行分子表示,并服务于下游任务的研究.分子机器学习在分子性质预测和药物发 ...

  9. SimCSE:用于句子嵌入的对比学习

    目录 引言 对比学习Contrastive Learning SimCSE思想 无监督下的SimCSE 有监督下的SimCSE 连接各向异性Connection to Anisotropy 分析 引言 ...

最新文章

  1. java B2B2C 源码 Springcloud多租户电子商城系统- Stream重新入队(RabbitMQ)
  2. 新式类和经典类的区别类的特殊方法单例模式
  3. 致远M1移动协同软件
  4. python无向加权图_图:无向图(Graph)基本方法及Dijkstra算法的实现 [Python]
  5. Eclipse调试常用技巧
  6. 怎么在我的世界服务器注册,我的世界服务器怎么注册
  7. iphone各机型参数对比_带你了解新款iPhone 12系列四款机型
  8. LeetCode MySQL 197. 上升的温度
  9. 【Java】《Java面向对象编程的三大特性》阅读笔记
  10. golang mysql 超时_Go语言channel超时机制
  11. 大厂“无敌卷王”、“圈养式”招聘?年后测试员跳槽一定要注意这几个坑
  12. 深入理解BGP的几个路由特性(试读连载六)
  13. python制作动态表情包_sorrypy
  14. 第一章:Python数据分析前的基础铺垫
  15. VML实例-拖动效果
  16. JavaSwing设置字体样式
  17. 云原生Docker搭建为知笔记
  18. 二分查找理论(三种问题类型、两种算法形式)
  19. unity种四种光源
  20. 计算机主机通常包括( ) a运算器,计算机主机通常包括()。 A.运算器 B.控制器 C.显示器 D.存储器 此题为多项选择题。...

热门文章

  1. 国家税务总局电子税务局一些操作步骤记录
  2. linux系统更改计算机名称,如何在Linux中设置或更改主机名
  3. tensorflow 协同过滤_推荐系统算法学习(一)——协同过滤(CF) MF FM FFM
  4. 她用这三个吸粉招式,玩塔罗牌年赚20万
  5. Android Studio 实现点击按钮 调出设备自带的文件管理器 读取手机设备文件
  6. Fortify的各种疑难杂症
  7. 对模拟器虚假设备识别能力提升15%!每日清理大师App集成系统完整性检测
  8. 雨果让创建网站再次变得有趣
  9. Redis 延时任务方案分析
  10. URL地址的两种格式