本章我们会向你介绍struts.xml文件,讲解如何最优化你项目的struts.xml.
struts.xml文件
Struts2使用一个配置文件(struts.xml)来初始化它自身的资源.这些资源包括 :
l 拦截器可以对一个请求进行预处理和后期处理.
l Action类可以调用业务逻辑与数据访问的代码.
l 结果可以使用JSP,Velocity和FreeMarker模板来预览.
在运行时,程序仅有一个配置.在运行时之前配置可经由一个或多个XML文件定义,包括默认的struts.xml文件.有如下几个元素可以配置 : packages, namespaces, includes, actions, results, interceptors,exceptions.
struts.xml文件是框架的核心配置文件,它应该放在你的web程序的类路径中.Struts2配置文件的特性有 :
l struts.xml文件允许将一个大的struts.xml文件分解成几个小的struts.xml文件,如果需要,配置文件也可以被导入进来.下面是个例子 :
<struts> ..... ...... <include file="file1.xml"/> <include file="file2.xml"/> ..... ..... </struts>
l 你甚至可以将struts-plugin.xml文件放入一个JAR里,它会被自动加载到程序中.这可以帮助程序员开发自配置的组件.
l 如果你想使用其它框架如Freemaker和Velocity模块,那么模板同样可以在类路径中得到加载.这可以让开发人员将整个模块打包进一个JAR文件.
Struts.xml文件的结构
在上一章我们开发并测试了Hello World程序.下面的就是上个例子的struts.xml样本
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" "http://struts.apache.org/dtds/struts-2.0.dtd"> <struts> <constant name="struts.enable.DynamicMethodInvocation" value="false" /> <constant name="struts.devMode" value="true" /> <package name="roseindia" namespace="/roseindia" extends="struts-default"> <action name="HelloWorld" class="net.roseindia.Struts2HelloWorld"> <result>/pages/HelloWorld.jsp</result> </action> <!-- Add actions here --> </package> <!-- Add packages here --> </struts>
struts.xml文件必须由Struts2文档类型定义(DTD)来确认
该DTD文件提供了struts.xml应该拥有的结构和元素的信息
这是Struts2.0的DTD :
<!-- Struts configuration DTD. Use the following DOCTYPE <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" "http://struts.apache.org/dtds/struts-2.0.dtd"> --> <!ELEMENT struts (package|include|bean|constant)*> <!ELEMENT package (result-types?, interceptors?, default-interceptor-ref?, default-action-ref?, global-results?, global-exception-mappings?, action*)> <!ATTLIST package name CDATA #REQUIRED extends CDATA #IMPLIED namespace CDATA #IMPLIED abstract CDATA #IMPLIED externalReferenceResolver NMTOKEN #IMPLIED > <!ELEMENT result-types (result-type+)> <!ELEMENT result-type (param*)> <!ATTLIST result-type name CDATA #REQUIRED class CDATA #REQUIRED default (true|false) "false" > <!ELEMENT interceptors (interceptor|interceptor-stack)+> <!ELEMENT interceptor (param*)> <!ATTLIST interceptor name CDATA #REQUIRED class CDATA #REQUIRED > <!ELEMENT interceptor-stack (interceptor-ref+)> <!ATTLIST interceptor-stack name CDATA #REQUIRED > <!ELEMENT interceptor-ref (param*)> <!ATTLIST interceptor-ref name CDATA #REQUIRED > <!ELEMENT default-interceptor-ref (param*)> <!ATTLIST default-interceptor-ref name CDATA #REQUIRED > <!ELEMENT default-action-ref (param*)> <!ATTLIST default-action-ref name CDATA #REQUIRED > <!ELEMENT global-results (result+)> <!ELEMENT global-exception-mappings (exception-mapping+)> <!ELEMENT action (param|result|interceptor-ref|exception-mapping)*> <!ATTLIST action name CDATA #REQUIRED class CDATA #IMPLIED method CDATA #IMPLIED converter CDATA #IMPLIED > <!ELEMENT param (#PCDATA)> <!ATTLIST param name CDATA #REQUIRED > <!ELEMENT result (#PCDATA|param)*> <!ATTLIST result name CDATA #IMPLIED type CDATA #IMPLIED > <!ELEMENT exception-mapping (#PCDATA|param)*> <!ATTLIST exception-mapping name CDATA #IMPLIED exception CDATA #REQUIRED result CDATA #REQUIRED > <!ELEMENT include (#PCDATA)> <!ATTLIST include file CDATA #REQUIRED > <!ELEMENT bean (#PCDATA)> <!ATTLIST bean type CDATA #IMPLIED name CDATA #IMPLIED class CDATA #REQUIRED scope CDATA #IMPLIED static CDATA #IMPLIED optional CDATA #IMPLIED > <!ELEMENT constant (#PCDATA)> <!ATTLIST constant name CDATA #REQUIRED value CDATA #REQUIRED >
如果你的程序在功能上不依赖于struts.xml,你可以将它从你的程序中彻底移除.还有一些配置方式可以作为你的选择,例如 : 注释, web.xml启动参数, 和交替的URL映射计划.即使如此,仍有些配置需要Struts2.xml的支持,像全局结果, 异常处理, 以及自定义拦截器栈.
7 楼 gggood118 2013-05-12 20:04
6 楼 sea0108 2012-06-13 10:19
l 你甚至可以将struts-plugin.xml文件放入一个JAR里,它会被自动加载到程序中.这可以帮助程序员开发自配置的组件.
l 如果你想使用其它框架如Freemaker和Velocity模块,那么模板同样可以在类路径中得到加载.这可以让开发人员将整个模块打包进一个JAR文件.
这非常有利于实现模块化配置。
5 楼 tiyan200808 2009-12-19 17:13
4 楼 masuweng 2009-11-17 10:55
3 楼 丁丁豆 2009-10-09 11:03
2 楼 Checkmate 2009-03-30 20:05
嗯,格式上确实有问题,而且我已经编辑了三次了,不知道为什么都不能把整篇文章发出来,只好将它分成两部分了
1 楼 523276508 2009-03-30 16:43