5.3 Struts2的配置文件
Struts2框架主要有两个核心配置文件:struts.properties和struts.xml。struts.xml与Struts1版本中的struts-config.xml非常类似,主要负责管理应用中的Action映射,以及该Action包含的Result定义等,而struts.properties文件则定义了Struts2框架的全局属性。所有的配置文件说明见表5.1。图5.2展示了几个配置文件所在位置和相互关系。
表5.1 Struts2的配置文件
图5.2 配置文件关系图
5.3.1 全局配置文件—struts.properties
struts.properties文件是一个标准的Properties文件,该文件包含了一系列的key-value对象,每个key就是一个Struts2属性,该key对应的value就是一个Struts2属性值。struts.properties文件通常放在Web应用的WEB-INF/classes路径下,实际上,只要将该文件放在Web应用的CLASSPATH路径下,Struts2框架就可以加载该文件。以下是一部分配置片段:
struts.enable.DynamicMethodInvocation=false" struts.devMode=false
还有一种方法是在struts.xml中以<constant name="" value=""></constant>的形式配置这些静态属性,效果与在struts.properties配置的效果是一样的。采取这种方式的项目中可以不包含struts.properties文件而只有struts.xml。
<constant name="struts.enable.DynamicMethodInvocation" value="false" /> <constant name="struts.devMode" value="false" />
表5.2列出了struts.properties配置参数详细情况。
表5.2 struts.properties配置参数
5.3.2 核心配置文件—struts.xml
struts.xml文件主要负责管理应用中的action映射,以及该action包含的result定义等。在struts.properties配置中有一项struts.configuration.files,从这里可以看出struts.xml这个文件名不一定是固定的,可以配置为其他文件名。struts.xml内容主要包括Action、Interceptor、Packages、Namespace等。后面的章节将详细介绍如何配置这些元素。
在struts.xml中可以使用<include>标签把内容分到几个文件中去。这里非常像JSP中的<jsp:include>动作标签,可以把其他文件的内容导入进来,被导入的每个配置文件必须和struts.xml文件有一样的格式。<include>标签的格式如下所示:
<!--引入其他文件--> <include file="example.xml"/> <include file="struts-tiles.xml" /> <include file="struts-xslt.xml" />
5.3.3 struts.xml的默认实现
struts-default.xml这个文件被包含在struts2-core.jar中,从文件名已经可以看出这个文件的作用是struts.xml的默认配置,它将自动被加载然后导入到struts.xml中去。实例5-1是struts-default.xml的部分片段。
【实例5-1】struts-default.xml片段
01 <struts> 02 <bean class="com.opensymphony.xwork2.ObjectFactory" 03 name="xwork" /> 04 <bean type="com.opensymphony.xwork2.ObjectFactory" 05 name="struts" 06 class="org.apache.struts2.impl.StrutsObjectFactory" /> 07 ...... 08 <package name="struts-default" abstract="true"> 09 <result-types> 10 <result-type name="chain" 11 12 class="com.opensymphony.xwork2.ActionChainResult" /> 13 <result-type name="dispatcher" 14 class="org.apache.struts2.dispatcher.ServletDispatcherResult" 15 default="true" /> 16 <result-type name="freemarker" 17 class="org.apache.struts2.views.freemarker.FreemarkerResult" 18 /> 19 <result-type name="httpheader" 20 class="org.apache.struts2.dispatcher.ServletActionRedirectRes 21 ult" /> 22 <result-type name="stream" 23 24 class="org.apache.struts2.dispatcher.StreamResult" /> 25 <result-type name="velocity" 26 class="org.apache.struts2.dispatcher.VelocityResult" /> 27 <result-type name="xslt" 28 29 class="org.apache.struts2.views.xslt.XSLTResult" /> 30 <result-type name="plainText" 31 class="org.apache.struts2.dispatcher.PlainTextResult" /> 32 </result-types> 33 <interceptors> 34 <interceptor name="alias" 35 class="com.opensymphony.xwork2.interceptor.AliasInterceptor" 36 /> 37 <interceptor name="chain" 38 class="com.opensymphony.xwork2.interceptor.ChainingInterceptor" 39 /> 40 </interceptors> 41 </package> 42 </struts>
【代码剖析】在struts-default.xml中定义了很多默认的Bean和Interceptor栈,可以在程序中直接使用。
5.3.4 Velocity模板规则文件
如果在程序中使用了Velocity(一个基于Java的模板引擎,可以替代JSP作为显示页面)可以把文件velocity.properties放到classpath中去,系统将自动加载。同时还要配置struts-default.vm文件,如实例5-2和实例5-3所示。
【实例5-2】属性文件:velocity.properties
01 # Velocity 资源定义. 02 velocimacro.library = action-default.vm, tigris-macros.vm, myapp.vm
【实例5-3】配置文件:struts-default.vm
01 #macro(bean $bean_name $name) 02 #set ($name = $action.bean($bean_name)) 03 #end 04 #macro(includeservlet $name) 05 $action.include($name, $req, $res) 06 #end 07 #macro(url $name) 08 #set ($name = $action.bean("org.apache.struts.util.URLBean")) 09 $name.setRequest($req) 10 $name.setResponse($res) 11 #end 12 #macro(property $object $property) 13 $!{ognl.findValue($property, $object)} 14 #end