当工程基础打好之后,我就在想,在服务启动的时候,我们往往会需要进行一些处理,包括静态资源的读取等等,而这些处理有一部分又可以抽离出来。因此我在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 536762164@qq.com
* @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 536762164@qq.com
* @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 536762164@qq.com
* @since 2013-5-14
*
*/
public final class TInit {
/**
* Desc:进行系统初始化工作。
* @author Small
* @Email 536762164@qq.com
* @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
}
}