图四
这里要特别说明一下的是:就是Action这个类,上面已经说到了它是Struts中真正干活的地方,也是值得我们高度关注的地方。可是,关于它到底是属于控制层还是属于模型层,存在两种不同的意见,一种认为它属于模型层,如:《JSP Web编程指南》;另一些则认为它属于控制层如:《Programming Jakarta Struts》、《Mastering Jakarta Struts》和《Struts Kick Start》等认为它是控制器的一部分,还有其他一些书如《Struts in Action》也建议要避免将业务逻辑放在Action类中,也就是说,图3中Action后的括号中的内容应该从中移出,但实际中确有一些系统将比较简单的且不打算重用的业务逻辑放在Action中,所以在图中还是这样表示。显然,将业务对象从Action分离出来后有利于它的重用,同时也增强了应用程序的健壮性和设计的灵活性。因此,它实际上可以看作是Controller与Model的适配器,如果硬要把它归于那一部分,笔者更倾向于后一种看法,即它是Controller的一部分,换句话说,它不应该包含过多的业务逻辑,而应该只是简单地收集业务方法所需要的数据并传递给业务对象。实际上,它的主要职责是:
? 校验前提条件或者声明 ? 调用需要的业务逻辑方法 ? 检测或处理其他错误
? 路由控制到相关视图
上面这样简单的描述,初学者可能会感到有些难以接受,下面举个比较具体的例子来进一步帮助我们理解。如:假设,我们做的是个电子商务程序,现在程序要完成的操作任务是提交定单并返回定单号给客户,这就是关于做什么的问题,应该由Action类完成,但具体怎么获得数据库连接,插入定单数据到数据库表中,又怎么从数据库表中取得这个定单号(一般是自增数据列的数据),这一系列复杂的问题,这都是解决怎么做的问题,则应该由一个(假设名为orderBo)业务对象即Model来完成。orderBo可能用一个返回整型值的名为submitOrder的方法来做这件事,Action则是先校验定单数据是否正确,以免常说的垃圾进垃圾出;如果正确则简单地调用orderBo的submitOrder方法来得到定单号;它还要处理在调用过程中可能出现任何错误;最后根据不同的情况返回不同的结果给客户。
二、为什么要使用Struts框架
既然本文的开始就说了,自己可以建这种框架,为什么要使用Struts呢?我想下面列举的这些理由是显而易见的:首先,它是建立在MVC这种公认的好的模式上的,Struts在M、V和C上都有涉及,但它主要是提供一个好的控制器和一套定制的标签库上,也就是说它的着力点在C和V上,因此,它天生就有MVC所带来的一系列优点,如:结构层次分明,高可重用性,增加了程序的健壮性和可伸缩性,便于开发与设计分工,提供集中统一的权限控制、校验、国际化、日志等等;其次,它是个开源项目得到了包括它的发明者Craig R.McClanahan在内的一些程序大师和高手持续而细心的呵护,并且经受了实战的检验,使其功能越来越强大,体系也日臻完善;最后,是它对其他技术和框架显示出很好的融合性。如,现在,它已经与tiles融为一体,可以展望,它很快就会与JSF等融会在一起。当然,和其他任何技术一样,它也不是十全十美的,如:它对类和一些属性、参数的命名显得有些随意,给使用带来一些不便;还有如Action类execute方法的只能接收一个ActionForm参数等。但瑕不掩瑜,这些没有影响它被广泛使用
为什么使用Struts2 ?
新版本的Struts2.0是struts 的action架构和webwork的融合体.依照Struts2.0.1的发布公告,一些关键特性如下 :
? 设计简单: 使用抽象类而不是接口是Struts1的一个设计上的问题,这
已经在Struts2中得到了解决.在Struts2中绝大多数类都是基于接口的,并且它的绝大多数核心接口都是独立于HTTP的.Struts2的Action类是独立于框架的,可视为单纯的POJO.框架的组件都设法保持松耦合
? 单纯的Action : Action都是单纯的POJO.任何含有execute()方法的
java类都可以当作Action类来使用.甚至我们始终都不需要实现接口.
反转控制会在开发Action类的时候得到介绍过,这能让Action中立于底层框架.
? 不再使用ActionForm : ActionForm特性不再在Structs2中出现.简单
的JavaBean即可对Action直接传递参数.不再需要全部使用String类型的参数.
? 简单的测试 : Struts2的Action是独立于HTTP并且中立于框架的.这
使得Struts2的程序可以很容易的在没有模拟对象的情况下测试.
? 巧妙的默认值 : 大多数配置元素都设有一个根据需要设定的默认值.
甚至根据需要基于XML的默认配置文件都可以进行重写.
? 改良的结果集 : 不像Struts1中的ActionForward,Struts2的结果集
灵活的提供了多种类型的输出,事实上这促进了响应的准备工作.
? 更好的标签特性 : Struts2可以添加样式表驱动标记,这使我们创建相
同的页面仅用更少的代码.Struts2的标签更有效而且是面向结果
的.Struts2的标签标记可以通过修改基础样式表来修改.个别的标签标记可以通过编辑FreeMarker的模板来修改.JSP和FreeMarker都完全得到了支持.
? 引入注释 : 在Struts2程序中,除了XML和Java properties 配置文件
外,Java 5的注释也可以作为一种选择.注释使得XML的使用降至最低.
? 有状态的Checkbox : Struts2中的checkbox不需要对false值进行特
殊处理.
? 快速开始 : 很多改变无需重启web容器即可实现.
? 自定义控制器 : Struts1可以自定义每一个模块的请求处理器,如果需
要,Struts2可以自定义每一个Action的请求处理.
? 易与Spring整合 : Struts2的Action与Spring是友好的,只需添加
Spring的bean
? 轻巧的插件 : Struts2可以通过添加一个Jar文件来进行扩展,不再需
要手动配置!
? 支持AJAX : AJAX主题对提升程序交互有着重要的意义.Struts2框架提
供了一套标签来AJAX化你的程序甚至DOJO.AJAX特性包括:
1. AJAX客户端验证.
2. 支持远程表单提交.(同样适用于submit标签) 3. 先进的div模板提供动态重载部份HTML
4. 先进的模板提供远程加载和计算Javascript的能力. 5. AJAX-only选项卡面板的实现 6. 丰富的发布/订阅事件模型 7. 自动交互完善标签
深入全面阐释Struts 2的方方面面
一、 Struts概述
Struts是一个用来开发 Model 2应用程序的框架。这个框架可以提高开发工作的速度,因为它提供的下面这些功能解决了 Web应用程序开发过程中的一些常见问题:
? ? ? ? ? ?
对页面导航活动进行管理;
对来自用户的输入数据进行合法性验证; 统一的布局; 可扩展性;
国际化和本地化; 支持 Ajax技术。
因为 Struts是一个 Model 2框架,所以在使用 Struts时还应该遵守以下几条不成文的规定。
不要在 JSP页面里嵌入 Java代码,应该把所有的业务逻辑包含在一些被称为“动作类”( action class)的 Java类里。
? 在 JSP页面里使用 Expression Language( OGNL)去访问有关的模型对象。
? 尽量避免编写自定义标签(因为自定义标签的代码比较难以编写)。
?
二、升级到 Struts 2
你也许用过 Struts 1编程,这里提供了一个关于 Struts 2 新功能的简要介绍。
在 Struts 1里需要使用一个像 ActionServlet 类这样的东西作为 servlet控制器; Struct 2使用了一个过滤器来完成同样的任务。
? 在 Struts 2里没有任何动作表单。在 Struts 1里,每个 HTML表单都对应着一个 ActionForm 实例,你可以从动作类访问这个动作表单,并用它来填充数据传输对象。在 Struts 2 里, HTML表单将被直接映射为一个 POJO,而不再需要你创建一个数据传输对象,因为没有动作表单,维护工作变得简单容易了,你不再需要与那么多的类打交道。
? 问题来了:没有了动作表单,怎样才能在 Struts 2里通过编程对用户输入进行合法性验证呢?答案是把验证逻辑编写在动作类里。
?
?
?
?
?
?
Struts 1通过几个标签库提供了一批定制标签供程序员在 JSP页面里使用,其中最重要的是 HTML标签库、 Bean标签库和 Logic标签库。 Servlet 2.4里的 JSTL和 EL( Expression Language ,表达式语言)经常被用来代替 Bean和 Logic标签库。 Struts 2为程序员准备了一个应有尽有的标签库,你不再需要 JSTL,但在某些场合你可能仍需要 EL。 在 Struts 1里,你还需要用到一些 Struts配置文件,其中最主要的是存放在各 Web应用程序里的 WEB-INF子目录里的 struts-config.xml(默认文件名)。在 Struts 2里,你仍需要用到多个配置文件,但必须把它们存放在 WEB-INF/classes子目录或它的某个下级子目录里。 要想使用 Struts 2 ,你的系统里必须有 Java 5 和 Servlet 2.4 (或更高版本)。之所以需要有 Java 5,是因为 Java 5里新增加的注解在 Struts 2里扮演着重要角色。我们撰写本书时, Java 6已经发布, Java 7也指日可待,你很可能已经在使用 Java 5或 Java 6了。
在 Struts 1 里,动作类必须扩展自 org.apache.struts.action.Action 类。在 Struts 2 里,任何一个 POJO 都可以是一个动作类。不过,我们将在本书第 3 章说明,在 Struts 2 里最好对 ActionSupport 类进行扩展。在此基础上,可用一个动作类来完成相关的动作。 Struts 2在 JSP页面里使用 OGNL来显示各种对象模型,而不再是 JSP EL和 JSTL。
原本是 Struts 1组件之一的 Tiles现在已经发展为一个独立的 Apache HTTP没有“类型”的概念,在 HTTP请求里发送的值都是字符串。在把表单字段映射到非 String 类型的动作属性时, Struts会自动对这些值进行必要的转换。这一章将解释 Struts如何完成这类转换,你还将学到如何为更加复杂的情 spring工作机制及为什么要用?
1.springmvc请所有的请求都提交给DispatcherServlet,它会委托应用系统的其他模块负责负责对请求进行真正的处理工作。
2.DispatcherServlet查询一个或多个HandlerMapping,找到处理请求的Controller.
3.DispatcherServlet请请求提交到目标Controller
4.Controller进行业务逻辑处理后,会返回一个ModelAndView 5.Dispathcher查询一个或多个ViewResolver视图解析器,找到ModelAndView对象指定的视图对象 6.视图对象负责渲染返回给客户端。 为什么用:
AOP 让开发人员可以创建非行为性的关注点,称为横切关注点,并将它们插