当工程基础打好之后,我就在想,在服务启动的时候,我们往往会需要进行一些处理,包括静态资源的读取等等,而这些处理有一部分又可以抽离出来。因此我在pub.utils中添加了一个TInit类,用于初始化公共部分。
而在初始化的时候,我需要将一部分信息存储在缓存中,因此我又定义了一个TCach类。这个TCach其实就是一个Map。
但是我不想去直接使用Map,这是为什么了?例如写一个Map的时候,总得这么定义:
Map<String, Object> map = new HashMap<String, Object>();
好吧,我承认我实在是懒得可以。所以我打算构建自己的Map。
考虑到通常来说,HashMap<String, Object>形式的map较为常用,因此我定义了一个TMap,继承HashMap<String, Object>。如此一来,我在进行map定义的时候只要这么写:
TMap map = TMap();
我也觉得自己实在够懒,勿喷哈。
但如果这个map只是这个目的,那实在就太多余了。我先大致贴出这个TMap中目前写好的方法:
大致上,分以下拓展:
1、put方法返回自身,这样可以类似jQuery一样链式调用;
2、提供了几种常用类型的get方法;
3、为get方法添加default值的支持;
4、get方法支持泛型。
加了这几个拓展之后,个人觉得使用起来方便多了,尤其是default和泛型,有兴趣的可以尝试下。
详细代码如下:
package com.tt.pub.map; import java.math.BigDecimal; import java.util.Arrays; import java.util.HashMap; import java.util.Iterator; import java.util.List; import org.nutz.lang.Strings; /** * Desc:自定义的一个map类,继承HashMap,以<String, Object>的形式。 * 目的是为了简化代码编写。以<String, Object>的形式是因为这种形式较为常见。 * 并且提供了一些常用类型的get方法,不用再手动的去转型。 * @author Small * @Email [email protected] * @since 2013-5-14 * */ public class TMap extends HashMap<String, Object>{ /** * */ private static final long serialVersionUID = 1L; public TMap(){} public TMap put(String key, Object value){ super.put(key, value); return this; } public String getStr(String key){ return getStr(key, null); } public String getStr(String key, String def){ Object value = this.get(key); if(value == null) return def; String str = String.valueOf(value); if(str == null) return def; return str; } public int getInt(String key){ return getInt(key, 0); } public int getInt(String key, int def){ Object value = this.get(key); if(value == null) return def; String str = String.valueOf(value); if(Strings.isBlank(str)) return def; return Integer.parseInt(str); } public long getLong(String key){ return getLong(key, 0); } public long getLong(String key, long def){ Object value = this.get(key); if(value == null) return def; String str = String.valueOf(value); if(Strings.isBlank(str)) return def; return Long.parseLong(str); } public double getDouble(String key){ return getDouble(key, 0); } public double getDouble(String key, double def){ Object value = this.get(key); if(value == null) return def; String str = String.valueOf(value); if(Strings.isBlank(str)) return def; return Double.parseDouble(str); } public BigDecimal getBigDecimal(String key){ return getBigDecimal(key, new BigDecimal(0)); } public BigDecimal getBigDecimal(String key, BigDecimal def){ Object value = this.get(key); if(value == null) return def; String str = String.valueOf(value); if(Strings.isBlank(str)) return def; return new BigDecimal(str); } public boolean getBool(String key){ return getBool(key, false); } public boolean getBool(String key, boolean def){ Object value = this.get(key); if(value == null) return def; String str = String.valueOf(value); if(Strings.isBlank(str)) return def; return Boolean.parseBoolean(str); } public List<String> getList4Str(String key){ Object value = super.get(key); if(value instanceof String){ String[] strs = ((String) value).split(","); return Arrays.asList(strs); }else if(value instanceof String[]){ return Arrays.asList((String[])value); } return this.get(key); } public <T> T get(String key){ return get(key, null); } @SuppressWarnings("unchecked") public <T> T get(String key, Object defValue){ Object value = super.get(key); return value == null ? (T) defValue : (T) value; } public Iterator<String> getKItor(){ return this.keySet().iterator(); } }
TCache继承TMap,代码挺简单的就不说明了,以后会再进行拓展:
package com.tt.pub.map; import org.nutz.ioc.Ioc; import org.nutz.ioc.impl.NutIoc; import org.nutz.ioc.loader.json.JsonLoader; import org.nutz.mvc.NutConfig; /** * Desc:系统缓存。 * @author Small * @Email [email protected] * @since 2013-5-14 * */ public class TCache extends TMap{ /** * */ private static final long serialVersionUID = 1L; public static final String DEF_NUT_IOC_PATH = "cfg/ioc/ioc.js"; public static final String BASE_REAL_PATH = "baseRealPath"; private NutConfig nuztConfig; private Ioc ioc; private static TCache cache = new TCache(); private TCache(){}; public static TCache me(){ if(cache == null){ cache = new TCache(); } return cache; } public NutConfig getNuztConfig() { return nuztConfig; } public void setNuztConfig(NutConfig nuztConfig) { this.nuztConfig = nuztConfig; } public Ioc getIoc() { ioc = ioc == null ? new NutIoc(new JsonLoader(DEF_NUT_IOC_PATH)) : ioc; return ioc; } public void setIoc(Ioc ioc) { this.ioc = ioc; } public void setBasePath(String path){ this.put(BASE_REAL_PATH, path); } public String getBasePath(){ return this.getStr(BASE_REAL_PATH); } }
这里有个要说下,之前通过类的静态方法获得实例的,都是写getInstance,后来我懒了,改写为getInst,直到看了nutz,好吧,me!!!
TInit的主要代码如下,以后会再进行拓展:
package com.tt.pub.utils; import javax.servlet.ServletContext; import org.nutz.ioc.Ioc; import org.nutz.mvc.NutConfig; import com.tt.pub.map.TCache; /** * Desc:初始化时进行公共操作。 * @author Small * @Email [email protected] * @since 2013-5-14 * */ public final class TInit { /** * Desc:进行系统初始化工作。 * @author Small * @Email [email protected] * @since 2013-5-14 * * @param cfg */ public static void init(NutConfig cfg){ TCache cache = TCache.me(); cache.setNuztConfig(cfg);//保存当前的NutConfig ServletContext cxt = cfg.getServletContext(); if(cxt != null) cache.setBasePath(cxt.getRealPath(""));//保存web服务的路径 Ioc ioc = cfg.getIoc(); cache.setIoc(ioc);//保存当前的ioc } }