inkfish原创,请勿商业性质转载,转载请注明来源(http://blog.csdn.net/inkfish )。
PropertySet 是由opensymphony组织开发的的一个开源项目,但是那个项目文档少,长时间没有更新,官方文档错误奇多,所以现在在项目中使用并不广泛。但这并不妨碍PropertySet成为一个优秀的key-value持久化模块,当前,PropertySet可以说已经够用。这里我整理书写了PropertySet的文档。
PropertySet最容易使用和上手的是memory方式,最常用的是xml、JDBC,另外Hibernate、EJB是较常用的方式。这里选择介绍memory、map、XML方式。
1.Demo
PropertySetDemo.java
import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.InputStream; import java.util.HashMap; import org.apache.commons.io.IOUtils; import org.apache.commons.lang.StringUtils; import com.opensymphony.module.propertyset.PropertySet; import com.opensymphony.module.propertyset.PropertySetManager; import com.opensymphony.module.propertyset.xml.XMLPropertySet; public class PropertySetDemo { public static void main(String[] args) throws Exception { PropertySetDemo demo = new PropertySetDemo(); demo.mapPsDemo(); demo.memoryPsDemo(); demo.xmlPsDemo(); } public void memoryPsDemo() { System.out.println(StringUtils.center("Memory PropertySet Demo", 80, '*')); //memory是配置文件中定义的:<propertyset name="memory" class="com.opensymphony.module.propertyset.memory.MemoryPropertySet"/> PropertySet ps = PropertySetManager.getInstance("memory", null); ps.setBoolean("BooleanPS", true); ps.setString("name", "Tom"); System.out.println(ps.getBoolean("BooleanPS")); System.out.println(ps.getString("name")); System.out.println(StringUtils.repeat("*", 80)); } public void mapPsDemo() { System.out.println(StringUtils.center("Map PropertySet Demo", 80, '*')); @SuppressWarnings("unchecked") HashMap map = new HashMap(); //memory是配置文件中定义的:<propertyset name="memory" class="com.opensymphony.module.propertyset.memory.MemoryPropertySet"/> PropertySet ps = PropertySetManager.getInstance("map", map); ps.setBoolean("BooleanPS", true); ps.setString("name", "Tom"); System.out.println(ps.getBoolean("BooleanPS")); System.out.println(ps.getString("name")); System.out.println(StringUtils.repeat("*", 80)); } public void xmlPsDemo() throws Exception { System.out.println(StringUtils.center("XML PropertySet Demo", 80, '*')); PropertySet ps = PropertySetManager.getInstance("xml", null); InputStream is = new FileInputStream("config.xml"); ((XMLPropertySet) ps).load(is); IOUtils.closeQuietly(is); System.out.println(ps.getBoolean("aa")); System.out.println(ps.getInt("ab")); System.out.println(ps.getLong("ac")); System.out.println(ps.getDouble("ad")); System.out.println(ps.getString("ae")); System.out.println(ps.getText("af").trim()); System.out.println(ps.getDate("ag")); System.out.println(ps.getProperties("ai")); ps.setBoolean("aa", false); ((XMLPropertySet) ps).save(new FileOutputStream("config.xml")); System.out.println(StringUtils.repeat("*", 80)); } }
config.xml
(XML形式下使用):
<?xml version="1.0" ?> <property-set> <property key="aa" type="boolean">false</property> <property key="ab" type="int">123</property> <property key="ac" type="long">98765432109</property> <property key="ad" type="double">2.3</property> <property key="ae" type="string">abcde</property> <property key="af" type="text">fghijk</property> <property key="ag" type="date">2009-18-30 21:18:00</property> <property key="ai" type="properties"> <properties> <property key="passord" type="string">pwd</property> <property key="username" type="string">testuser</property> </properties> </property> </property-set>
需要jar包:
1.propertyset-1.3.jar
2.propertyset中自带的第三方jar包:oscore-2.2.1.jar
、commons-logging-1.1.1.jar
3.xml形式时需要使用的解析的包:xalan.jar
4.其他demo程序用到的工具包:commons-lang-2.4.jar
、commons-io-1.4.jar
2.memory方式
memory顾名思义,把数据存到内存里,刚开始内存里没有东西,程序退出也不会保存,适合于做demo性质的小项目。初始化使用简单的“PropertySet ps = PropertySetManager.getInstance("memory", null);
”即可,然后就可以set和get,注意刚实例化里面什么数据都没有,get不出来东西。
3.map方式
map和memory类似,也是使用内存存取数据,区别是map开始需要初始化一个map作为初始参数传入,初始化代码:
HashMap map = new HashMap(); PropertySet ps = PropertySetManager.getInstance("map", map);
初始化过程的具体实现类是com.opensymphony.module.propertyset.map.MapPropertySet
,初始化过程:
public void init(Map config, Map args){ map = (Map)args.get("map"); if(map == null) map = new HashMap(); }
可以看出PropertySetManager.getInstance("map", map);
传入的map里可以嵌套一个key为"map",值为map类型的Map
,如果传入的map是一个空的Map
,则初始化出一个HashMap
的示例,但千万不能传入null。初始化完毕后,就可以随便使用。
4.XML方式
XML方式的初始化,一定是需要一个XML属性文件,属性文件的格式见上面的config.xml
,里面支持的类型有boolean
、int
、long
、double
、String
、text
、Date
、Properties
、xml
、Object。xml和Object现在还没研究透,实验也没完全成功,放一边不说。Date类型的数据格式是yyyy-MM-dd HH:mm:ss
,写死在PropertySet里的。String和text几乎一样,都按照String处理,但是如果调用了
save()
方法,text前后可能会加一些回车或空格,因此不建议使用text,如果需要使用,则在getText()
后需要trim()
一下。