使用Struts框架的一个好处就是可以用外部配置文件声明的方式来指定应用程序的很多配置,这样就可以不用将很多信息硬编码到应用程序里面,这样大大的简化了开发的过程.因为可以对应用程序进行各种更改而不需要重新编译任何的代码.所以struts的启动是这样的:在启动应用程序的时候Struts加载配置文件,并且创建了一系列与文件中的设置相对应的配置对象.然后,Struts使用这些配置来引导操作.
Struts配置文件是在定义Struts的ActionServlet的使用时,在Web.xml部署描述符文件中指定的,如下:
<web-app>
………..
<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</param-value>
</init-param>
<init-param>
<param-name>debug</param-name>
<param-value>3</param-value>
</init-param>
<init-param>
<param-name>detail</param-name>
<param-value>3</param-value>
</init-param>
<load-on-startup>0</load-on-startup>
</servlet>
………..
</web-app>
通过声明名为config的Servlet初始化参数来指定Struts配置文件,config参数必须设置成您配置文件相对于WEB应用程序的路径中,这个路径在受到保护的/WEB-INF/目录下,所以,只能通过服务器端应用程序对其进行访问.
从1.1版开始,Struts支持多个配置文件的使用,这样配置设置可以分解为多个单独的文件,以便于开发人员小组同时研究一个应用程序,而不会出现配置文件的使用冲突,要指定多个配置文件,只需要列出每个配置文件,并且用逗号将配置文件隔开.
<init-param>
<param-name>
config
</param-name>
<param-value>
/WEB-INF/struts-config1.xml,
/WEB-INF/struts-config2.xml,
/WEB-INF/struts-config3.xml
</param-value>
</init-param>
Struts在加载配置文件的时候,如果文件有任何的重叠,后面加载的配置文件将覆盖前面配置文件中的设置.
除了支持多个配置文件外,Struts1.1之后还添加了对应用程序模块的支持.如下配置.
<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</param-value>
</init-param>
<init-param>
<param-name>config/ModuleA</param-name>
<param-value>/WEB-INF/struts-config-A.xml</param-value>
</init-param>
<init-param>
<param-name>config/ModuleB</param-name>
<param-value>/WEB-INF/struts-config-B.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
上面分别定义了ModuleA和ModuleB两个模块的逻辑名称.对于模块配置文件,参数名称必须以config/开头,这样Struts才能识别它们.
Struts配置文件标记:
标记 | 说明 |
action | 用于将应用程序URL映射至请求指定的URL时,将执行的Action对象或者将其映射至要将其转发到的另外的一个URL |
action-mappings | 用于封装应用程序的一组操作 |
controller | 为Struts应用程序定义许多全局配置设置 |
data-source | 用于定义应用程序可以用来访问数据库或者类似资源的java数据源. |
data-sources | 用于封装应用程序的一组数据源 |
exception | 用于定义处理Action抛出的特定的异常的异常处理程序 |
form-bean | 用于定义一个FormBean并且为其指定逻辑名称 |
form-beans | 用于封装应用程序的一组FormBeans |
form-property | 用于定义动态FormBean的表单属性 |
forward | 用于定义URL的逻辑名称,这样,代码可以引用逻辑名称而无需引用URL本身 |
global-exception | 用于封装exception标记定义的,应用程序的一组全局异常处理程序 |
global-forwards | 用于封装forward标记定义的,应用程序的一组全局forward |
message-resources | 用于定义在查找具体化的字符串,消息和标签的时候Struts将使用的资源束 |
plug-in | 用于定义Struts在应用程序启动时加载和在应用程序关闭时卸载的插件. |
set-property | 用于定义一种属性,并且为其赋值 |
struts-config | 该标记为Struts配置文件的根标记,因此封装文件中的所有的其他的标志. |
1) action标记
action标记用于将应用程序URL映射至当请求指定的URL时将执行的Action对象,或者将URL映射至要将请求转发的另外一个URL.
使用action标记有三个方法:
① 使用type属性将org.apache.struts.action.Action子类映射至path属性指定的应用程序URL.
② path属性指定的URL匹配时,使用forward属性通过调用RequestDispatcher.forward()来指定要转发的URL.
③ path属性指定的URL匹配时,使用include属性通过RequestDispatcher.include()来制定要转发的URL.
属性 | 说明 | 必需 |
attribute | 用于指定请求范围或者会话范围的名称,与当前操作相关联的FormBean将以该名称存储.通常情况下,name属性指定的名称用于查找FormBean,然而,如果使用了本属性,name属性将被替代,只有指定了name属性,本属性才有效. | 否 |
className | 为当前Action定义指定要实例化的配置对象的全限定类名,默认值为org.apach.struts.config.ActionConfig | 否 |
forward | 如果当前Action映射路径匹配,则指定一个要转发到的相对于模块的URL.使用RequestDispacher.forward()执行转发.每次只能指定本属性,include和type属性这三者中的一个. | 否 |
input | 如果与当前Action关联的FormBean被设置要进行验证并且验证过程失败,则指定一个相对于模块的URL,控制权将交给该URL,只有指定了name属性,本属性才有效. | 否 |
name | 指定由form-bean标记定义的FormBean的逻辑名称,此逻辑名称将与当前的操作关联. | 否 |
path | 指定要映射到的相对于模块的URL | 是 |
parameter | 指定一个值,该值将作为通用配置参数在每次执行操作时,传递到type属性定义的Action对象 | 否 |
prefix | 指定填充当前Action的关联FormBean时,要添加到请求参数名称的前缀.因此,如果请求参数名为”username”并且prefix属性被设置为”search”,则将对FormBean调用一个名为setSearchUsername()的方法,只有指定了name属性,本属性才有效. |
|
roles | 指定一个允许访问当前Action的安全角色列表,以逗号分隔 | 否 |
scope | 指定范围(“请求”或者”会话”),此范围将与name属性一起作用于访问与该操作相关联的FormBean.只有指定了name属性,本属性才有效. | 否 |
suffix | 指定填充当前Action的关联FormBean时,要添加到请求参数名称的后缀,因此如果请求参数名字为”username”并且suffix属性被设置为”search”,则将对FormBean调用一个名为setUserNameSearch()的方法,只有指定了name属性,本属性才有效 | 否 |
type | 指定要与当前Action映射关联的org.apache.struts.action.Action的子类的全限定类名.每次只能指定本书性,forward和include属性这三者中的其中一个. | 否 |
unkown | 可设置成true或者false,表示是否将该操作设置为应用程序的默认操作.如果设置为true,此操作定义将处理任何与其他映射不匹配的应用程序URL,只有在每个模块中配置一个action定义是,才可以将其设置为true,默认为false. | 否 |
vlidate | 可以设置成true或者false,表示name属性指定的FormBean在执行当前Action之前是否调用validate()方法.只有指定了name属性,本属性才有效,默认是是true.(后来改成false了?) | 否 |
正如上面所说的,使用action标记有三种方法,使用举例:
① 定义一个全局异常处理程序
<action-mapping>
<action path=”/search” type=”com.yinhai.app.SearchAction”/>
</action-mapping>
这个例子使用type属性指定一个Action对象,该对象将在指定的路径匹配的时候被执行.
② 使用action标记的方法如下所示:
<action-mapping>
<action path=”/search” forward=”/search.jsp”/>
</action-mapping>
该例子使用了forward属性指定当前的路径匹配时,将通过使用RequestDispatcher.forward()转发”/search.jsp”URL.
③ 使用了action标记的第三种方法:
<action-mapping>
<action path=”/search” include=”/search.jsp”/>
</action-mapping>
该示例使用include属性指定当指定的路径匹配时,将通过使用RequestDispatcher.include()转发”/search.jsp”URL.
2) action-mappings标记
action-mappings标记用于封装应用程序的一组操作.该标记只是action的一个容器.举例说明:
<action-mappings>
<action path=”/search1” type=”com.yinhai.app.SearchAction”/>
<action path=”/search2” forward=”/search2.jsp”/>
<action path=”/search3” include=”/search3.jsp”/>
</action-mappings>
3) controller标记
controller标记用于为Struts应用程序定义许多全局配置设置.在Struts的早期版本中,许多全局配置设置时通过在Web.xml中指定Struts的ActionServlet的初始化参数来进行配置的.但是在Struts1.1之后添加了对应用程序模块的支持之后,这些设置被转移到Struts的配置文件当中,从而可以在每一个模块的基础上对其进行配置.
属性 | 说明 | 必需 |
bufferSize | 指定用于文件加载的输入缓冲的大小,默认为4096字节 | 否 |
className | 为当前的controller定义指定要实例化的配置对象的全限定类名.默认值为org.apache.struts.config.ControllerConfig | 否 |
contentType | 指定将每个HTTP相应设置的内容类型以及可选字符编码,请注意,此设置可以由Action,JSP或者转发请求的类似资源覆盖,默认值为”text/html” | 否 |
debug | 已经过时了,通过配置您的底层记录库来替代 | 否 |
forwardPattern | 指定forward标记的path属性以何种方式映射到URL $M 由该模块的前缀替换 $P 由选中的forward的path值替换 $$ 产生一个要使用的文字美元符号留作将来使用并将被无提示忽略 默认值是$M$P | 否 |
inputForward | 可以设置成true或者设置成false,表示action标记的input属性是否可以作为使用其路径的forward的名称处理.如果设置成false(默认值),action标记的input属性将作为实际路径使用.默认值为false | 否 |
locale | 可以设置为”true”或者”false”,表示用户会话中将是否存储java.util.Locale对象,默认值是true | 否 |
maxFileSize | 为文件上载指定最大空间(以字节为单位).此外,如果您在值的末尾添加K,M,或者G,则此空间将分别解释为千字节,兆字节或者千兆字节.默认值为250M | 否 |
memFileSize | 指定文件上载时要将储存在内存中最大空间,以字节为单位.此外如果您在值的末尾添加K,M,G,则此空间将分别解释为千字节,兆字节,千兆字节.高于此阀值的文件将写入磁盘.默认的值为256K | 否 |
multipartClass | 指定要用来处理文件上载的对象的全限定类名,默认的名称为org.apache.struts.upload.CommonsMultipartRequestHandler | 否 |
nocache | 可以设置成true或者false,表示HTTP标头是否可以被添加到每个响应中以禁用浏览器缓存,默认值为false | 否 |
pagePattern | 指定Struts的标记库的page属性以何种方式映射到URL $M 由该模块的前缀替换 $P 由选中的标记的page属性替换 $$ 产生一个要使用的文字美元符号($) 所有其他的$x 变量,留作将来使用并将被无忽略提示 默认值为$M$P | 否 |
processorClass | 指定将要用于此模块的RequestProcessor子类的全限定类名 默认名称为org.apache.struts.action.RequestProcessor | 否 |
temDir | 指定在文件上载过程中用来存储数据的临时目录 | 否 |
使用示例:
由于controller标记的很多属性都是可选的,因此有许多不同的方法来使用此标记.
<controller maxFileSize=”3M”/>
将文件上传的最大空间设置为3MB.
4) data-source标记
data-source标记用于定义java的数据源,您的应用程序可以使用此数据源来访问数据库或者类似的资源.使用嵌套的set-property标记配置此数据源.
属性 | 说明 | 必需 |
className | 为当前数据源定义指定要实例化的配置对象的全限定类名 默认名称为org.apache.struts.config.DataSourceConfig | 否 |
key | 指定将存储数据源的Servlet环境属性关键字,如果使用应用程序模块,模块前缀将追加该关键字,比如说$key ${prefix} 默认为常量org.apache.struts.Globals.DATA_SOURCE_KEY的内容 | 否 |
type | 为此数据源指定要实例化的对象的全限定类名,必需要实现javax.sql.DataSource | 否 |
举例:
<data-sources>
<data-source>
<set-property property=”driverClass” value=”org.postgresql.Driver”/>
</data-source>
</data-sources>
一般情况下,如果您没有定义多个数据源,则无需为data-source标记自身设置任何属性.您所需要做的事情就是使用嵌套的set-property标记配置您的数据源.set-property标记将用于在初始化数据源时调用数据源的某些设置值方法.
5) data-sources标记
data-sources标记用于封装应用程序的一组数据源,该标记只是data-source标记的容器.
6) exception标记
exception标记用于定义异常处理程序以处理Action抛出的特定的异常.此 功能使您可以为操作抛出的每种类型的异常指派不同的处理程序.
使用exception标记有两种方法.
① 通过在global-exceptions标记中包含exception标记来定义全局异常处理程序.全局异常处理程序应用于所有操作
② 通过在action标记下嵌套exception标记来定义特定操作的异常处理程序.特定操作的异常处理程序只适用于包含它的操作,并将覆盖同一目标异常的所有全局异常处理程序.
属性 | 说明 | 必需 |
bundle | 指定资源的Servlet环境属性的关键字,该资源束由message-resources标记定义,bundle标记将用于检索包含key属性指定的关键字的信息 | 否 |
className | 为当前异常定义指定要实例化的配置对象的全限定类名,默认名称为org.apache.struts.config.ExceptionConfig | 否 |
handler | 指定异常处理程序的全限定类名称 | 否 |
key | 指定此处理程序要使用的资源束消息关键字 | 是 |
path | 指定当此异常处理程序被触发时要重定向到的相对于模块的URL | 否 |
scope | 指定将用于访问此异常的org.apache.struts.action.ActionError对象的范围,请求,或者是会话 | 否 |
type | 指定异常处理程序所对应的异常类的全限定类名 | 是 |
举例:
① 定义一个全局异常处理程序
<global-exceptions>
<exception type=”com.yinhai.app.DateFormatException” key=”errors.date.format”
path=”/error.jsp”/>
</global-exceptions>
② 以下是使用exception标记的第二种方法:
<action-mappings>
<action path=”/search” type=”com.yinhai.app.SearchAction”>
<exception type=”com.yinhai.app.DateFormatException”
key=”errors.date.format”
path=”/searchError.jsp”/>
</action>
</action-mappings>
第二个例子定义了一个特定操作的异常处理程序,此异常处理程序只适用于包含它的操作,并将覆盖同一目标异常的全局异常处理程序.
7) form-bean标记
form-bean标记用于定义一个FormBean,并且为之指派逻辑名称,Struts使用FormBean在提交表单并且在显示表单之前填充表单.
使用form-bean标记有两种方法,如下所示:
① 通过指定包含type属性的具体类来定义一个具体的FormBean.这要求创建org.apache.struts.action.ActionForm类的一个子类并且创建所有的值获取和值设置的方法.
② 通过使用type属性定义动态FormBean以指定类型为org.apache.struts.action.DynaActionForm或者其子类的FormBean,使用这种方法,您可以使用form-property标记在配置文件中指定FormBean的每个字段.
属性 | 说明 | 必需 |
className | 为当前FormBean定义指定要实例化的配置对象的全限制类名,默认名称为org.apache.struts.config.FormBeanConfig | 否 |
dynamic | 已经过时了…. | 否 |
name | 指定FormBean的逻辑名称(…attribute) | 是 |
type | 指定FormBean类的全限定类名 | 是 |
使用例子:
第一种方法:
<form-beans>
<form-bean name=”logonForm”
type=”org.apache.struts.action.DynaActionForm”>
<form-property name=”username”
type=”java.lang.String”/>
<form-property name=”password”
type=”java.lang.String”/>
</form-bean>
</form-beans>
第二种方法:
<form-beans>
<form-bean name=”logonForm”
type=”com.yinhai.app.logonForm”/>
</form-beans>
上面第一个实例定义了其属性由嵌套的form-property标记指定的动态FormBean.请注意,type属性被设置为org.apache.struts.action.DynaActionForm,这告诉Struts,FormBean的属性石在配置文件中定义的.
8) form-beans标记
form-beans标记用于封装应用程序的一组FormBeans,该标记只是FormBean标记的容器