Struts 运行环境
1.1 Struts 1.0 和1.1版本
当前主要有两个版本,struts 1.0 release 和 struts 1.1 beta 3。Struts 1.0 和1.1差别很大,主要有两点:
- Struts 1.1 中引用了很多 apache其他项目的类包,如:xml 解析、日志、验证等,因此struts1.1 的包结构与1.0 完全不同。在struts 1.1环境下,一个webapp 要成功运行,除了struts.jar 外,还需要引用12个包。
- Struts 1.1 增加了很多新功能,例如,支持sub-applications, 动态FormBean,异常处理,验证,支持Tile templating等。
尽管struts 1.0 是正式发布版,但是结构已经老化,功能也已经固化。所以我们的Framework不选用struts 1.0, 而选用 struts 1.1。
1.2支持struts的应用服务器
根据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 |
1.3配置说明
我们公司目前项目中使用较多的应用服务器是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框架
2.1 struts 体系结构
struts framework是MVC 模式的体现,下面分别从模型、视图、控制来看看struts的体系结构(Architecture)。下图显示了struts framework的体系结构响应客户请求时,各个部分工作的原理。
Struts体系结构
2.1.1 从视图角度(View)
主要由JSP建立,struts自身包含了一组可扩展的自定义标签库(TagLib),可以简化创建用户界面的过程。目前包括:Bean Tags,HTML Tags,Logic Tags,Nested Tags,Template Tags。
2.1.2从模型角度(Model)
模型主要是表示一个系统的状态(有时候,改变系统状态的业务逻辑操作也也划分到模型中)。在Struts中,系统的状态主要有ActiomForm Bean体现,一般情况下,这些状态是非持久性的。如果需要将这些状态转化为持久性数据存储,Struts本身也提供了Utitle包,可以方便的与数据库操作。
2.1.3 从控制器角度(Controller)
在Struts framework中, Controller主要是ActionServlet,但是对于业务逻辑的操作则主要由Action、ActionMapping、ActionForward这几个组件协调完成。其中,Action扮演了真正的业务逻辑的实现者,而ActionMapping和ActionForward则指定了不同业务逻辑或流程的运行方向。
2.2 struts 的组件
框架中所使用的组件:
ActionServlet |
控制器 |
ActionClass |
包含事务逻辑 |
ActionForm |
显示模块数据 |
ActionMapping |
帮助控制器将请求映射到操作 |
ActionForward |
用来指示操作转移的对象 |
ActionError |
用来存储和回收错误 |
Struts标记库 |
可以减轻开发显示层次的工作 |
2.3 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 中可以定义下面内容:
- 全局转发
- ActionMapping类
- ActionForm bean
- JDBC数据源
2.3.1 配置全局转发
全局转发用来在JSP页之间创建逻辑名称映射。全局转发的例子:
<global-forwards>
<forwardname="logoff"path="/logoff.do"/>
<forwardname="logon"path="/logon.jsp"/>
<forwardname="registration"path="/registration.jsp"/>
<forwardname="success"path="/mainMenu.jsp"/>
</global-forwards>
|
属性 |
描述 |
Name |
全局转发的名字 |
Path |
与目标URL的相对路径 |
2.3.2 配置ActionMapping
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()方法来转发资源 |
2.3.3 配置ActionForm Bean
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
|
类的完全限定名
|
2.3.4 配置JDBC数据源
例子:
<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标记库
struts 标记库包含4种类型的标记,分别是:
- struts-bean taglib:在访问bean和bean属性时使用的tag,也包含一些消息显示的tag。
- struts-html taglib:用来生成动态HTML用户界面和窗体的tag。
- struts-logic taglib :用来管理根据条件生成输出文本,和其它一些用来控制的信息。
- struts-template taglib:用来定义模板机制。
Struts提供了功能强大的Taglib,充分使用这些Tag,能最大限度的发挥Struts的作用。
由于标记库功能强大,所以掌握它需要花费一定的时间。目前我们可以先从 struts-html taglib 学起,主要精力还是要先放在理解掌握struts导航功能上。
文档《struts 标记库》可以帮助学习掌握struts taglib.
可视化设计工具和代码生成器Camino
Camino 是基于 struts framework的可视化建模工具。使用camino 可以实现快速设计和开发,主要特点有:
- 支持struts 1.0 和 struts 1.1
- 通过storyboard , 可视化定义页面导航流程,配置struts-config.xml 文件。
- Jsp converter wizard 功能可以将普通jsp 转换成带struts-html taglib 的jsp
- Code Generator wizard 功能可以自动生成 Action 和 FormBean 类的框架。
- Camin 3.0 还提供了验证器和Preview Jsp 的功能。
目前Camino的版本有2.05 和 3.0, 可以下载试用版。Camino 自带了帮助文档,可以方便学习Camino。
Struts example
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标记 |
Struts-template.war |
包含struts模板标记的介绍和范例 |
Struts-upload.war |
一个简单的例子,示范如何使用struts框架上传文件 |
在Tomcat 4.1.18运行环境下,只需要将 xxx.war 文件放到webapps 目录下,启动Tomcat 即可。
建议从struts-example 开始学习,熟读struts-config.xml, jsp, 和 java 源码。
6、统一的IDE工具: eclipse
Eclipse 是由IBM支持的开发源码的IDE, 目前的最新版本是2.1。与Netbeans, JBuilder相比,由以下特点:
- 界面设计精细,布局合理,秉承了IBM的风格。
- 功能齐全,具备了Netbeans, JBuilder(Enterprice fetature 除外)大部分功能,还有一些特有的功能,如:代码历史记录比较、替换,代码重构,自动生成get,set方法, 小组协作方式的版本控制和权限控制。
- 速度快,执行一个代码格式化(14,000行)的操作,要比Netbeans快百倍以上。
- 功能强大的plug-in,可以与Ant, JUnit, Tomcat集成。将来我们也可以编写自己的插件,有增强功能的潜力。
目前,每个项目使用的开发工具都不同,有JBuilder, Netbeans等。从长远考虑应该采用开发源码的IDE, 不存在盗版问题。现在开发源码的IDE有Netbeans, Eclipse两大阵营,分别由Sun 和 IBM支持。综合上面的Eclipse特性,我推荐统一使用Eclipse。
7、参考资料
- 网站:
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使用步骤