VIRGIN FOREST OF JAVA
不要埋头苦干,要学习,学习,再学习。。。。。
powered by R.Zeus
1. 简介
1.0 先决条件

这份用户指南是为那些活跃的Web开发者编写的,假设读者已经了解java Web application是如何工作的。在开始之前,您应该已经掌握下列基本核心技术。

如果您在其他平台上开发过web applications,您也许可以继续。在需要的时候参考以上的资料。他们几乎是所有Java web开发项目需要用到的核心技术。

1.1 前言 :回到从前!(也是Struts的简史)

当java servlets被发明出来的时候,很多程序员迅速意识到这是一个好东西。它比标准CGI快速强大,可以移植,并且几乎可以无限扩展。

但是无穷无尽的编写 println()语句来吧HTML送到浏览器是浪费时间并且容易造成问题。答案就是JavaServer Pages,它把编写servlet的任务倒了个个儿。现在开发者可以很容易的把HTML和Java代码混合起来,并且仍然拥有servlet的所有好处。只有天空才会限制(我们)!

Java web程序很快变成了以JSP为中心的。关于(JSP)本身并不是一件坏事,但是它并没有解决流程控制和web application的其他一些问题

显然,我们需要另一个模型...

很多聪明的程序员认识到JSP和servlets可以被一起使用来构造web程序。Servlets可以用来辅助流程控制,JSP主要关注于实现那些凌乱的HTML.在这样的过程中,一起使用JSP和servlet开始被称为Model 2.(同时只使用JSP被称为Model 1)。

当然,天底下没有新东西...很快很多人指出JSP的Model 2 遵循SmallTalk的经典的Model-View-controller设计模式。现在术语Model 2和MVC可以互相替代。

Struts工程于2000年5月由Craig R. McClanahan开始动工,来为Java社区实现一个标准的MVC框架。2001年6月,Struts 1.0发布了。从此,Model 2开发开始变得不同。

1.2 Model-View-Controller ('MVC') 设计模式

在MVC设计模式中,程序流程由一个的Controller(控制器)居中斡旋。Controller委派请求--在我们的情形中,HTTP请求--到合适的handle(处理程序)去。Handle和Model(模型)相联系,每一个handle的作用就是成为在请求和Model之间的适配器(adaptor有一个意思是电源插头--译者注)。Model 代表或者封装了一个程序的商业逻辑或者状态。通常控制由Controller重新转移到对应的View去。这个转移由一系列的映射决定,一般从数据库或者配置文件中取得。这样就为View和Model提供了一个松散的联系,编写和维护程序变得显而易见的的容易。

1.3 Struts 框架纵览

忠实的和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 得到详细信息.

1.4 Model(模型): 系统状态和商业逻辑JavaBeans

基于MVC的系统中的Model(模型)部分可以被分为两个概念,系统的内部状态和可以用来改变状态的动作。从语法上来说 ,我们可以把状态信息看成是名词,而动作是动词(用来改变状态)。

一般来说,米的程序需要用一套包含一个或多个JavaBeans来表达内部状态,(这些)JavaBean包含了这个状态的详细属性。根据 你的程序的复杂程度,他们可能是自我包含的(自己知道怎么样保留持续化信息),或者仅是一个知道必要时如何从外部数据源(如数据库)获取信息的对象。Entity Enterprise JavaBeans (Entity EJBs)一般也用于表示内部状态。

大型程序经常使用一些bean的方法来表示一组可能的商业逻辑,这些方法维护状态信息。例如,你可能有一个购物车Bean,保存 在每个用户的session中,包含用户当前决定购买的条目。这个bean可能有一个checkOut()方法来取得用户信用卡 的授权,发送订单到仓库去来发送。另一些系统可能把可能的动作单独包装,可能是一个Session Enterprise JavaBeans(Session EJBs).

在一些较小的程序中,相反,可能的动作会内置于Action类中,是Controller角色的一部分。当逻辑非常简单的 时候,或者当重用商业逻辑不是关注点的时候这是合适的。Struts框架支持任何一种模式,但是强烈建议把商业逻辑 (如何做)从Action类扮演的角色(做什么)中分开。

1.5 View(视图): JSP页面和表示部件

基于Struts程序的View部分基本上是由JavaServer pages(JSP)技术构成的。JSP页面可以包含静态的HTML(或者XML)文本,被称为“模版文本”,再加上在特殊的标签运行时(当页面被调用的时候)插入动态内容的能力。JSP环境包含一套标准的动作标签,比如<jsp:useBean>他们的 用处在JavaServer Pages Specification描述了。另外,还有一种标准的方法来定义你自己的标签,他们被组织在“自定义标签库”里。

Struts包含了一个内容广泛的自定义标签库,用以帮助编写完全国际化的用户界面。它也和处于Model部分的ActionForm高度互动。关于使用这些标签的方法在后面会详细讨论。

除了JSP 页面和原有的以及自定义的标签之外,有时候让商业逻辑对象拥有把他们自己根据当前的状态渲染成HTML(或者XML)的能力也 是经常需要的。这些被渲染出来的输出可以很容易的在一个结果JSP文件里面用<jsp:include>标准动作标 签引用。

1.6 Controller(控制器): ActionServlet 和 ActionMapping

程序的Controller(控制器)部分关注于从客户端接收请求(通常是一个使用浏览器的用户),决定那个商业逻辑方法应该被执行,然后分配任务给到一个合适的view组件来制造下一步的用户界面。在Struts里面,Controller的主要部分是一个servlet,它是ActionServlet.这个servlet用一组ActionMappings来配置,一个ActionMapping定义了一个path(路径),它和用户请求的URI对应,一般会指定一个完整的Action类的类名。所有的Action类都是org.apache.struts.action.Action的子类。Action封装了商业逻辑,组装结果,并且最终分配控制权到合适的View部件来创建结果。

Struts也支持在ActionMapping中使用除了标准的框架所需之外附加的属性。这样允许你保存你的程序所特定的附加信息。除此之外,Struts还允许你定义控制转移的逻辑“名字”,这样一个Action方法可以要求“主菜单”(举例)而不需要知道对应的JSP页面的实际名字。这个功能很大的帮助你把控制逻辑(做什么)和表示逻辑(如何显示)分开。

posted on 2005-08-13 03:51 R.Zeus 阅读(277) 评论(0)  编辑  收藏 所属分类: STRUTS

只有注册用户登录后才能发表评论。


网站导航: