Struts 运行环境
当前主要有两个版本,struts 1.0 release 和 struts 1.1 beta 3。Struts 1.0 和1.1差别很大,主要有两点:
尽管struts 1.0 是正式发布版,但是结构已经老化,功能也已经固化。所以我们的Framework不选用struts 1.0, 而选用 struts 1.1。
根据apache官方网站的说法,struts几乎支持所有的servlet containers, 下面是几种主要的servlet containers
Servlet Container |
版本 |
iPlanet Application Server |
6.0sp2 or higher, 6.5 |
Tomcat |
3.2.x, 4.0 or higher |
Weblogic |
6.0 or higher |
Websphere |
3.5 or higher |
Orion |
1.0 or higher |
Resin |
1.2 or higher |
JRun |
3.0 or higher |
我们公司目前项目中使用较多的应用服务器是iPlanet Application Server, Tomcat。Struts 1.1 在这两个应用服务器下已经配置通过。
Tomcat 与struts结合的很好,只需要将xxx.war 放到 webapp 目录下,启动Tomcat 即可,不需要其他额外的配置。
iPlanet 配置复杂一些,主要原因是xml parser 版本不一致,和struts 相关类不能加载。具体的配置说明请见《如何在 iAS 6.x 中配置Struts 1.1 beta x》。
在其他的应用服务器上,还没有尝试struts, 今后根据项目需要会作进一步的研究。
struts framework是MVC 模式的体现,下面分别从模型、视图、控制来看看struts的体系结构(Architecture)。下图显示了struts framework的体系结构响应客户请求时,各个部分工作的原理。
Struts体系结构
主要由JSP建立,struts自身包含了一组可扩展的自定义标签库(TagLib),可以简化创建用户界面的过程。目前包括:Bean Tags,HTML Tags,Logic Tags,Nested Tags,Template Tags。
模型主要是表示一个系统的状态(有时候,改变系统状态的业务逻辑操作也也划分到模型中)。在Struts中,系统的状态主要有ActiomForm Bean体现,一般情况下,这些状态是非持久性的。如果需要将这些状态转化为持久性数据存储,Struts本身也提供了Utitle包,可以方便的与数据库操作。
在Struts framework中, Controller主要是ActionServlet,但是对于业务逻辑的操作则主要由Action、ActionMapping、ActionForward这几个组件协调完成。其中,Action扮演了真正的业务逻辑的实现者,而ActionMapping和ActionForward则指定了不同业务逻辑或流程的运行方向。
框架中所使用的组件:
ActionServlet |
控制器 |
ActionClass |
包含事务逻辑 |
ActionForm |
显示模块数据 |
ActionMapping |
帮助控制器将请求映射到操作 |
ActionForward |
用来指示操作转移的对象 |
ActionError |
用来存储和回收错误 |
Struts标记库 |
可以减轻开发显示层次的工作 |
Struts-config.xml集中了所有页面的导航定义。对于WEB项目,通过配置文件可迅速把握其脉络,这不管是对于前期的开发,还是后期的维护或升级都是方便的。掌握Struts-config.xml是掌握Struts的关键所在。
在struts的早先版本中,只有一个struts配置文件struts-config.xml。但是,对大型项目来说,使用和修改这个配置文件,会成为瓶颈。在struts1.1中,支持sub-Application ,可以定义多个配置文件协同工作。
通过struts配置文件struts-config.xml 将struts各个组件联系在一起。在struts-config.xml 中可以定义下面内容:
全局转发用来在JSP页之间创建逻辑名称映射。全局转发的例子:
<global-forwards> <forwardname="logoff"path="/logoff.do"/> <forwardname="logon"path="/logon.jsp"/> <forwardname="registration"path="/registration.jsp"/> <forwardname="suclearcase/" target="_blank" >ccess"path="/mainMenu.jsp"/> </global-forwards> |
属性 |
描述 |
Name |
全局转发的名字 |
Path |
与目标URL的相对路径 |
ActionMapping对象帮助进行框架内部的流程控制,它们可将请求URI映射到Action类,并且将Action类与ActionForm bean相关联。ActionServlet在内部使用这些映射,并将控制转移到特定Action类的实例。所有Action类使用perform()或者execute()方法实现特定应用程序代码,返回一个ActionForward对象,其中包括响应转发的目标页面名称。例如:
<action-mappings> <actionpath="/logon" type="org.apache.struts.webapp.example.LogonAction" name="logonForm" scope="session" input="logon"> </action> <forward name="failure" path="/error.jsp"/> <forward name="success" path="/index.jsp"/> </ action-mappings> |
属性 |
描述 |
Path |
Action类的相对路径 |
Name |
与本操作关联的Action bean的名称 |
Type |
连接到本映射的Action类的全称(可有包名) |
Scope |
ActionForm bean的作用域(请求或会话) |
Prefix |
用来匹配请求参数与bean属性的前缀 |
Suffix |
用来匹配请求参数与bean属性的后缀 |
attribute |
作用域名称。 |
className |
ActionMapping对象的类的完全限定名默认的类是org.apache.struts.action.ActionMapping |
input |
输入表单的路径,指向bean发生输入错误必须返回的控制 |
unknown |
设为true,操作将被作为所有没有定义的ActionMapping的URI的默认操作 |
validate |
设置为true,则在调用Action对象上的perform()方法前,ActionServlet将调用ActionForm bean的validate()方法来进行输入检查 |
通过<forward>元素,可以定义资源的逻辑名称,该资源是Action类的响应要转发的目标。
属性 |
描述 |
Id |
ID |
ClassName |
ActionForward类的完全限定名,默认是org.apache.struts.action.ActionForward |
Name |
操作类访问ActionForward时所用的逻辑名 |
Path |
响应转发的目标资源的路径 |
redirect |
若设置为true,则ActionServlet使用sendRedirect()方法来转发资源 |
ActionServlet使用ActionForm来保存请求的参数,这些bean的属性名称与HTTP请求参数中的名称相对应,控制器将请求参数传递到ActionForm bean的实例,然后将这个实例传送到Action类。例子:
<form beans > <form bean name="bookForm" type="BookForm"/> </form beans> |
属性 |
描述 |
Id |
ID |
className |
ActionForm bean的完全限定名,默认值是org.apache.struts.action.ActionFormBean |
Name |
表单bean在相关作用域的名称,这个属性用来将bean与ActionMapping进行关联 |
Type |
类的完全限定名 |
例子:
<data-sources> <data-source> <set-property property="autoCommit" value="false"/> <set-property property="description" value="Example Data Source Configuration"/> <set-property property="driverClass" value="org.postgresql.Driver"/> <set-property property="maxCount" value="4"/> <set-property property="minCount" value="2"/> <set-property property="password" value="mypassword"/> <set-property property="url" value="jdbc:postgresql://localhost/mydatabase"/> <set-property property="user" value="myusername"/> </data-source> </data-sources> |
属性 |
描述 |
description |
数据源的描述 |
autoCommit |
数据源创建的连接所使用的默认自动更新数据库模式 |
driverClass |
数据源所使用的类,用来显示JDBC驱动程序接口 |
loginTimeout |
数据库登陆时间的限制,以秒为单位 |
maxCount |
最多能建立的连接数目 |
minCount |
要创建的最少连接数目 |
password |
数据库访问的密码 |
readOnly |
创建只读的连接 |
User |
访问数据库的用户名 |
url |
JDBC的URL |
通过指定关键字名称,Action类可以访问数据源,比如:
javax.sql.DataSource ds = servlet.findDataSource(“conPool”);
javax.sql.Connection con = ds.getConnection();
struts 标记库包含4种类型的标记,分别是:
Struts提供了功能强大的Taglib,充分使用这些Tag,能最大限度的发挥Struts的作用。
由于标记库功能强大,所以掌握它需要花费一定的时间。目前我们可以先从 struts-html taglib 学起,主要精力还是要先放在理解掌握struts导航功能上。
文档《struts 标记库》可以帮助学习掌握struts taglib.
Camino 是基于 struts framework的可视化建模工具。使用camino 可以实现快速设计和开发,主要特点有:
目前Camino的版本有2.05 和 3.0, 可以下载试用版。Camino 自带了帮助文档,可以方便学习Camino。
Struts 1.1 beta 3 的包中包含了几个example, 可以帮助学习struts。
Web应用程序 |
描述 |
Struts-blank.war |
一个简单的web应用程序 |
Struts-documentation.war |
包含struts站点上所有struts文档 |
Struts-example.war |
Struts很多特性的示范 |
Struts-exercisetaglib.war |
|
Struts-template.war |
包含struts模板标记的介绍和范例 |
Struts-upload.war |
一个简单的例子,示范如何使用struts框架上传文件 |
在Tomcat 4.1.18运行环境下,只需要将 xxx.war 文件放到webapps 目录下,启动Tomcat 即可。
建议从struts-example 开始学习,熟读struts-config.xml, jsp, 和 java 源码。
Eclipse 是由IBM支持的开发源码的IDE, 目前的最新版本是2.1。与Netbeans, JBuilder相比,由以下特点:
目前,每个项目使用的开发工具都不同,有JBuilder, Netbeans等。从长远考虑应该采用开发源码的IDE, 不存在盗版问题。现在开发源码的IDE有Netbeans, Eclipse两大阵营,分别由Sun 和 IBM支持。综合上面的Eclipse特性,我推荐统一使用Eclipse。
struts 官方网站:http://jakarta.apache.org/struts
struts resource : http://jakarta.apache.org/struts/resources/index.html
Camino 网站:http://www.scioworks.com/index.html
其他网站:http://husted.com/struts/
http://struts.application-servers.com/main.html
http://www.synthis.com/products/architectures/struts/index.jsp
《struts框架详细介绍》 - ppt 文档,描述了struts 框架
《struts-intro》- ppt 文档,其中的struts 导航流程图非常好。
《Using Struts》 - ppt 文档,概述了struts 框架和组成
《如何在 iAS 6.x 中配置Struts 1.1 beta x》- 讲述在iPlanet 6.x 如何配置 struts 1.1
《Struts标记库》 - 详细介绍了struts taglib的使用
《struts turorial》 - 一个网上购书的示例,详细讲解了struts使用步骤