controller servlet是如何知道你希望的映射的?写一个小java类来创建新的ActionMapping 的实例,并且调用每一个setter方法来赋值是可行的,但是非常繁琐。为了简化这个步骤,Struts包含一个Digester模块,它能够读取一段基于XML的关于需要的映射的描述,并创建合适的对象。参阅API 文档得到关于Digester的更多信息。
开发者的责任是编写一个命名为struts-config.xml 的XML文件,并把它放在你的程序的WEB-INF目录下。文档的格式由"struts-config_1_0.dtd"中的描述指定。最外层的XML元素必须是<struts-config> 。
在<struts-config>元素之内,有两个重要的元素被用于描述你的action: <form-beans> 这一段包含你的form bean的定义。你为每一个form bean使用一个<form-bean> 元素,包含下列属性:
- name: 这个bean的一个唯一的标识名,它将会被用来在action映射中引用来指定这个bean.通常,这也是把这个对象存放在request或者session中的属性的关键字。
- type: 你的form bean的完整的Java类名。
<action-mappings> 这一段包含你的action的定义。你为你的每一个需要定义的action使用一个<action> 元素。每一个action元素需要定义下列的属性:
- path: 这个action的程序上下文相关的路径
- type: 这个Action类的完整类名
- name: Action中所用到的<form bean>元素的名字
示例程序中的struts-config.xml 文件包含了下列的映射元素,它们是用来实现“登录”功能的,我们用它来说明需求。注意其它的Action的条目都被剔除了: <struts-config>
<form-beans>
<form-bean
name="logonForm"
type="org.apache.struts.example.LogonForm" />
</form-beans>
<global-forwards
type="org.apache.struts.action.ActionForward" />
<forward name="logon" path="/logon.jsp"
redirect="false" />
</global-forwards>
<action-mappings>
<action
path="/logon"
type="org.apache.struts.example.LogonAction"
name="logonForm"
scope="request"
input="/logon.jsp"
unknown="false"
validate="true" />
</action-mappings>
</struts-config>
首先定义的是form bean .一个基础的"org.apache.struts.example.LogonForm "类被映射为逻辑名"logonForm "。这个名字也被用在session或者request作为这个form bean的属性名。
"global-forwards "部分用来创建全局可用的逻辑名映射。这儿的任何一个转移都可以通过调用你的action mapping的实例实现,比如actionMappingInstace.findForward("logicalName") 。
你可以看到,这个映射匹配/logon 路径(实际上,因为实例程序用了后缀名映射,你指定的URI请求会是由/logon.do 结尾的)。当收到一个匹配这个路径的请求时,会创建一个LogonAction 的实例(仅当第一次),并且使用它。controller serverl会寻找一个session范围的名为logonForm 的bean,如果需要的话,创建并保存这样的一个bean。
局部的"forward " 元素是可选的但是非常实用。在实例程序中,很多action包含一个局部的"success"和/或"failure"转移作为Action mapping的一部分。 <!-- Edit mail subscription -->
<action path="/editSubscription"
type="org.apache.struts.example.EditSubscriptionAction"
name="subscriptionForm"
scope="request"
validate="false">
<forward name="failure" path="/mainMenu.jsp"/>
<forward name="success" path="/subscription.jsp"/>
</action>
只用了两个额外的属性,示例程序中的Action 类变得几乎和页面设计者用的实际JSP页面的名字无关了。页面可以在重新设计的时候被改名(举个例子),只会给Action 类带来微不足道的冲击。如果“下一个”JSP页面的名字是被硬编码在Action 里面的话,所有的类就必须做出改动。当然,你可以决定在你的程序中使用怎样的局部转移属性。
另一个很有用的部分是<data-sources> ,它定义了你的程序可以使用的数据源。下面是你如何在你的程序的struts-config.xml中指定一个基本的数据源: <struts-config>
<data-sources>
<data-source
autoCommit="false"
description="Example Data Source Description"
driverClass="org.postgresql.Driver"
maxCount="4"
minCount="2"
password="mypassword"
url="jdbc:postgresql://localhost/mydatabase"
user="myusername"/>
</data-sources>
</struts-config>
关于如何获取这个数据源,参阅访问关系数据库这一节。
|