忠实的和Model-View-Controller设计模式对应,Struts程序有三个主要的部件:一个Servlet Controller,它由Struts本身提供,JSP 页面("view"),还有程序的商业逻辑("model").我们来看看他们是怎么组合到一起的。
Struts的Controller servlet把HTTP 请求打包并传送到框架中的其他对象,包括JavaServer Pages和由Struts开发者编写的org.apache.struts.action.Action 的子类。当(系统)初始化的时候,Controller 解释一个配置资源文件。这个文件定义了(和其他配置一起)这个程序的org.apache.struts.action.ActionMapping 。Controller用这些映射来把HTTP 请求转换为程序的actions(动作)。
一个ActionMapping通常会指出:
- 一个request请求的路径 (简称 "URI"),
- 用于处理请求的object type(对象) (Action 的子类),
- 和其他一些必要的属性。
Action 对象可以处理请求并响应客户端(通常是一个web browser),或者指出流程应该被指向另一个地方。例如,如果登录成功,一个login Action可能希望把流程转移到主菜单。
Action对象可以操作程序的Controller servlet,所以可以操作这个Controller的方法。当转发控制的时候,一个Action对象可以不直接的转发一个或多个共享对象,包括JavaBeans,这个过程是通过把它们放到Java servlet共享的某一个标准collection对象里去。
Action对象可以创建一个购物车Bean,在购物车里面加上一个条目,把这个bean放到session 结构里去,然后把控制转发到另一个映射。那个映射会使用一个JavaServer Page来显示用户的购物车里的内容。因为每个用户都有他自己的session,他们也会有自己的购物车。在一个Struts程序里,大部分商业逻辑都可以由JavaBeans表示。一个Action可以调用一个JavaBean的属性,不需要知道她实际上是如何工作的。这封装了 商业逻辑,所以Action可以专注于错误处理和如何转发控制。
JavaBeans也可以用来管理输入的Forms.设计一个web程序的主要问题是得到并检查用户在请求中的输入。通过Struts,你可以 定义你自己的Form Bean 类集合,他们都是org.apache.struts.action.ActionForm 的子类,并很容易的把用户form(这里是指HTTP form--译者注)输入的内容放到这些Form bean里去。这个bean被存放到一个标准的共享上下文集合里去,所以另一个对象可以使用它,特别是指一个Action对象。 (我的理解,使用ActionForm是因为这样可以标准化的检查Form里的值,也可以标准化的调用Action--译者注。)
Form bean可以被一个JSP使用来从用户收集数据...通过一个Action 对象来检查用户输入的数据...然后再通过JSP来重新显示form的字段。如果检查错误,Struts由一个公用的机制来提交和显示错误信息。
Struts 的Form bean在配置文件中声明,在一个Java文件中被定义,并且通过一个通用的属性名字来连接到一个ActionMapping去。当一个请求 调用一个需要FormBean 的Action时候,Controller servlet要么从输入中获取form bean,要么自己构造一个form bean,把它传递到Action对象去。Action 对象可以在显示之前检查form bean的内容,也可以为要在form里显示的内容排队。准备好之后,Action对象返回控制权并转移到它的输入叶面去。controller就可以响应HTTP请求,并重定向到JavaServer Page去。
Struts 框架包括自定义的Tag来自动从一个formBean填充子段。JavaServer Page唯一需要知道的是确切的字段名和下一步提交form到何处。一些部件例如被Action排队的消息可以在一个自定义tag就被输 出。也可以定制其他为程序定制的tag来从jsp中隐藏实现细节。
在Struts框架中的自定义tag被设计为使用Java平台内置的国际化特性。所有的字段名和消息都可以从消息资源中获取,并且Java可以自动为一个客户端的国家和语言提供想对应的资源。为了提供另一种语言的支持,只需简单的的增加另一个资源文件。
除了国际化之外,这个进步的好处还在于在不同的form中保持一样的标签名字,也可以全局化的复查所有的标签和消息。
对于最简单的程序来说,有时候一个Action对象可以处理一个请求对应的商业逻辑。但是,在大多数情况下,一个Action对 象应该调用另一个对象,一般是一个JavaBean来处理实际的业务逻辑。这让Action专注于错误处理和流程控制,而非商业逻 辑。为了在其他平台上重用,商业逻辑JavaBean不应该引用任何web程序的对象。Action对象应该从HTTP请求翻译必要的细节并 象普通的java变量一样传递到商业逻辑对象去。
举个例子,在一个数据库程序中:
- 一个商业逻辑bean会连接到数据库并进行查询,
- 商业逻辑bean把结果传递到Action,
- Action把结果保存在一个form bean中,放置到request中去,
- JavaServer Page把结果显示到一个HTML Form中去。
不管是Action还是JSP都不需要知道结果是从哪儿来的。他们只需要知道如何打包和显示结果。
用户指南的其它部分非常详细的解释了Struts的不同部件。Struts发布版本也包含了一些开发者手册包含几个不同的主题,也包括例子程序,标准的Javadoc API,当然还有全部的源代码!
Struts 在Apache软件基金会协议下发布。代码拥有版权,但是可以在任何程序中自由的使用。参阅ASF license 得到详细信息.
|