①在web.xml中添加监听,启动的时候初始化。
<!--Web ApplicationContext 载入,继承处Spring的ApplicationContextListener --> <listener> <listener-class>cn.sccl.common.web.StartupListener</listener-class> </listener>
②我们需要在启动Tomcat的时候,初始化bizCode数据
package cn.sccl.common.web; import java.util.List; import java.util.Map; import javax.servlet.ServletContext; import javax.servlet.ServletContextEvent; import javax.servlet.ServletContextListener; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.springframework.context.ApplicationContext; import org.springframework.web.context.ContextLoaderListener; import org.springframework.web.context.support.WebApplicationContextUtils; import cn.sccl.common.service.BizCodeManager; import cn.sccl.common.web.util.Log4jWebConfigurer; import cn.sccl.pms.model.Division; import cn.sccl.pms.model.DivisionQuery; import cn.sccl.pms.service.DivisionManager; public class StartupListener extends ContextLoaderListener implements ServletContextListener { private final Log log = LogFactory.getLog(getClass()); @Override public void contextInitialized(ServletContextEvent event){ super.contextInitialized(event); log.debug("contextInitialized"); ServletContext context = event.getServletContext(); setupContext(context); // init : location of the log4j config file & refresh interval for // checking the log4j config Log4jWebConfigurer.initLogging(event.getServletContext()); } protected void setupContext(final ServletContext context) { ApplicationContext ctx = WebApplicationContextUtils.getRequiredWebApplicationContext(context); BizCodeManager bizCodeManager = (BizCodeManager) ctx.getBean(WebNames.BIZ_CODE_MANAGER); Map<String, Map<String, String>> allBizCodes = bizCodeManager.list2map(); context.setAttribute(WebNames.BIZ_CODES, allBizCodes); // 行政区划 DivisionManager divisionManager = (DivisionManager) ctx.getBean("divisionManager"); List<Division> divisions = divisionManager.query(new DivisionQuery()); context.setAttribute("divisions", divisions); log.debug(allBizCodes); } @Override public void contextDestroyed(ServletContextEvent event) { Log4jWebConfigurer.shutdownLogging(event.getServletContext()); } }
③我们在jsp页面中自定义下拉标签来获取字典。
<sccl:selectBizCodes category="OrderOfDevRepair_Status" selected="${orderOfDevRepairQuery.status}" id="status" html="style='table_text'"/>
④selectBizCodes.tag
<%@ tag pageEncoding="GBK" %> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> <%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions"%> <%@ attribute name="category" required="true" %> <%@ attribute name="id"%> <%@ attribute name="name"%> <%@ attribute name="onChange"%> <%@ attribute name="html"%> <%@ attribute name="selected"%> <%@ attribute name="beside" %> <c:set var="htmlId" value="${category}"/> <c:if test="${not empty id}"> <c:set var="htmlId" value="${id}"/> </c:if> <c:set var="htmlName" value="${htmlId}"/> <c:if test="${not empty name}"> <c:set var="htmlName" value="${name}"/> </c:if> <c:set var="htmlAttr" value=""/> <c:if test="${not empty onChange}"> <c:set var="htmlAttr" value="onChange='${onChange}'"/> </c:if> <c:if test="${not empty html}"> <c:set var="htmlAttr" value="${htmlAttr}${html}"/> </c:if> <c:set var="beside" value="${beside}"></c:set> <select class="form-control" id="${htmlId}" name="${htmlName}" ${htmlAttr}> <option value="">--请选择--</option> <c:forEach var="bizCodeKeyValue" items="${applicationScope.bizCodes[category]}"> <c:choose> <c:when test="${empty beside}"> <option value="${bizCodeKeyValue.key}"<c:if test="${selected == bizCodeKeyValue.key}"> selected</c:if>>${bizCodeKeyValue.value}</option> </c:when> <c:otherwise> <c:set var="exist" value="0"/> <c:forEach var="item" items="${fn:split(beside,',')}"> <c:if test="${bizCodeKeyValue.key==item}"> <c:set var="exist" value="1"/> </c:if> </c:forEach> <c:if test="${exist == 0}"> <option value="${bizCodeKeyValue.key}"<c:if test="${selected == bizCodeKeyValue.key}"> selected</c:if>>${bizCodeKeyValue.value}</option> </c:if> </c:otherwise> </c:choose> </c:forEach> </select> <!-- <select id="${htmlId}" class="select" name="${htmlName}" ${htmlAttr}> <option value="">--请选择--</option> <c:forEach var="bizCodeKeyValue" items="${applicationScope.bizCodes[category]}"> <c:if test="${bizCodeKeyValue.key != beside }"> <option value="${bizCodeKeyValue.key}"<c:if test="${selected == bizCodeKeyValue.key}"> selected</c:if>>${bizCodeKeyValue.value}</option> </c:if> </c:forEach> </select> -->
总结:
下拉标签的实现:在Tomcat启动的时候就将所有的字典表数据全部查询出来放到ServletContext中,然后在jsp中采用自定义标签,在标签中通过applicationScope来获取。
附录:
取session: session.setAttribute("data",data); 然后el这样取:${sessionScope.data} 取application: application.setAttribute("data", data); 然后el这样取:${applicationScope.data}