Struts 2.x权威指南
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

3.3.3 struts.properties文件与常量配置

Struts 2框架有两个核心配置文件,其中struts.xml文件主要负责管理应用中的Action映射,以及该Action包含的Result定义等。除此之外,Struts 2框架还包含一个struts.properties文件,该文件定义了Struts 2框架的常量(也被称为Struts 2属性),开发者可以通过改变这些常量(属性)来满足应用的需求。

struts.properties文件是一个标准的Properties文件,该文件包含了一系列的key-value对象,每个key就是一个Struts 2常量,该key对应的value就是一个Struts 2常量值。

配置Struts 2常量有3种方式:

在struts.properties文件中配置常量。

在web.xml文件中配置核心Filter时通过初始化参数来配置常量。

在struts.xml文件中使用<constant.../>元素来配置常量。

通常,Struts 2框架按如下搜索顺序加载Struts 2常量。

(1)struts-default.xml:该文件保存在struts2-core-2.3.1.2.jar文件中。

(2)struts-plugin.xml:该文件保存在struts2-xxx-2.3.1.2.jar等Struts 2插件JAR包中。

(3)struts.xml:该文件是Web应用自己的Struts 2配置文件。

(4)struts.properties:该文件是Web应用默认的Struts 2配置文件。

(5)web.xml:该文件是Web应用的配置文件。

上面指定了Struts 2框架搜索Struts 2常量的顺序,如果在多个文件中配置了同一个Struts 2常量,则后一个文件中配置的常量值会覆盖前面文件中配置的常量值。

在不同文件中配置常量的方式是不一样的,但不管在哪个文件中,配置Struts 2常量都需要指定两个属性:常量name和常量value。

在struts.xml文件中通过<constant.../>元素来配置常量,配置常量需要指定两个必填的属性。

name:该属性指定了常量的常量名。

value:该属性指定了常量的常量值。

例如,如果需要指定Struts 2的国际化资源文件的baseName为mess,则可以在struts.xml文件中使用如下的代码片段。

<struts>
    <!-- 通过constant元素配置Struts 2的属性 -->
    <constant name="struts.custom.i18n.resources" value="mess" />
    ...
</struts>

对于struts.properties文件而言,该文件的内容就是一系列的key-value对,其中每个key对应一个Struts 2常量的常量名,而每个value对应一个Struts 2常量的常量值。

例如,如下代码片段:

# 指定了Struts 2应用处于开发阶段
struts.devMode=true

上面的配置片段配置了名为struts.devMode的Struts 2常量,该常量值为true。

在web.xml文件中配置Struts 2常量,可通过<filter>元素的<init-param>子元素指定,每个<init-param>元素配置了一个Struts 2常量。

下面的代码片段在 web.xml 文件中,配置 Struts 2 应用所需要的国际化资源文件的baseName。

<filter>
<!-- 指定Struts 2的核心Filter -->
    <filter-name>struts2</filter-name>
    <filter-class>org.apache.struts2.dispatcher.ng
          .filter.StrutsPrepareAndExecuteFilter</filter-class>
    <!-- 通过init-param元素配置Struts 2常量 -->
    <init-param>
          <param-name>struts.custom.i18n.resources</param-name>
          <param-value>mess</param-value>
    </init-param>
</filter>

在上面的web.xml文件中,当配置StrutsPrepareAndExecuteFilter时,还通过<init-param.../>子元素配置了Struts 2常量,指定了国际化资源文件的baseName为mess。

在实际开发中,不推荐在web.xml文件中配置Struts 2常量。毕竟,采用这种配置方式来配置常量需要更多的代码量,而且降低了web.xml文件的可读性。通常推荐将Struts 2常量集中在struts.xml文件中进行集中管理。

提示:

通常推荐在struts.xml文件中定义Struts 2属性,而不是在struts.properties文件中定义Struts 2属性,因为这样更加简洁。

现在的问题是,struts.properties文件的哪些key是有效的?即struts.properties文件里包含的哪些常量是有效的Struts 2常量?下面列出了可以在struts.properties中定义的Struts 2常量。

提示:

在 struts2-core-2.3.1.2.jar 压缩文件的 org/apache/struts2 路径下有一个default.properties文件,该文件里为Struts 2的所有常量都指定了默认值,读者可以通过查看该文件来了解Struts 2所支持的常量。

struts.configuration:该常量指定加载Struts 2配置文件的配置文件管理器。该常量的默认值是org.apache.struts2.config.DefaultConfiguration,这是Struts 2默认的配置文件管理器。如果需要实现自己的配置管理器,开发者则可以实现一个实现Configuration接口的类,该类可以自己加载Struts 2配置文件。

struts.locale:该常量指定Web应用的默认Locale。

struts.i18n.encoding:该常量指定 Struts 2 应用编码默认使用的字符集。该常量对于处理中文请求参数非常有用,如需获取中文请求参数值,应该将该常量值设置为GBK或者GB2312。

提示:

当设置该参数为GBK时,相当于执行了HttpServletRequest的setCharacterEncoding ("GBK")方法。

struts.objectFactory:该常量指定Struts 2默认的ObjectFactory Bean。

struts.objectFactory.spring.autoWire:该常量指定 Spring 框架的自动装配模式。该常量的默认值是name,即默认根据Bean的name进行自动装配。

struts.objectFactory.spring.useClassCache:该常量指定整合Spring框架时,是否缓存Bean实例。该常量只允许使用true和false两个值,它的默认值是true。通常不建议修改该常量值。

struts.objectFactory.spring.autoWire.alwaysRespect:设置该常量为 true 保证自动装配策略总是有效。该常量的默认值是false。

struts.objectTypeDeterminer:该常量指定 Struts 2 的类型检测机制,通常支持 tiger 和notiger两个值。

struts.multipart.parser:该常量指定处理multipart/form-data的MIME类型(文件上传)请求的框架,该常量支持cos、pell和jakarta等常量值,即分别对应使用cos的文件上传框架、pell上传及common-fileupload文件上传框架。该常量的默认值为jakarta。

注意

如果需要使用cos或者pell的文件上传方式,则应该将对应的JAR文件复制到Web应用中。例如,使用cos上传方式,则需要自己下载cos框架的JAR文件,并将该文件放在WEB-INF/lib路径下。

struts.multipart.saveDir:该常量指定上传文件的临时保存路径。该常量的默认值是javax.servlet.context.tempdir。

struts.multipart.maxSize:该常量指定Struts 2文件上传中整个请求所允许上传的最大字节数。

struts.custom.properties:该常量指定Struts 2应用加载用户自定义的属性文件,该属性文件配置的常量不会覆盖 struts.properties 文件中配置的常量。如果需要加载多个自定义属性文件,多个自定义属性文件的文件名应以英文逗号(,)隔开。

struts.mapper.class:该常量指定将HTTP请求映射到指定Action的映射器。Struts 2提供了默认的映射器org.apache.struts2.dispatcher.mapper.DefaultActionMapper,默认的映射器根据请求的前缀与Action的name属性完成映射。

struts.action.extension:该常量指定需要 Struts 2 处理的请求后缀。该常量的默认值是action,即所有匹配*.action的请求都由Struts 2处理。如果用户需要指定多个请求后缀,则多个后缀之间以英文逗号(,)隔开。

提示:

《Struts 2权威指南》面市以来,笔者收到一些读者来信询问如何改变Struts 2拦截请求的后缀,他们认为Struts 1是在web.xml文件中配置拦截*.do的,而在Struts 2中找不到相应的配置,于是感到很迷惘,其实Struts 2更简单,只要修改此处即可。

struts.serve.static:该常量设置是否通过JAR文件提供静态内容服务。该常量只支持true和false值,默认值是true。

struts.serve.static.browserCache:该常量设置浏览器是否缓存静态内容。当应用处于开发阶段时,我们希望每次请求都获得服务器的最新响应,则可设置该常量为false。

struts.enable.DynamicMethodInvocation:该常量设置Struts 2是否支持动态方法调用。该常量的默认值是true。如果需要关闭动态方法调用,则可设置该常量为false。

struts.enable.SlashesInActionNames:该常量设置Struts 2是否允许在Action名中使用斜线。该常量的默认值是false。如果开发者允许在Action名中使用斜线,则可设置该常量为true。

struts.tag.altSyntax:该常量指定是否允许在Struts 2标签中使用表达式语法,因为通常都需要在标签中使用表达式语法,故此常量应该设置为true。该常量的默认值是true。

struts.devMode:该常量设置Struts 2应用是否使用开发模式。如果设置该常量为true,则可以在应用出错时显示更多、更友好的出错提示。该常量只接受true和false两个值,该常量的默认值是 false。通常,当应用处于开发阶段时,将该常量设置为 true;当进入产品发布阶段后,则该常量设置为false。

提示:

当把该常量设置为true之后,相当于把struts.i18n.reload、struts.configuration.xml. reload两个常量都设为true。

struts.i18n.reload:该常量设置是否每次HTTP请求到达时,系统都重新加载资源文件。该常量默认值是false。在应用开发阶段将该常量设置为true会更有利于开发,但在产品发布阶段应将该常量设置为false。

提示:

开发阶段将该常量设置为true,则可以在每次请求时都重新加载国际化资源文件,从而可以让开发者看到实时开发效果;产品发布阶段应该将该常量设置为false,是为了提供响应性能,每次请求都需要重新加载资源文件会大大降低应用的性能。

struts.ui.theme:该常量指定视图标签默认的视图主题。该常量的默认值是xhtml。

struts.ui.templateDir:该常量指定视图主题所需要模板文件的位置。该常量的默认值是template,即默认加载template路径下的模板文件。

struts.ui.templateSuffix:该常量指定模板文件的后缀,该常量的默认常量值是ftl。该常量还允许使用ftl、vm或jsp,分别对应于FreeMarker、Velocity和JSP模板。

struts.configuration.xml.reload:该常量设置当 struts.xml 文件改变后,系统是否自动重新加载该文件。该常量的默认值是false。

struts.velocity.configfile:该常量指定Velocity框架所需的velocity.properties文件的位置。该常量的默认值为velocity.properties。

struts.velocity.contexts:该常量指定 Velocity 框架的 Context 位置,如果该框架有多个Context,则多个Context之间以英文逗号(,)隔开。

struts.velocity.toolboxlocation:该常量指定Velocity框架的toolbox的位置。

struts.url.http.port:该常量指定Web应用所在的监听端口。该常量通常没有太大的用途,只是当Struts 2需要生成URL时(例如url标签),该常量才提供Web应用的默认端口。

struts.url.https.port:该常量的作用类似于struts.url.http.port常量,区别是该常量指定的是Web应用的加密服务端口。

struts.url.includeParams:该常量指定Struts 2生成URL时是否包含请求参数。该常量接受none、get和all三个值,分别对应于不包含、仅包含GET类型请求参数和包含全部请求参数。

struts.custom.i18n.resources:该常量指定Struts 2应用所需要的国际化资源文件,如果有多个国际化资源文件,则多个资源文件的文件名以英文逗号(,)隔开。

struts.dispatcher.parametersWorkaround:对于某些 Java EE 服务器,不支持HttpServletRequest调用getParameterMap()方法,此时可以设置该常量值为true来解决该问题。该常量的默认值是false。对于WebLogic、Orion和OC4J服务器,通常应该设置该常量为true。

struts.freemarker.manager.classname:该常量指定Struts 2使用的FreeMarker管理器。该常量的默认值是 org.apache.struts2.views.freemarker.FreemarkerManager,这是 Struts 2内建的FreeMarker管理器。

struts.freemarker.templatesCache:设置该常量为true,可以启用FreeMarker的模板缓存功能。该常量的默认值是false。

struts.freemarker.beanwrapperCache:设置该常量为 true 可以启用 FreeMarker 的BeanWrapper缓存功能。该常量的默认值是false。

struts.freemarker.wrapper.altMap:该常量只支持true和false两个值,默认值是true。通常无须修改该常量值。

struts.freemarker.mru.max.strong.size:该常量的默认值为100。

struts.xslt.nocache:该常量设置XSLT Result是否使用样式表缓存。当应用处于开发阶段时,该常量通常被设置为 true;当应用处于产品使用阶段时,该常量通常被设置为false。

struts.mapper.alwaysSelectFullNamespace:该常量设置是否总是使用命名空间。该常量的默认值是false。

struts.ognl.allowStaticMethodAccess:该常量设置是否允许在OGNL表达式中调用静态方法。该常量的默认值是false。

struts.el.throwExceptionOnFailure:该常量设置当表达式计算失败时,或表达式里某个常量不存在时是否抛出一个RuntimeException异常。该常量的默认值是false。

struts.ognl.logMissingProperties:该常量设置是否记录(以Warning日志级别))表达式中所有找不到的常量。该常量的默认值是 false。如果将该常量设置为 true,将会看到控制台输出大量的调试信息,看上去十分烦琐。

struts.ognl.enableExpressionCache:该常量设置对OGNL表达式的计算结果进行缓存,这种缓存可能导致内存泄漏。该常量的默认值是true。