码迷,mamicode.com
首页 > 其他好文 > 详细

通过自定义标签用数据字典实现下拉框

时间:2016-04-16 12:24:07      阅读:1984      评论:0      收藏:0      [点我收藏+]

标签:

当页面需要用到多个下拉框时,数据字典结合自定义标签可以为我们带来很大方便。自定义标签可以重复使用,相当于框架简化我们的代码。

下面总结一下关于这块我的套路。首先数据库表如下:

技术分享

然后肯定得有查询字段的方法,下边我把我的代码(折叠形式)附上,仅供大家参考。

技术分享
public interface IDictionaryManager {
    List<Dictionary> dictionaries(String groupValue);
    void addDataToMemory();
    Dictionary dictionary(int itemKey, String groupValue);
}
IDictionaryManager
技术分享
//@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();
    }
}
DefaultDictionaryManager

现在有了后台支撑,就可以进行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>
dicselect.tag
技术分享
<?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>
dictionary.tld
技术分享
<%@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)}
diclabel.tag
技术分享
<%@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>
dictd.tag

 

以及还要在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

(1)
(1)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!