服务热线:13616026886

技术文档 欢迎使用技术文档,我们为你提供从新手到专业开发者的所有资源,你也可以通过它日益精进

位置:首页 > 技术文档 > JAVA > 新手入门 > 基础入门 > 查看文档

struts 的安装、配置与运行

一、struts的起源

  struts最早是作为apache jakarta项目的组成部分,项目的创立者希望通过对该项目的研究,改进和提高javaserver pages 、servlet、标签库以及面向对象的技术水准。struts这个名字来源于在建筑和旧式飞机中使用的支持金属架。这个框架之所以叫"struts",是为了提醒我们记住那些支撑我们房屋,建筑,桥梁,甚至我们踩高跷时候的基础支撑。这也是一个解释struts在开发web应用程序中所扮演的角色的精彩描述。当建立一个物理建筑时,建筑工程师使用支柱为建筑的每一层提供支持。同样,软件工程师使用struts为业务应用的每一层提供支持。它的目的是为了帮助我们减少在运用mvc设计模型来开发web应用的时间。我们仍然需要学习和应用该架构,不过它将可以完成其中一些繁重的工作。如果想混合使用servlets和jsp的优点来建立可扩展的应用,struts是一个不错的选择。

  早期smalltalk 程序语言便采用了mvc(model-view -controller) 模式( patterns ) 以增加程序代码弹性,mvc模式将程序代码整理切割为三部份,model 部分是业务与应用领域( business domain) 相关逻辑、管理状态之对象,controller 部分接收来自view 所输入的资料并与model 部分互动,是业务流程控制( flow control) 之处,view 部分则负责展现资料、接收使用者输入资料。在java 应用中,jfc/swing、awt、jsp 皆是可用作view 之技术规格,而javabean 与enterprise javabean 规格则可用于model 程序代码,一旦应用程序以mvc 模式加以适当之分割,model 部分程序代码可在不同使用者接口外观之应用程序中重复使用。

  随着jsp 与servlet 技术大量应用于以web 为基础之应用程序,java 开发人员群体认为应以较佳之模式以提升web 应用程序之可维护性与重复使用性。早期jsp 规格书中曾列举两种可行之jsp 应用架构,分别为model1 与model 2。

  在model 1 架构中,jsp 直接处理web 浏览器送来之请求( request ),并辅以javabean 处理应用相关逻辑。model 1 架构单纯编写比较容易,但在model 1 中jsp 可能同时肩负view 与controller 角色,两类程序代码有可能混杂而不易维护。而model 2 中将servlet 纳入架构中扮演前端controller 角色,将web 浏览器送出之请求集中送至servlet ,servlet 可集中管理使用者登入、权限控制、多国语言转换等前置处理,再视需求转向给对应之jsp 处理。model 2 中采用了较佳之mvc 模式,但增加了编写复杂度。

  struts是apache软件基金下jakarta项目的一部分。除struts之外,还有其他成功的开源产品,包括tomcat, ant 和velocity。2000 年craig r. mcclanahan 先生贡献了他编写的jsp model 2 架构之application framework 原始程序代码给apache 基金会,成为apache jakarta 计划struts framework 前身。

  开始的代码基础从2000年5月开始开发,直到2001年6月,1.0版本发布。有30 多个开发者参与进来,并有数千人参与到讨论组中。struts 代码基础由一个志愿的commnitter团队来管理。到2002年,struts 小组共有9个志愿commnitter。

  struts框架的主要架构设计和开发者是craig r.mcclanahan。craig 也是tomcat 4的主要架构师,以及java web services developer pack的主要架构师和实现者。他现在是sun的javaserver faces (jsr-127) 以及j2ee平台的web层架构的规范领导。craig r. mcclanahan 先生是jcp expertgroup 成员之一,曾参与jsp 规格制定与tomcat 4 之编写,因此struts framework 广受java 开发人员群体所重视。borland 自2002 年底开始于开发工具jbuilder 中支持struts framework。  二、struts安装

  1、安装struts需要的软件

  java development kit-- 我们需要download和install 1.2(或之后)版本的jdk。

   下载地址:

   http://java.sun.com/j2se

  servlet container -- 通常的选择是下载tomcat(至少是3.1版,推荐使用4.0以上的版本)。

   下载地址:

   http://jakarta.apache.org/tomcat

  ant build system -- 如果我们通过struts源码发布包安装,我们必须下载1.1或之后版本的ant build system。在我们通过struts来开发我们自己的web应用程序是,推荐使用ant来build我们的应用。

   下载地址:

   http://jakarta.apache.org/ant

  servlet api classes -- 为了编译structs自己,或应用程序使用struts,我们需要一个包含servlet和jsp api对象的servlet.jar包。大多数servlet container(例如tomcat)已经自带了这个文件。否则,我们必需下载:http://jakarta.apache.org/builds/jakarta-servletapi

  xml parser -- structs需要一个与java api for xml parsing(jaxp)规格兼容的xml处理器,我们可以使用xerces。

   下载地址:

   http://xml.apache.org/xerces-j

  xalan xslt processor -- 如果我们通过structs源码发布版来构造我们的structs系统,我们必须下载和安装1_2_d01或之后版本的xalan xslt处理器(xerces中已自带xalan)。这个处理器用于将基于xml的structs文档转换为html文档。

  2、通过源码构造structs

  1)下载structs的源码发布包。

  2)设置ant_home环境变量,指向我们的ant目录。

  3)设置java_home环境变量,指向我们的jdk目录。

  4)设置servletapi_home环境变量,指向我们的servlet api目录(如果我们的classpath已经包含了servlet.jar,就不需要指定该目录)

  5)将structs的源码发布包进行解包。

  6)进入structs目录,运行以下命令:

  ./build.sh dist

  该命令将创建struts的二进制发布包,目录在../dist/structs(相对于我们的编译目录)。

  3、通过struts的二进制发布包安装structs

  1)下载struts的二进制发布版。

  2)将struts的二进制发布版进行解包。(如果我们是通过struts源码构造struts,build的结果就已经是已解包的struts)。解包后的struts包含以下内容:

  lib/struts.jar -- 这个文件包含了struts的所有java对象。我们需要把它拷贝到我们的web应用的web-inf/lib目录。

  lib/structs.tld --这是一个"tag library descriptor"文件,它描述了struts库的自由tag。需要将它拷贝到我们的web应用的web-inf目录。

  webapps/struts-documentation.war -- 这是一个"web application archive"文件,包含了所有的struts文档。我们可以将它安装到支持servlet api 2.2或之后版本的servlet container(推荐使用tomcat)中。

  webapps/struts-example.war -- 这是一个web应用实例,它广泛地演示了struts的许多功能。我们可以将它安装到兼容servlet2.2或之后版本以及jsp1.1或之后版本规范的servlet容器中(推荐使用tomcat)。
webapps/struts-test.war -- 这个web应用包含了struts支持的许多tag的测试网页,可以作为使用struts tag的例子。

  4、struts的基本组件包

  安装好的struts大约有15包,近200个类所组成,而且数量还在不断的扩展。在此我们不能一一介绍,只能列举几个主要的简要的介绍一下。下表说明了目前struts api中基本的几个组件包,包括
action,actions,config,util,taglib,validator。如下表1所示:

org.apache.struts.action
 基本上,控制整个struts framework的运行的核心类、组件都在这个包中,比如我们上面提到的控制器actionservlet。已经action,actionform,actionmapping等等。struts1.1比1.0多了 dynaactionform 类。增加了动态扩展生成formbean功能
org.apache.struts.actions
 这个包是主要作用是提供客户的http请求和业务逻辑处理之间的特定适配器转换功能,而1.0版本中的部分动态增删frombean的类,也在struts1.1中被action包的dynaactionform组件所取代
org.apache.struts.config
 提供对配置文件struts-config.xml元素的映射。这也是sturts1.1中新增的功能
org.apache.struts.util
 strtuts为了更好支持web application的应用,体统了一个些常用服务的支持,比如connection pool和message source。详细信息请参考http://jakarta.apache.org/struts/api/org/apache/struts/util/package-summary.html
org.apache.struts.taglib
 这不是一个包,而是是一个客户标签类的集合。下面包括bean tags,html tags,logic tags,nested tags,template tags这几个用于构建用户界面的标签类。
org.apache.struts.validator
 struts1.1 framework中增加了validator framework,用于动态的配置from表单的验证。详细信息请参阅 http://home.earthlink.net/~dwinterfeldt/

  下面的图则显现了这几个组件包之间的关系。其中action是整个struts 架构的核心。

struts 的安装、配置与运行
三、struts 配置与组件介绍

  有关struts组件配置struts-config.xml文件说明在前面的文章中已经介绍过,这里就不再说了,下面主要介绍框架中组件与配置。

  下表列出了struts的核心类,即对应的经典的mvc组件职责。

  表格2 核心struts 类和mvc 的对应

描述
actionforward 用户指向或者视图选择
actionform状态改变的数据
actionmapping状态改变事件
actionservlet控制器,接受用户请求和状态改变,以及发出视图选择
action控制器的一部分,于模型交互,执行状态改变或状态查询,以及告诉actionservlet 下一个选择的视图

  除了这些核心类, struts 使用一些配置文件和视图助手(view helpers)来沟通控制器和模型。下表列出了struts 配置文件和描述了他们在架构中的角色。

  表格3 strtuts 配置文件

文件
目的
applicationresources.properties存储本地化信息和标签,以使应用可以国际化
struts-config.xml 存储控制器对象的缺省配置,包括模型支持的用户指向,状态改变,状态查询

  为将struts配置数据暴露给视图,框架以jsp标签的形式提供了大量的助手类,如表4 strtus 视图助手。


标记库描述符目的
struts-html.tld 扩展html form的jsp标记
struts-bean.tld 扩展处理javabean的jsp标记
struts-logic.tld扩展测试属性值的jsp标记

  控制器组件的配置

  框架中的控制器组件是有org.apache.struts.action.actionservlet类实现的,这个类是javax.servlet.http.httpservlet类的扩展。

  actionservlet配置:

  我们需要在web.xml中声明actionservlet,并且将它配置成启动时进行加载。以下为可以配置的初始化参数:

参数默认值描述
applicationnull应用程序的资源集合的类
buffersize4096 文件上传的缓冲区大小
config /web-inf/struts-config.xml配置文件的位置和名称
content text/html默认的内容类型
debug 0 程序调试的级别
detail 0 程序调试细节的级别
factory null 消息资源工厂,用于国际化中解释消息资源
formbean org.apache.struts.action.actionformbean封装actionform bean信息的类的名称
forward org.apache.struts.action.actionforward 封装actionforward对象信息的类的名称
locale true 为true,将在用户会话中存储一个本地对象
mappingorg.apache.struts.action.actionforward封装actionmapping信息的类的名称
maxfilesize250m 上传文件的最大尺寸
multipartclass org.apache.struts.action.actionforward 处理多部分请求的类的名称
nocache false http标头是否要设置为禁止缓寸
nulltrue 设置为true,对于无效的信息关键字将返回null
tempdir作为一个servlet参数提供给程序的工作目录 处理下载文件是使用的临时工作目录
validate true 是否使用新格式的配置文件
vallidatingtrue 是否对配置文件进行有效性分析

  大多数情况下,标准的servlet就能够满足用户需要。

  第一次收到特定请求的uri时,actionservlet将适当的action类进行实例化,然后actionservlet在action类实例中以servlet为变量名存储一个引用。当被实例化后,action类会被暂存以备再用。

  错误处理

  struts提供了两个类来处理错误:actionerrors和actionerror,它们都扩展org.apache.struts.action。actionerrors保存着actionerror对象的集合,其中每一个代表了独立的错误信息。每个actionerror都包含了关键字,能够映射到资源文件中存储的错误信息,而这个资源文件是在actionservlet初始化参数中指定的。 四、struts的运行

  可通过以下的步骤在我们自己的应用程序中使用struts:

  1、将struts目录的lib/struts.jar拷贝到web应用的web-inf/lib目录。

  2、将struts目录的lib/struts*.tld拷贝到web应用的web-inf目录。

  3、修改web应用目录的web-inf/web.xml文件,增加一个<servlet>元素来定义controller servlet,增加一个<servlet-mapping>元素来建立uri请求与servlet的对应关系。可以参照struts例子中的web-inf/web.xml文件来了解详细的语法要求。

  4、修改web应用目录的web-inf/web.xml文件,使之包含以下的tag库定义:

<taglib>
<taglib-uri>/web-inf/struts.tld</taglib-uri>
<taglib-location>/web-inf/struts.tld</taglib-location>
</taglib>
<taglib>
<taglib-uri>/web-inf/struts-bean.tld</taglib-uri>
<taglib-location>/web-inf/struts-bean.tld</taglib-location>
</taglib>
<taglib>
<taglib-uri>/web-inf/struts-logic.tld</taglib-uri>
<taglib-location>/web-inf/struts-logic.tld</taglib-location>
</taglib>

  5、创建一个web-inf/action.xml文件来定义我们的web应用的action映射关系。可以参照struts例子中的action.xml文件来了解详细的语法要求。

  6、在使用struts tag库的jsp网页中加入以下tag库定义:

<@ taglib uri="/web-inf/struts.tld" prefix="struts" %>
<@ taglib uri="/web-inf/struts-bean.tld" prefix="bean" %>
<@ taglib uri="/web-inf/struts-logic.tld" prefix="logic" %>

  7、最后,在编译我们的web应用的java程序时,不要忘了在classpath中包含struts.jar文件。

  五、struts优缺点

  优点:

  struts跟tomcat、turbine等诸多apache项目一样,是开源软件,这是它的一大优点。使开发者能更深入的了解其内部实现机制。除此之外,struts的优点主要集中体现在两个方面:taglib和页面导航。taglib是struts的标记库,灵活动用,能大大提高开发效率。另外,就目前国内的jsp开发者而言,除了使用jsp自带的常用标记外,很少开发自己的标记,或许struts是一个很好的起点。

  关于页面导航,我们认为那将是今后的一个发展方向,事实上,这样做,使系统的脉络更加清晰。通过一个配置文件,即可把握整个系统各部分之间的联系,这对于后期的维护有着莫大的好处。尤其是当另一批开发者接手这个项目时,这种优势体现得更加明显。

  缺点:

  taglib是struts的一大优势,但对于初学者而言,却需要一个持续学习的过程,甚至还会打乱我们网页编写的习惯,但是,当我们习惯了它时,我们会觉得它真的很棒。struts将mvc的controller一分为三,在获得结构更加清晰的同时,也增加了系统的复杂度。毫无疑问,要理解 struts 必须接受一定的培训。随着变化的不断加入,这有时会令人很沮丧。

  struts从产生到现在还不过3-4年时间,就已逐步越来越多运用于商业软件。虽然它现在还有不少缺点,但它是一种非常优秀的j2ee mvc实现方式,如果我们的系统准备采用j2ee mvc架构,那么,不妨考虑一下struts。

  struts 是一种基于 web 的 mvc 解决方案,所以必须用 html、jsp 文件和 servlet 来实现它,struts 需要支持 jsp 1.1 和 servlet 2.2 规范的 servlet 容器。学习、理解和掌握struts是我们每个基于j2ee软件开发人员一门必修的课程,也是我们对企业j2ee技术应用的进一步深化。

扫描关注微信公众号