标签:
当页面需要用到多个下拉框时,数据字典结合自定义标签可以为我们带来很大方便。自定义标签可以重复使用,相当于框架简化我们的代码。
下面总结一下关于这块我的套路。首先数据库表如下:
然后肯定得有查询字段的方法,下边我把我的代码(折叠形式)附上,仅供大家参考。
public interface IDictionaryManager { List<Dictionary> dictionaries(String groupValue); void addDataToMemory(); Dictionary dictionary(int itemKey, String groupValue); }
//@Component Because the @PostConstruct will load data to Dictionary, so don‘t add the @Component(will load two times) public class DefaultDictionaryManager implements IDictionaryManager { private static final Logger LOOGER = LoggerFactory.getLogger(DefaultDictionaryManager.class); // Logger info private static final String LOGGER_INFO_LOAD_DIC = "Loading Dictionary to cache."; private static final String LOGGER_INFO_CACHE_WITH_MAP_GROUP_BY_GROUPKEY = "Cache the dictionary with map group by groupKey."; private static final String LOGGER_INFO_CACHE_WITH_GROUPKEY_SUCCESS = "Cache the dictionary with map group by groupKey success."; // Logger error private static final String LOGGER_ERROR_NO_DICTIONARY_CACHED = "No Dictionary cached in the map, Please sure your groupKey"; @Autowired private IDictionaryRepository repository; private static final Map<String, List<Dictionary>> CACHE = Maps.newHashMap(); private static List<Dictionary> dictionaries = null; private static DefaultDictionaryManager manager = new DefaultDictionaryManager(); private DefaultDictionaryManager() {} public static DefaultDictionaryManager getInstance() { //判断manager的实例是否为空,如果为空创建一个实例,部不为空返回实例。 Optional<DefaultDictionaryManager> optional = Optional.fromNullable(manager); if (!optional.isPresent()) { return new DefaultDictionaryManager(); } return manager; } @PostConstruct public void initCache() { dictionaries = repository.selectAll(); addDataToMemory(); } /** * 获得数据字典中对应group的值 * * @param groupKey 数据字典中的groupKey * @return 如果存在这个group,返回这个group中的值,如果不存在返回一个empty List */ public List<Dictionary> dictionaries(String groupKey) { List<Dictionary> dictionaries = CACHE.get(groupKey); Optional<List<Dictionary>> optional = Optional.fromNullable(dictionaries); if (!optional.isPresent()) { dictionaries = new ArrayList<Dictionary>(); } return dictionaries; } //把封装到list里的每一组数据按groupvalue分类重新封装到不同的list中,然后封装到map里 public void addDataToMemory() { for (Dictionary dictionary : dictionaries) { String groupValue = dictionary.getGroupValue(); List<Dictionary> groupDic = CACHE.get(groupValue); Optional<List<Dictionary>> optional = Optional.fromNullable(groupDic); if (!optional.isPresent()) { groupDic = new ArrayList<Dictionary>(); } groupDic.add(dictionary); CACHE.put(groupValue, groupDic); } } public Dictionary dictionary(int itemKey, String groupValue) { List<Dictionary> dictionaries = CACHE.get(groupValue); for (Dictionary dictionary : dictionaries) { if (dictionary.getItemKey() == itemKey) { return dictionary; } } return new Dictionary(); } }
现在有了后台支撑,就可以进行jsp的操作了。在这块我自定义了dicselect标签,这样在每次使用下拉框的时候使用自定义标签就好了,省去了再重复编写下拉框的步骤。在这里就得说一说.tag和.tld文件。前者是属于jsp文件后者是属于xml文件。
1.对于tag文件
<%@ taglib prefix="ui" tagdir="/WEB-INF/tags" %>
其中的tags是个目录,里面有若干tag文件。
但使用<ti:XXXX>时,目录WEB-INF/tags下,必然有个XXXX.tag文件与之对应。
2.对于tld文件
在jsp中可以引用TLD文件,如
<%@ taglib uri="http://struts.apache.org/tags-html" prefix="html"%>
但是这个http://struts.apache.org/tags-html对应着什么呢?
jsp会在当前目录的\WEB-INF下找所有tld文件,确认这个URL对应哪个TLD文件。
当找到struts-html.tld文件时,发现其中的内与这个URL对应。
但使用<html:YYYYY>时,这个TLD文件中必然有个YYYY项与之对应。
在用户在jsp页面中使用标签时,系统首先会先到web.xml文件中的 <taglib>标签中的《taglib-uri》和《taglib-location》这两对标签找到相对应的扩展名为tld文件,然后在 tld文件中的映射再找到相对应的taglib类。
下边附上我的配置代码:
<%@tag pageEncoding="UTF-8"%> <%@ taglib prefix="dict" uri="http://www.lgb.com/tags/dic" %> <%@ attribute name="id" type="java.lang.String" required="false"%> <%@ attribute name="name" type="java.lang.String" required="true"%> <%@ attribute name="key" type="java.lang.String" required="true"%> <%@ attribute name="value" type="java.lang.String" required="true"%> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> <% String tagId = id; String tagName = name; if (id == null){ tagId = tagName; } request.setAttribute("tagId", tagId); request.setAttribute("tagName", tagName); %> <select class="form-control" id="${tagId}" name="${name}"> <c:forEach items="${dict:list(key)}" var="dict" varStatus="status"> <c:choose> <c:when test="${status.first eq true}"> <c:choose> <c:when test="${dict.itemKey eq value}"> <option selected="selected" value="${dict.itemKey}" >${dict.itemValue}</option> </c:when> <c:otherwise> <option value="${dict.itemKey}">${dict.itemValue}</option> </c:otherwise> </c:choose> </c:when> <c:otherwise> <c:choose> <c:when test="${dict.itemKey eq value}"> <option selected="selected" value="${dict.itemKey}" >${dict.itemValue}</option> </c:when> <c:otherwise> <option value="${dict.itemKey}" >${dict.itemValue}</option> </c:otherwise> </c:choose> </c:otherwise> </c:choose> </c:forEach> </select>
<?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"> <tlib-version>1.0</tlib-version> <short-name>DictionaryTag</short-name> <uri>http://www.lgb.com/tags/dic</uri> <function> <name>list</name> <function-class>com.lgb.arc.web.tag.DictionaryTag</function-class> <function-signature>java.util.List list(java.lang.String)</function-signature> </function> <function> <name>show</name> <function-class>com.lgb.arc.web.tag.DictionaryTag</function-class> <function-signature>java.lang.String show(java.lang.String, int)</function-signature> </function> </taglib>
<%@tag pageEncoding="UTF-8"%>
<%@ taglib prefix="dict" uri="http://www.lgb.com/tags/dic" %>
<%@ attribute name="groupValue" type="java.lang.String" required="true"%>
<%@ attribute name="itemKey" type="java.lang.Integer" required="true"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
${dict:show(groupVaule, itemKey)}
<%@tag pageEncoding="UTF-8"%> <%@ taglib prefix="dict" uri="http://www.lgb.com/tags/dic" %> <%@ attribute name="groupValue" type="java.lang.String" required="true"%> <%@ attribute name="itemKey" type="java.lang.Integer" required="true"%> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> <td>${dict:show(groupValue, itemKey)}</td>
以及还要在web.xml文件里进行配置,下边附上我的配置代码:
<jsp-config>
<taglib>
<taglib-uri>http://www.lgb.com/tags/dic</taglib-uri>
<taglib-location>/WEB-INF/tags/dictionary.tld</taglib-location>
</taglib>
</jsp-config>
这样自定义标签就完成了。我们就可以在jsp页面中使用我们的自定义标签。
(本文代码 仅供参考)
咆哮吧! 青春!
标签:
原文地址:http://www.cnblogs.com/Vdiao/p/5397420.html