突然想写篇文章了,在SS3EX中如何读取属性文件,需求是:页面和类中的方法都能访问的全局变量,满足3个因数:1是速度快,2是消耗小,3是读取方便:
1、利用spring框架的内部类PropertyPlaceholderConfigurer
Srping2.5中新加入了‘context’命名空间,这个命名空间让我们能够得到更为简洁的方式来实现属性占位符(property placeholder)的配置:
该方法是在项目启动时,就自动由spring初始化了,而且是Spring Singleton范围,速度是在内存中,快,消耗是一次性的,小,读取的时候分为2种情况,类中读取和页面读取,
页面读取要引入定义的BEAN,故在XML文件中还要专门写个BEAN,注入所有的属性,在调用的类中引用这个BEAN。页面的读取必须要经过ACTION的出来才能读取,或者放入
APPLICATION中,或者在action中生成要读取变量的get和set方法,看来读取还是很麻烦的;
2、利用spring框架的内部类PropertiesFactoryBean
该方法的速度和消耗及类中读取同方法一,页面读取很简单:${webRoot},所以该方法优于第一种。
3、直接写个普通类,例如:Config.java
参数webconfig代表的是文件名为webconfig属性文件
该方法在action中调用ALIPAY_KEY变量时,直接Config.ALIPAY_KEY,由于属性是静态的,所以第一次访问后就进入了内存,速度快,全局的,消耗只一次,小,页面访问时同方法一。
4、通过Spring的工具类在程序中读取属性文件,假设jdbc.properties 是位于类路径下的文件
1、利用spring框架的内部类PropertyPlaceholderConfigurer
<!-- 定义受环境影响易变的变量 -->
<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="systemPropertiesModeName" value="SYSTEM_PROPERTIES_MODE_OVERRIDE" />
<property name="ignoreResourceNotFound" value="true" />
<property name="locations">
<list>
<!-- 标准配置 -->
<value>classpath*:/application.properties</value>
<!-- 本地开发环境配置 -->
<value>classpath*:/application.local.properties</value>
<!-- 服务器生产环境配置 -->
<!-- <value>file:/var/myapp/application.server.properties</value> -->
</list>
</property>
</bean>
Srping2.5中新加入了‘context’命名空间,这个命名空间让我们能够得到更为简洁的方式来实现属性占位符(property placeholder)的配置:
<context:property-placeholder location="classpath:jdbc.properties"/>
配置文件中的其他BEAN
<!-- 数据源配置,使用应用内的DBCP数据库连接池 -->
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
<!-- Connection Info -->
<property name="driverClassName" value="org.apache.derby.jdbc.ClientDriver" />
<property name="url" value="${jdbc.url}" />
<property name="username" value="${jdbc.username}" />
<property name="password" value="${jdbc.password}" />
……
该方法是在项目启动时,就自动由spring初始化了,而且是Spring Singleton范围,速度是在内存中,快,消耗是一次性的,小,读取的时候分为2种情况,类中读取和页面读取,
页面读取要引入定义的BEAN,故在XML文件中还要专门写个BEAN,注入所有的属性,在调用的类中引用这个BEAN。页面的读取必须要经过ACTION的出来才能读取,或者放入
APPLICATION中,或者在action中生成要读取变量的get和set方法,看来读取还是很麻烦的;
2、利用spring框架的内部类PropertiesFactoryBean
<bean id="freemarkerConfiguration" class="org.springframework.beans.factory.config.PropertiesFactoryBean">
<property name="location" value="classpath:resources/freemarker.properties"/>
</bean>
<bean id="freemarkerConfig"
class="org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer">
<!-- 直接将Freemarker.propertyies写在单独的.properties注入进来 -->
<property name="freemarkerSettings" ref="freemarkerConfiguration"/>
<property name="templateLoaderPath" value="/WEB-INF/ftl/" />
<!-- 全局变量部分 -->
<property name="freemarkerVariables">
<map>
<entry key="xml_escape" value-ref="fmXmlEscape" />
<entry key="webRoot" value="${webRoot}" />
<entry key="cssRoot" value="${cssRoot}" />
<entry key="jsRoot" value="${jsRoot}" />
</map>
</property>
<property name="defaultEncoding" value="utf-8" />
</bean>
该方法的速度和消耗及类中读取同方法一,页面读取很简单:${webRoot},所以该方法优于第一种。
3、直接写个普通类,例如:Config.java
public class WebConfig {
private final static ResourceBundle rb = ResourceBundle.getBundle("webconfig");
public static String ALIPAY_KEY=rb.getString("ALIPAY_KEY");
……
参数webconfig代表的是文件名为webconfig属性文件
该方法在action中调用ALIPAY_KEY变量时,直接Config.ALIPAY_KEY,由于属性是静态的,所以第一次访问后就进入了内存,速度快,全局的,消耗只一次,小,页面访问时同方法一。
4、通过Spring的工具类在程序中读取属性文件,假设jdbc.properties 是位于类路径下的文件
Properties props = PropertiesLoaderUtils.loadAllProperties("jdbc.properties");
System.out.println(props.getProperty("jdbc.driverClassName"));
通过Struts2自带的标签,去读后台的静态文件(参照博客的另一篇文章[url]:http://san586.iteye.com/blog/468582[/url]),或者用<spring:message>在页面上直接读取。综上所述:同等的条件下,
方法 速度 消耗 类中读取 页面读取
方法一 √ √
方法二 √ √ 方便
方法三 √ √ 方便
方法四 √ √ 方便 方便