网站首页
JSP空间
动态资讯
开源项目
技术文档
资源下载
J2EE资源
客户论坛
在线支付
 
  技术文档>>JAVA>>新手入门>>基础入门>查看文档  
  深入理解struts 1.1及应用开发实例解析     
  文章作者:未知  文章来源:水木森林  
  查看:94次  录入:管理员--2007-11-17  
 
  作为基于mvc模式的web应用最经典框架,struts已经正式推出了1.1版本,该版本在以往版本的基础上,提供了许多激动人心的新功能。本文就将带你走进struts1.1去深入地了解这些功能。
  
  说明:希望本文的读者能有一定的struts使用基础。
  
  1、model 2 struts是基于model 2之上的,而model 2是经典的mvc(模型-视图-控制器)模型的web应用变体,这个改变主要是由于网络应用的特性--http协议的无状态性引起的。
  
  model 2的目的和mvc一样,也是利用控制器来分离模型和视图,达到一种层间松散耦合的效果,提高系统灵活性、复用性和可维护性。在多数情况下,你可以将model 2与mvc等同起来。
  
  在利用model 2之前,我们是把所有的表示逻辑和业务逻辑都集中在一起(比如大杂烩似的jsp),有时也称这种应用模式为model 1,model 1的主要缺点就是紧耦合,复用性差以及维护成本高。
  
  2、struts 1.1 和model 2
  
  既然struts 1.1是基于model 2之上,那它的底层机制也就是mvc,首先,控制器(actionservlet)进行初始化工作,读取配置文件(struts-config.xml),为不同的struts模块初始化相应的moduleconfig对象。比如配置文件中的action映射定义都保存在actionconfig集合中。相应地有controlconfig集合、formbeanconfig集合、forwardconfig集合和messageresourcesconfig集合等。
  
  提示:模块是在struts1.1中新提出的概念,在稍后的内容中我们将详细介绍,你现在可以简单地把模块看作是一个子系统,它们共同组成整个应用,同时又各自独立。struts1.1中所有的处理都是在特定模块环境中进行的。模块的提出主要是为了解决struts1.0中单配置文件的问题。
  
  控制器接收http请求,并从actionconfig中找出对应于该请求的action子类,如果没有对应的action,控制器直接将请求转发给jsp或者静态页面。否则控制器将请求分发至具体action类进行处理。
  
  在控制器调用具体action的execute方法之前,actionform对象将利用http请求中的参数来填充自己(可选步骤,需要在配置文件中指定)。具体的actionform对象应该是actionform的子类对象,它其实就是一个javabean。
  
  此外,还可以在actionform类中调用validate方法来检查请求参数的合法性,并且可以返回一个包含所有错误信息的actionerrors对象。如果执行成功,actionform自动将这些参数信息以javabean(一般称之为form bean)的方式保存在servlet context中,这样它们就可以被其它action对象或者jsp调用。
  
  struts将这些actionform的配置信息都放在formbeanconfig集合中,通过它们struts能够知道针对某个客户请求是否需要创建相应的actionform实例。
  
  action很简单,一般只包含一个execute方法,它负责执行相应的业务逻辑,如果需要,它也进行相应的数据检查。执行完成之后,返回一个actionforward对象,控制器通过该actionforward对象来进行转发工作。
  
  我们主张将获取数据和执行业务逻辑的功能放到具体的javabean当中,而action只负责完成与控制有关的功能。遵循该原则,所以在上图中我将action对象归为控制器部分。
  
  提示:其实在struts1.1中,actionmapping的作用完全可以由actionconfig来替代,只不过由于它是公共api的一部分以及兼容性的问题得以保留。actionmapping通过继承actionconfig来获得与其一致的功能,你可以等同地看待它们。同理,其它例如actionforward与forwardconfig的关系也是如此。
  
  3、模块
  
  我们知道,在struts1.0中,我们只能在web.xml中为actionservlet指定一个配置文件,这对于我们这些网上的教学例子来说当然没什么问题,但是在实际的应用开发过程中,可能会有些麻烦。因为许多开发人员都可能同时需要修改配置文件,但是配置文件只能同时被一个人修改,这样肯定会造成一定程度上的资源争夺,势必会影响开发效率和引起开发人员的抱怨。struts 1.1 在struts 1.1中,为了解决这个并行开发的问题,提出了两种解决方案:
  
  1. 多个配置文件的支持
  
  2. 模块的支持
  
  支持多个配置文件,是指你能够为actionservlet同时指定多个xml配置文件,文件之间以逗号分隔,比如struts提供的mailreader演示例子中就采用该种方法。
  
  <!-- action servlet configuration -->
  <servlet>
  <servlet-name>action</servlet-name>
  <servlet-class>org.apache.struts.action.
  actionservlet</servlet-class>
  <init-param>
  <param-name>config</param-name>
  <param-value>/web-inf/struts-config.xml, /web-inf/struts-config-registration.xml
  </param-value>
  </init-param>
  <load-on-startup>1</load-on-startup>
  </servlet>
  
  这种方法可以很好地解决修改冲突的问题,不同的开发人员可以在不同的配置文件中设置自己的action、actionform等等(当然不是说每个开发人员都需要自己的配置文件,可以按照系统的功能模块进行划分)。
  
  但是,这里还是存在一个潜在的问题,就是可能不同的配置文件之间会产生冲突,因为在actionservlet初始化的时候这几个文件最终还是需要合并到一起的。比如,在struts-config.xml中配置了一个名为success的,而在struts-config-registration.xml中也配置了一个同样的,那么执行起来就会产生冲突。
  
  为了彻底解决这种冲突,struts 1.1中引进了模块(module)的概念。一个模块就是一个独立的子系统,你可以在其中进行任意所需的配置,同时又不必担心和其它的配置文件产生冲突。因为前面我们讲过,actionservlet是将不同的模块信息保存在不同的moduleconfig对象中的。要使用模块的功能,需要进行以下的准备工作:
  
  1.为每个模块准备一个配置文件
  
  2.配置web.xml文件,通知控制器
  
  决定采用多个模块以后,你需要将这些信息告诉控制器,这需要在web.xml文件进行配置。下面是一个典型的多模块配置:
  
  <init-param>
  <param-name>config</param-name>
  <param-value>/web-inf/struts-config.xml
  </param-value>
  </init-param>
  <init-param>
  <param-name>config/customer</param-name>
  <param-value>/web-inf/struts-config-customer.xml
  </param-value>
  </init-param>
  <init-param>
  <param-name>config/order</param-name>
  <param-value>/web-inf/struts-config-order.xml
  </param-value>
  </init-param>
  
  要配置多个模块,你需要在原有的一个(在struts1.1中将其对应的模块称为缺省模块)的基础之上,增加模块对应的。其中表示为config/xxx的形式,其中xxx为对应的模块名,中还是指定模块对应的配置文件。上面这个例子说明该应用有三个模块,分别是缺省模块、customer和order,它们分别对应不同的配置文件。
  
  3、准备各个模块所需的actionform、action和jsp等资源
  
  但是要注意的是,模块的出现也同时带来了一个问题,即如何在不同模块间进行转发?有两种方法可以实现模块间的转发,一种就是在(全局或者本地)中定义,另外一种就是利用org.apache.struts.actions.switchaction。
  
  下面就是一个全局的例子:
  ...
  <struts-config>
  ...
  <global-forwards>
  <forward name="tomoduleb"
  contextrelative="true"
  path="/moduleb/index.do"
  redirect="true"/>
  ...
  </global-forwards>
  ...
  </struts-config>
  
  可以看出,只需要在原有的path属性前加上模块名,同时将contextrelative属性置为true即可。此外,你也可以在中定义一个类似的本地。
  
  <action-mappings>
  <!-- action mapping for profile form -->
  <action path="/login"
  type="com.ncu.test.loginaction"
  name="loginform"
  scope="request"
  input="tile.userlogin"
  validate="true">
  <forward name="success"
  contextrelative="true"
  path="/modulea/login.do"/>
  </action>
  </action-mappings>
  
  如果你已经处在其他模块,需要转回到缺省模块,那应该类似下面这样定义,即模块名为空。
  
  <forward name="success"
  contextrelative="true"
  path="/login.do"/>
  
  此外,你也可以使用org.apache.struts.actions.switchaction,例如:
  
  ...
  <action-mappings>
  <action path="/tomodule"
  type="org.apache.struts.actions.switchaction"/>
  ...
  </action-mappings>
  ...
  
  4、actionservlet
  
  我们首先来了解mvc中的控制器。在struts1.1中缺省采用actionservlet类来充当控制器。当然如果actionservlet不能满足你的需求,你也可以通过继承它来实现自己的类。这可以在/web-inf/web.xml中来具体指定。
  
  要掌握actionservlet,就必须了解它所扮演的角色。首先,actionservlet表示mvc结构中的控制器部分,它需要完成控制器所需的前端控制及转发请求等职责。其次,actionservlet被实现为一个专门处理http请求的servlet,它同时具有servlet的特点
 
 
上一篇: struts源代码阅读(commons-beanutils包)    下一篇: 运用jakarta struts的七大实战心法解析
  相关文档
eclispe下开发struts完整解决乱码问题 11-17
java加密与解密 自定义类加载器的应用 11-16
servlet的实例变量是线程不安全的,而其jsp也默认是以多线程方式.. 11-17
java入门--对java两个io基础类的理解 02-25
多线程编程的设计模式 临界区模式 11-17
java类精彩问答 11-17
java ee 5规范横空出世 11-17
怎样用java实现msn messager的功能 11-17
图解java开发工具jbuilder 9.0 11-16
命令行参数 11-17
如何在js中将字符串转为xml对象,并读取对象的值 11-17
你好,jogl - java与opengl的绑定 11-17
tomcat下jsp、servlet和javabean环境配置 (1) 10-23
scriptenginemajorversion 函数 11-16
探索java应用程序的安全需求 11-17
进阶:当前流行的j2ee web应用架构分析 01-09
java程序员需要了解的几个开源协议 11-17
用javabean实现文件上载(四)方法 11-16
实战java多线程编程精要之限制优先级 11-16
用ant 开发 java 程序 11-17
返回首页 | 关于我们 | J网章程 | JSP空间合租 | 客服中心 | 免责声明 | 常见问题 | 参观机房
本站主机空间代理至厦门市华众网络科技有限公司
《中华人民共和国增值电信业务经营许可证》
编号:闽B2-20050079
@2005-2008福建JSP技术网 版权所有 闽ICP备05000928号
技术电话:13616026886
邮箱:admin@fjjsp.com 站长QQ,点击这里给我发消息