数据字典的好处很多比如:
1、可以减少使用表,来专门记录类型。
2、类型使用key检索,或者报表统计分析,在一定程度上相比汉字来讲,效率好得多。
3、使用缓存的数据字典、也可以减少不少的io操作。
等等、、、、
首先,库表设计就智者见智了、不多说、爱怎么设计就怎么设计。
完整的数据字典设计 ,需要
1、生成select 自定义标签。
2、list页面,或者get页面, 一个key转 value的标签
使用自定义标签,搭配上缓存的数据字典是最方便、最完美的解决办法,
接下来,就直接贴代码了。
一、数据字典缓存配置:
1、数据字典缓存监听器(在web容器启动成功的时候、进行缓存)
web.xml
12 初始化数据字典 3class>com.hotent.core.web.listener.DictionaryCacheListener class> 4
2、DictionaryCacheListener
1 package com.*****.core.web.listener; 2 import javax.servlet.ServletContextEvent; 4 import org.springframework.web.context.WebApplicationContext; 5 import org.springframework.web.context.support.WebApplicationContextUtils; 7 import com.*****.platform.service.system.DictionaryService; 8 9 public class DictionaryCacheListener implements javax.servlet.ServletContextListener { 10 11 @Override 12 public void contextDestroyed(ServletContextEvent arg0) { 14 }
16 @Override 17 public void contextInitialized(ServletContextEvent arg0) { 18 19 System.out.println("++++++++++++++++++ 数据字典已缓存 +++++++++++++++++++++"); 20 WebApplicationContext webApplicationContext = WebApplicationContextUtils.getWebApplicationContext(arg0.getServletContext()); 21 DictionaryService dc = (DictionaryService) webApplicationContext.getBean("dictionaryService"); 22 dc.getCacheDic(); // 调用数据字典Manager的一个方法来缓存 24 } 25 26 }
3、保存缓存数据字典的BO //(也可以放在平台缓存的BO里面,那共用的缓存设计要考虑线程安全了,简单起见这么搞。)
import java.util.HashMap; import java.util.List; import java.util.Map; import com.hotent.platform.model.system.Dictionary; import com.hotent.platform.model.system.GlobalType; /** * 缓存数据字典 * @author miao * */ public class CacheDict { /** * 所有的数据字典类型 */ public static MapallTypes = new HashMap (); /** * 所有类型,对应的数据字典项 */ public static Map > dictList = new HashMap >(); /** * 类型与字典项 由List 转成Map(key,value) */ public static Map > dictMap = new HashMap >(); }
4、为缓存注入数据 。 提示一点:在更新、或者添加数据字典的时候,记得重新调用缓存的方法、更新数据
1 public void getCacheDic() { 2 //GlobalType 里面存储所有的各种类型:附件类型,数据字典类型,流程类型等等 3 ListglobalTypes = globalTypeDao.getByCatKey(GlobalType.CAT_DIC); //eg:性别‘学历等 4 CacheDict.allTypes.clear(); 5 CacheDict.dictList.clear(); 6 CacheDict.dictMap.clear(); 7 8 for(GlobalType DicType : globalTypes){ 9 CacheDict.allTypes.put(DicType.getNodeKey(),DicType); 10 11 List dictList = this.getByNodeKey(DicType.getNodeKey());//通过key 查找 所有数据项 12 13 CacheDict.dictList.put(DicType.getNodeKey(),dictList ); 14 15 //字典项转成key - value的形式 16 Map map = new HashMap (); 17 for(Dictionary dic : dictList){ 18 map.put(dic.getDicId(),dic.getItemName()); // key / name 19 } 20 CacheDict.dictMap.put(DicType.getNodeKey(),map); 21 } 22 System.out.println("+++++++++++++++++++++++++ "+globalTypes.size()+" +++++++++++++++++++++" ); 23 }
5、 生成select 框自定义标签
1 import java.io.IOException; 2 import java.util.List; 3 4 import javax.servlet.jsp.JspTagException; 5 import javax.servlet.jsp.JspWriter; 6 import javax.servlet.jsp.tagext.TagSupport; 7 8 import org.apache.commons.lang.StringUtils; 9 10 import com.hotent.core.cache.impl.CacheDict; 11 import com.hotent.platform.model.system.Dictionary; 12 13 14 /** 15 * 16 * 选择下拉框 17 * 18 * @author: miao 19 * @date: 日期:2013-9-25 23:14:26 20 * @version 1.0 21 */ 22 public class DictSelectTag extends TagSupport { 23 private String id; //EAMPLE: 24 private String name; 25 private String title; 26 private String value =""; //默认值 即是回显 ID 27 private String nodeKey; //数据字典节点 28 private String divClass; //DIV样式 29 private String labelClass; //Label样式 30 private boolean hasLabel = false; //是否显示label 31 private String clazz; 32 private String style; 33 private boolean required =false; // 如果必须选择、则添加required = true 34 35 public int doStartTag() throws JspTagException { 36 return EVAL_PAGE; 37 } 38 39 public int doEndTag() throws JspTagException { 40 try { 41 JspWriter out = this.pageContext.getOut(); 42 out.print(end().toString()); 43 } catch (IOException e) { 44 e.printStackTrace(); 45 } 46 return EVAL_PAGE; 47 } 48 49 50 public StringBuffer end() { 51 StringBuffer sb = new StringBuffer(); 52 try{ 53 if (StringUtils.isBlank(divClass)) { 54 divClass = ""; //默认form样式 55 } 56 if (StringUtils.isBlank(labelClass)){ 57 labelClass = ""; //默认label样式 58 } 59 /* ServletContext servletContext = pageContext.getServletContext(); 60 ApplicationContext context = WebApplicationContextUtils.getWebApplicationContext(servletContext); 61 ApplicationContext context = WebApplicationContextUtils.getRequiredWebApplicationContext(servletContext); 62 DictionaryService dictioninaryService = (DictionaryService)context.getBean("dictionaryService"); 63 Listdictionary = dictioninaryService.getByNodeKey(this.getNodeKey()); 64 从applicationContext里面获取 service方法、获取数据字典、、 更新为从缓存对象中获取数据字典。 update time 2013-9-28 15:25:48 65 */ 66 Listdictionary = CacheDict.dictList.get(this.getNodeKey()); 67 if (hasLabel) { 68 sb.append(" "); 69 sb.append(""); 80 } 81 if(required) 82 sb.append(""); 106 } 107 } 108 }catch (Exception e) { 109 e.printStackTrace(); 110 return sb.append("异常
此nodekey: "+ this.nodeKey+" 查找数据库数据字典异常
"+e.getMessage()+""); 111 } 112 return sb; 113 } 114 115 public String getValue() { 116 return value; 117 } 118 119 public void setValue(String value) { 120 this.value = value; 121 } 122 123 public String getId() { 124 return id; 125 } 126 127 public void setId(String id) { 128 this.id = id; 129 } 130 131 132 public String getDivClass() { 133 return divClass; 134 } 135 136 public void setDivClass(String divClass) { 137 this.divClass = divClass; 138 } 139 140 public String getLabelClass() { 141 return labelClass; 142 } 143 144 public void setLabelClass(String labelClass) { 145 this.labelClass = labelClass; 146 } 147 148 public String getTitle() { 149 return title; 150 } 151 152 public void setTitle(String title) { 153 this.title = title; 154 } 155 156 public String getNodeKey() { 157 return nodeKey; 158 } 159 160 public void setNodeKey(String nodeKey) { 161 this.nodeKey = nodeKey; 162 } 163 164 public boolean isHasLabel() { 165 return hasLabel; 166 } 167 168 public void setHasLabel(boolean hasLabel) { 169 this.hasLabel = hasLabel; 170 } 171 172 public String getName() { 173 return name; 174 } 175 176 public String getClazz() { 177 return clazz; 178 } 179 180 public boolean isRequired() { 181 return required; 182 } 183 184 public void setRequired(boolean required) { 185 this.required = required; 186 } 187 188 public void setClazz(String clazz) { 189 this.clazz = clazz; 190 } 191 192 public void setName(String name) { 193 this.name = name; 194 } 195 196 197 public String getStyle() { 198 return style; 199 } 200 201 public void setStyle(String style) { 202 this.style = style; 203 } 204 205 206 207 208 }
6、将数据字典通过key 转换成value
import java.io.IOException; import java.util.Map; import javax.servlet.jsp.JspTagException; import javax.servlet.jsp.JspWriter; import javax.servlet.jsp.tagext.TagSupport; import com.hotent.core.cache.impl.CacheDict; public class DictKey2Value extends TagSupport { private Long key; private String nodeKey; public int doStartTag() throws JspTagException { return EVAL_PAGE; } public int doEndTag() throws JspTagException { try { JspWriter out = this.pageContext.getOut(); out.print(dictName().toString()); } catch (IOException e) { e.printStackTrace(); } return EVAL_PAGE; } public StringBuffer dictName() { StringBuffer sb = new StringBuffer(); Map map = CacheDict.dictMap.get(this.getNodeKey()); if(map == null) sb.append("未发现NodeKey"); else{ if(map.get(key)!=null) sb.append( map.get(key)); } return sb; } public String getNodeKey() { return nodeKey; } public void setNodeKey(String nodeKey) { this.nodeKey = nodeKey; } public Long getKey() { return key; } public void setKey(Long key) { this.key = key; } }
7、tag标签配置
1 23 65dict 4数据字典 5class>com.hotent.core.web.tag.DictSelectTag class> 6JSP 7数据字典选择控件 89 13id 10false 11true 1214 18required 15false 16true 1719 23name 20true 21true 2224 28title 25false 26true 2729 33value 30true 31true 3234 39nodeKey 35true 36true 37数据字典的节点key 3840 44divClass 41false 42true 4345 49labelClass 46false 47true 4850 54hasLabel 51false 52true 5355 59clazz 56false 57true 5860 64style 61false 62true 6366 dicK2V 67数据字典 68class>com.hotent.core.web.tag.DictK2V class> 69JSP 70数据转换 7172 76key 73true 74true 7577 81nodeKey 78true 79true 80
看下页面使用效果:
//生成标准的select标签、可以添加自己的样式等、
over,