*博主也做過幾個或大或小的web後台項目,其中資料庫必不可少有字典表用來儲存一些常用的業務字典,頁面渲染也少不了各種標籤以及運算式.我們在查詢資料時候,主表一般會儲存字典表的主鍵,然後通過聯表查詢來擷取對應的字典.現在我想分享一種"另一種方式",和大家一起討論學習*
思路如下:
1.在web容器初始化時,將字典表中資料全部緩衝起來(HashMap,或者第三方緩衝).
2.資料查詢時不再與字典表進行關聯.
3.頁面渲染時候用自訂tld標籤進行資料展示.
大家也許會對tld標籤陌生,但是提及JSTL運算式的fn函數大家一定不陌生,fn函數給我們提供的方法在這裡我不再進行一一闡述.其中的實現也是通過java來進行實現(是不是很熟悉。。。)
自訂tld只不過是對其進行自訂擴充,廢話少說,迴歸正題,開始coding
//通過類型擷取字典列表public static List<EtlDict> getEtlDictList(String type){ //建立全域緩衝 Map<String, List<EtlDict>> etlDictMap = (Map<String, List<EtlDict>>)CacheUtils.get(CACHE_ETLDICT_MAP); if (etlDictMap==null){ etlDictMap = Maps.newHashMap(); //字典表按照類型進行儲存 for (EtlDict gt : etlDictDao.findAllList(new EtlDict())){ List<EtlDict> dictList = etlDictMap.get(gt.getType()); if (dictList != null){ dictList.add(gt); }else{ etlDictMap.put(gt.getType(), Lists.newArrayList(gt)); } } CacheUtils.put(CACHE_ETLDICT_MAP, etlDictMap); } List<EtlDict> etlDictList = etlDictMap.get(type); if (etlDictList == null){ etlDictList = Lists.newArrayList(); } return etlDictList;}//通過類型和值擷取標籤public static String getEtlDictLabel(String value, String type, String defaultValue){ if (StringUtils.isNotBlank(type) && StringUtils.isNotBlank(value)){ for (EtlDict gt : getEtlDictList(type)){ if (type.equals(gt.getType()) && value.equals(gt.getValue())){ return gt.getLabel(); } } } return defaultValue;}
進行自訂tld檔案建立與定義
<?xml version="1.0" encoding="UTF-8" ?><taglib xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd" version="2.0"> <description>JSTL 1.1 functions library</description> <display-name>JSTL functions etl</display-name> <tlib-version>1.1</tlib-version> <short-name>fna</short-name> <uri>http://java.sun.com/jsp/jstl/functionse</uri> <function> <description>方法描述</description> <name>方法名字</name> <function-class>方法所在類</function-class> <function-signature>傳回值 方法名(參數)</function-signature> <example>運用舉例</example> </function> <function> <description>擷取字典對象列表</description> <name>getEtlDictList</name> <function-class>gt.com.etl.common.utils.EtlDictUtils</function-class> <function-signature>java.util.List getEtlDictList(java.lang.String)</function-signature> <example>${fna:getEtlDictList(type)}</example> </function> <function> <description>通過類型和值擷取標籤</description> <name>getEtlDictLabel</name> <function-class>gt.com.etl.common.utils.EtlDictUtils</function-class> <function-signature>java.lang.String getEtlDictLabel(java.lang.String, java.lang.String, java.lang.String)</function-signature> <example>${fna:getEtlDictLabel(value, type, defaultValue)}</example> </function>
自訂的tld檔案引用方法和jstl的標籤引用大同小異
在頁面用使用自訂的tld標籤
<td> ${fna:keepTwoDecimal(asset.costPrice)}</td><td> ${fna:keepTwoDecimal(asset.sellPrice)}</td><td> ${fna:getEtlDictLabel(asset.source,'source','')}</td>
編碼完畢,您看懂了麼。。
和大家分享目的有兩點:
1.可以通過自訂標籤隨心所欲處理jstl自身提供標籤所無法完成的邏輯 2.字典的另一種實現使用方式,撇開效能不談.
歡迎大家指點交流…….