《研磨struts2》 第一章 Struts2概述 之 Struts2基础
1.2 Struts2 基础
1.2.1 Struts1时代
随着时间的推移,Servlet+JSP+JavaBean模型暴露出了它的缺点:
- 流程凌乱:Servlet在完成对用户请求的处理后,下一个页面是谁?如何跳转过去?这些都是在Servlet里面直接写代码来完成的。导致Servlet既要处理请求,还要负责页面的流程,使得Servlet功能不够单一,更要命的是很难整体把握整个系统的页面流程,因为流程被分散到各个Servlet里面了。
- 数据传递无序:在Model2模型里面,通常情况下,数据都是使用JavaBean传来传去的,使用上比较麻烦,而且在面临复杂数据嵌套的时候使用JavaBean,常常感觉力不从心。
- 缺乏辅助功能:几乎所有的东西都要程序员从头做起,没有统一的分发调度、验证框架、国际化、本地化、例外消息处理等等。
正当大家感觉痛苦的时候,Struts1勇敢地站出来解决这些问题。
Struts1是一个按照MVC模式开发的轻量级web应用框架,一经推出就很快风靡全球。对于那些一直在用Servlet+JSP+JavaBean的web开发者来说,Struts1可以帮助他们解决很多问题。比如:合理的代码结构划分,各种各样的实用工具框架(如验证框架、国际化框架)等等。
因此,在Struts1普及之后,大多数面试官进行面试的时候,每面必问到Struts1。那个时候Struts1真可谓一统江湖,在简历上如果没写能熟练使用Struts的话,就好像给自己判了死缓一样。
但是,随着时间的推移,Struts1的各种缺点也体现出来了,比如:
- Action实现类必须继承Struts1中的Action,降低了灵活性。
- 在一个应用中,只能使用一个单一的ActionServlet,可能会导致配置冲突
- Action的API同HttpServletRequest和HttpServeletResponse是耦合的,这使得单元测试变得很困难,虽然最后推出了一个StrutsTestCase,但是使用也比较麻烦。
- 页面传值的JavaBean必须继承Struts1中的FormBean,而其本质就是个JavaBean,使用起来照样比较麻烦。
- 相比Struts2,Struts1没有独立的拦截器模型,使得所有类似面向切面(AOP)的操作都要写成Filter,而Filter在使用和配置上都较弱。
当上面这些问题在Struts1上出现后,逐渐出现了一些在Struts1基础上的改进型web框架。具有代表性的有Struts2(WebWork)、Tapestry、SpringMVC等等。其中,最优秀的当然就是我们即将学习的Struts2了。
1.2.2 Struts2出世
由于前面提到的Struts1的缺点,使得它越来越无法满足开发人员灵活、多变的开发需求,同时开发效率低下也暴露无遗,很多开发人员开始选择其他更优秀的Web框架。Struts1的开发团队注意到了这个问题,他们也决定要大力改进,或是合并其他优秀的框架。
这个时候WebWork进入了Struts1开发团队的视野,WebWork设计思想先进,功能强大,但是市场占有率并不理想,因此,两个框架决定合并,就得到了现在的Struts2。事实上Struts2是在WebWork2的基础上进行开发的,Struts2.0实际就是WebWork2.3,它并没有Struts1的血统。
Struts2既拥有WebWork优良的设计和功能,又拥有Struts1的强大品牌号召力,所以在面世之初就引起了web开发者广泛的兴趣。经过几年的普及,越来越多的新项目都采用了Struts2,而Struts1基本上就是用来维护历史项目了。作为web开发人员,Struts2几乎是一个必备的框架,其重要性不言而喻了。
那么Struts2到底是什么呢?
Struts2是一种基于MVC的轻量级的web应用框架。
- 所谓框架:就是能完成一定功能的半成品软件。在没有框架的时候,所有的工作都要乖乖的从零做起;但是,有了框架,它为我们提供了一定的功能,就可以在框架的基础上做起了,大大提高开发的效率和质量。
- web应用框架,这说明Struts2的应用范围是Web应用而不是其它地方。换句话说Struts2更注重将Web应用领域的日常工作和常见问题抽象化,为我们提供一个平台,让我们能基于这个平台快速的完成Web应用开发。
- 轻量级:是相对于重量级而言,指的是Struts2在运行的时候,对Web服务器的资源消耗较少,比如CPU、内存等,但是运行速度相对较快。
- 基于MVC,说明基于Struts2开发的Web应用自然就能实现MVC,同时也说明Struts2着力于在MVC的各个部分为我们的开发提供相应帮助。
所以称Struts2为一种基于MVC的轻量级的web应用框架。
1.2.3 Struts2基本组成
WebWork与Struts合并之后,根据功能的细分和设计,拆分出一个叫xwork的部分,用来处理与Web无关的部分,也就是与Servlet无关的部分,比如:用户数据的类型转换、动作调用之前的数据验证、动作的调用等等。
其余与Web相关的部分,也就是与servlet相关的部分,被称为struts2部分。因此请注意,此处的“Struts2”可以理解为一个模块,是Struts2框架的一部分,如:如何接收用户请求的数据,如何跳转到下一个页面等等。
其中struts2部分调用了xwork部分,但是xwork部分是不依赖于Struts2部分的,xwork是完全独立的、纯Java的应用。因此,可以用下图来表示struts2部分和xwork部分的关系。
1.2.4 Struts2能干什么
在了解了Struts2是什么和基本有什么过后,一起来看看Struts2究竟可以做什么。看看Struts2到底有些什么魔法 功能,能让我们的Web开发变得更加轻松愉快呢?
- Struts2通过简单、集中的配置来调度动作类,使得我们配置和修改都非常容易。
- Struts2提供简单、统一的表达式语言来访问所有可供访问的数据。
- Struts2提供内存式的数据中心,所有可供访问的数据都集中存放在内存中,所以在调用中不需要将数据传来传去,大家都去这个内存数据中心访问即可。
- Struts2提供在动作类执行的前或后附加执行一定功能的能力,能实现AOP。
- Struts2提供标准的、强大的验证框架和国际化框架,而且与Struts2的其他特性紧密结合。
类似这样的功能很多,不胜枚举。
在Struts2官方文档的首页上,Struts2开发团队列出了Struts2的一些优势,一起来看看:
- 简单的建立 - 直接拷入自带的空项目(struts-blank.war)的各种配置即可。
- 改进的设计 - 代码不直接依赖各种HTTP(如HttpServletRequest)的API。这样可以使得单元测试简单、高效。
- 强大的标签 - 使用标签可以有效的减少页面代码。
- 良好的ajax支持 - 增加了有效的、灵活的ajax标签,就像普通的标准struts标签一样。
- 简单的spring集成 - 使用spring注入Action依赖的其他bean,而不需要额外的代码。
- 强大的结果 - 除了简单的JSP或Freemarker等标签,还支持JasperReports, JFreeChart和文件下载等,使得这些技术就像在Struts2中内置一样,而不需要其他结合代码。
- POJO(不实现特殊接口或继承特殊父类的普通对象)的forms - 不再有struts1的ActionForm。任何JavaBean都可以用来向Action传入或传出request的参数,甚至二进制的OutputStream等也可以。
- POJO的Actions - Action也不用实现特定的接口或继承特殊的类了。甚至可以使我们的Action不经过修改,就可以被其他框架重用。
- 简单的插件 - 简单的放入一个jar包,任何人都可以扩展struts2框架,而不需要什么特殊的配置。Struts2不再是一个封闭的框架,任何人都可以为其添砖加瓦,我们可以通过实现Struts2的某些特殊的可扩展点,比如自定义拦截器、自定义结果类型、自定义标签等等,就可以为Struts2定制我们需要的功能,而且还可以快速的发布给别人使用,就像Eclipse的插件机制一样,超酷。
- 明确的错误报告 - Struts2的异常简单而明了,直接指出错误的地方。
- 简单的Action测试 - 不需要模拟HTTP对象就可以直接测试struts2的action。这使得我们的单元测试非常方便。
- 智能的默认 - 跳过了冗余的设置。很多框架级对象都有一个默认的值,可以根本不用去关心它们,使用其默认设置就可以完成95%的日常工作。
-