JavaWeb从入门到精通(视频实战版)
上QQ阅读APP看书,第一时间看更新

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