研磨Struts2 第一章 Struts2概述-2

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.4 Struts2框架的组成

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%的日常工作。

1.3  Struts2和MVC

1.3.1  Struts2和MVC

前面讲到Struts2是一种基于MVC的Web应用框架,下面就来看看Struts2和MVC的关系。

当然,由于我们还没有深入学习Struts2的各部分功能,这里只是先给大家讲一下Struts2是如何跟MVC对应的,其中一些名词所代表的具体功能,比如前端控制器(FilterDispatcher)、动作(Action)、结果(Result)等,在以后都会有专门的章节去讲解,现在不必在意他们的细节。

图1.5 Struts2中的MVC关系

Ø        控制器——FilterDispatcher

       用户请求首先到达前端控制器FilterDispatcher。FilterDispatcher负责根据用户提交的URL和struts.xml中的配置,来选择合适的动作(Action),让这个Action来处理用户的请求。

FilterDispatcher其实是一个过滤器(Filter,servlet规范中的一种web组件),它是Struts2核心包里已经做好的类,不需要我们去开发,只是要在项目的web.xml中配置一下即可。FilterDispatcher体现了J2EE核心设计模式中的前端控制器模式。

Ø        动作——Action

       在用户请求经过FilterDispatcher之后,被分发到了合适的动作Action对象。Action负责把用户请求中的参数组装成合适的数据模型,并调用相应的业务逻辑进行真正的功能处理,然后获取下一个视图展示所需要的数据。

       Struts2的Action,相比于别的web框架的动作处理,有一个很大的进步,它实现了与Servlet API的解耦,使得在Action里面不需要再直接去引用和使用HttpServletRequest与HttpServletResponse等接口。因而使得Action的单元测试更加简单,而且强大的类型转换也使得我们少做了很多重复的工作。

Ø        视图——Result

       视图结果用来把动作中获取到的数据展现给用户。在Struts2中,多种优秀的结果展示方式正是其吸引人的特性之一,既有常规的jsp,又有模板freemarker、velocity,还有各种其它专业的展示方式,如图表jfreechart、报表JasperReports、将XML转化为HTML的XSLT等等。而且,各种视图结果在同一个工程里面还可以混合出现。

       看到这里,应该大致知道了Struts2是什么,能干什么,粗略的了解到Struts2里面有什么,接下来,就应该看看究竟如何使用Struts2来开发基于MVC的Web应用了。

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值