最近工作有点忙,不过Redis构建自定义标签也基本已经实现
(1)整体设计
(2)Jedis配置
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xmlns:jdbc="http://www.springframework.org/schema/jdbc" xmlns:jee="http://www.springframework.org/schema/jee" xmlns:tx="http://www.springframework.org/schema/tx" xmlns:jpa="http://www.springframework.org/schema/data/jpa" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.1.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.1.xsd http://www.springframework.org/schema/jdbc http://www.springframework.org/schema/jdbc/spring-jdbc-4.1.xsd http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-4.1.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.1.xsd http://www.springframework.org/schema/data/jpa http://www.springframework.org/schema/data/jpa/spring-jpa.xsd" > <context:component-scan base-package="com.crm.redis" /> <bean id="jedisPoolConfig" class="redis.clients.jedis.JedisPoolConfig"> <!--最大连接数 --> <property name="maxTotal" value="2000" /> <!--最大空闲数 --> <property name="maxIdle" value="300" /> <property name="minIdle" value="100" /> <!--最大等待时间ms --> <property name="maxWaitMillis" value="30000" /> <property name="testOnBorrow" value="true" /> <property name="testOnReturn" value="true" /> <property name="testWhileIdle" value="true" /> </bean> <bean id="shardedJedisPool" class="redis.clients.jedis.ShardedJedisPool" destroy-method="destroy"> <constructor-arg ref="jedisPoolConfig" /> <constructor-arg> <list> <bean class="redis.clients.jedis.JedisShardInfo"> <constructor-arg value="localhost" /> <constructor-arg type="int" value="6379" /> <constructor-arg value="instance:02" /> </bean> </list> </constructor-arg> </bean> </beans>
(2)Redis配置
(3)Redis加载线程
package com.crm.redis.load; import java.util.HashMap; import java.util.List; import com.crm.application.CrmContext; import com.crm.common.bo.building.BOBuilding; import com.crm.model.dictionary.BOCrmStaticData; import com.crm.model.redis.BOCrmRedisCfg; import com.crm.redis.JedisManager; import com.crm.redis.load.interfaces.IRedisLoadSV; import com.crm.service.base.BaseSVImpl; import com.crm.service.dictionary.StaticDataSVImpl; import com.crm.service.redis.RedisCfgSVImpl; public class RedisLoadThread extends Thread { @Override public void run() { System.out.println("Redis加载线程准备执行...."); loadDictionarys(); loadCityControlFunctionCodes(); loadBuildings(); } private void loadBuildings() { JedisManager JedisManager = CrmContext.getBean("JedisManager", JedisManager.class); BaseSVImpl BaseSVImpl = CrmContext.getBean("BaseSVImpl", BaseSVImpl.class); RedisCfgSVImpl RedisCfgSVImpl = CrmContext.getBean("RedisCfgSVImpl", RedisCfgSVImpl.class); String sql = "SELECT * FROM DWB_WEB_PROJECT A"; List<BOCrmRedisCfg> BOCrmRedisCfgs = RedisCfgSVImpl .getEntitys(" from BOCrmRedisCfg a where a.state = 'U' and a.code = 'B'", new HashMap()); List<BOBuilding> BOBuildings = BaseSVImpl.executeNativeSelect(sql, new HashMap(), BOBuilding.class); for (BOCrmRedisCfg c : BOCrmRedisCfgs) { IRedisLoadSV sv = (IRedisLoadSV) CrmContext.getBean(c.getImplClass()); sv.load(c, BOBuildings); } } private void loadCityControlFunctionCodes() { JedisManager JedisManager = CrmContext.getBean("JedisManager", JedisManager.class); RedisCfgSVImpl RedisCfgSVImpl = CrmContext.getBean("RedisCfgSVImpl", RedisCfgSVImpl.class); List<String> cityControlFunctionCodes = RedisCfgSVImpl.getCityControlFunctionCodes(); JedisManager.lpush("cityControlFunctionCodes", cityControlFunctionCodes); } private void loadDictionarys() { JedisManager JedisManager = CrmContext.getBean("JedisManager", JedisManager.class); RedisCfgSVImpl RedisCfgSVImpl = CrmContext.getBean("RedisCfgSVImpl", RedisCfgSVImpl.class); StaticDataSVImpl StaticDataSVImpl = CrmContext.getBean("StaticDataSVImpl", StaticDataSVImpl.class); List<BOCrmRedisCfg> BOCrmRedisCfgs = RedisCfgSVImpl .getEntitys(" from BOCrmRedisCfg a where a.state = 'U' and a.code = 'D'", new HashMap()); List<BOCrmStaticData> BOCrmStaticDatas = StaticDataSVImpl .getEntitys(" from BOCrmStaticData a where a.state = 'U' ", new HashMap()); for (BOCrmRedisCfg c : BOCrmRedisCfgs) { IRedisLoadSV sv = (IRedisLoadSV) CrmContext.getBean(c.getImplClass()); sv.load(c, BOCrmStaticDatas); } } @Override public void destroy() { System.out.println("线程销毁...."); } }
(4)编写自定义TLD
<tag> <name>multipleSelect</name> <tag-class>com.crm.taglib.CrmMultipleSelectTag</tag-class> <body-content>JSP</body-content> <attribute> <name>id</name> <required>true</required> <rtexprvalue>true</rtexprvalue> <type>java.lang.String</type> </attribute> <attribute> <name>className</name> <required>false</required> <rtexprvalue>true</rtexprvalue> <type>java.lang.String</type> </attribute> <attribute> <name>crmTagCode</name> <required>true</required> <rtexprvalue>true</rtexprvalue> <type>java.lang.String</type> </attribute> <attribute> <name>redisKey</name> <required>false</required> <rtexprvalue>true</rtexprvalue> <type>java.lang.String</type> </attribute> <attribute> <name>valueColumn</name> <required>false</required> <rtexprvalue>true</rtexprvalue> <type>java.lang.String</type> </attribute> <attribute> <name>textColumn</name> <required>false</required> <rtexprvalue>true</rtexprvalue> <type>java.lang.String</type> </attribute> <attribute> <name>tableName</name> <required>false</required> <rtexprvalue>true</rtexprvalue> <type>java.lang.String</type> </attribute> <attribute> <name>condition</name> <required>false</required> <rtexprvalue>true</rtexprvalue> <type>java.lang.String</type> </attribute> <attribute> <name>sql</name> <required>false</required> <rtexprvalue>true</rtexprvalue> <type>java.lang.String</type> </attribute> <attribute> <name>cityControl</name> <required>false</required> <rtexprvalue>true</rtexprvalue> <type>java.lang.String</type> </attribute> <attribute> <name>width</name> <required>false</required> <rtexprvalue>true</rtexprvalue> <type>java.lang.String</type> </attribute> <attribute> <name>onchange</name> <required>false</required> <rtexprvalue>true</rtexprvalue> <type>java.lang.String</type> </attribute> <attribute> <name>selectedValues</name> <required>false</required> <rtexprvalue>true</rtexprvalue> <type>java.lang.String</type> </attribute> </tag>
(5)自定义标签处理类
package com.crm.taglib; import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; import java.util.List; import javax.servlet.http.HttpServletRequest; import javax.servlet.jsp.JspWriter; import org.apache.commons.lang.StringUtils; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.springframework.web.servlet.tags.RequestContextAwareTag; import com.crm.common.bo.BOSelect; import com.crm.common.bo.building.BOBuilding; import com.crm.common.bo.operator.BOCity; import com.crm.common.util.CrmConst; import com.crm.common.util.SessionUtil; import com.crm.model.dictionary.BOCrmStaticData; import com.crm.redis.JedisManager; import com.crm.service.base.BaseSVImpl; @SuppressWarnings("serial") public class CrmMultipleSelectTag extends RequestContextAwareTag { private Log log = LogFactory.getLog(CrmMultipleSelectTag.class); private String id; private String className; private String crmTagCode; private String redisKey; private String valueColumn; private String textColumn; private String tableName; private String condition; private String sql; private String cityControl; private String width; private String onchange; private String selectedValues; public String getId() { return id; } public void setId(String id) { this.id = id; } public String getClassName() { return className; } public void setClassName(String className) { this.className = className; } public String getCrmTagCode() { return crmTagCode; } public void setCrmTagCode(String crmTagCode) { this.crmTagCode = crmTagCode; } public String getRedisKey() { return redisKey; } public void setRedisKey(String redisKey) { this.redisKey = redisKey; } public String getValueColumn() { return valueColumn; } public void setValueColumn(String valueColumn) { this.valueColumn = valueColumn; } public String getTextColumn() { return textColumn; } public void setTextColumn(String textColumn) { this.textColumn = textColumn; } public String getTableName() { return tableName; } public void setTableName(String tableName) { this.tableName = tableName; } public String getCondition() { return condition; } public void setCondition(String condition) { this.condition = condition; } public String getSql() { return sql; } public void setSql(String sql) { this.sql = sql; } public String getCityControl() { return cityControl; } public void setCityControl(String cityControl) { this.cityControl = cityControl; } public String getWidth() { return width; } public void setWidth(String width) { this.width = width; } public String getOnchange() { return onchange; } public void setOnchange(String onchange) { this.onchange = onchange; } public String getSelectedValues() { return selectedValues; } public void setSelectedValues(String selectedValues) { this.selectedValues = selectedValues; } @Override protected int doStartTagInternal() throws Exception { HttpServletRequest req = (HttpServletRequest) pageContext.getRequest(); BOCity c = SessionUtil.getCityInSession(req); long cityId = c.getCityId(); log.info("开始执行【crm:multipleSelect】标签"); JspWriter out = pageContext.getOut(); try { String str = null; if (CrmConst.CrmTag.SELECT_REDIS.equals(crmTagCode)) { str = doSelectRedis(cityId); } if (CrmConst.CrmTag.SELECT_TABLE.equals(crmTagCode)) { str = doSelectSql(cityId); } out.write(str); } catch (Exception e) { e.printStackTrace(); } return 0; } public String geneSQL(long cityId) { StringBuilder sql = new StringBuilder(); sql.append(" SELECT T.").append(valueColumn).append(" SELECT_VALUE, "); sql.append(" T.").append(textColumn).append(" SELECT_TEXT "); sql.append(" FROM ").append(tableName).append(" T "); sql.append(" where 1=1 "); if (CrmConst.commonYesOrNoString.YES.equals(cityControl)) { sql.append(" AND T.CITY_ID = ").append(cityId); } if (!StringUtils.isEmpty(condition)) { sql.append(condition); } return sql.toString(); } private String doSelectSql(long cityId) { BaseSVImpl BaseSVImpl = this.getRequestContext().getWebApplicationContext().getBean("BaseSVImpl", BaseSVImpl.class); List<String> selectValuesList = new ArrayList<String>(); if (selectedValues != null) { selectValuesList = Arrays.asList(selectedValues.split(",")); } StringBuffer sb = new StringBuffer(); List<BOSelect> list = BaseSVImpl.executeNativeSelect(geneSQL(cityId), new HashMap(), BOSelect.class); sb.append("<select id='" + id + "' onchange='" + onchange + "' class='" + className + "' multiple='' data-placeholder='请选择...'>"); for (BOSelect s : list) { if (selectValuesList.contains(s.getSelectValue())) { sb.append("<option value='" + s.getSelectValue() + "' selected='selected'>" + s.getSelectText() + "</option>"); } else { sb.append("<option value='" + s.getSelectValue() + "'>" + s.getSelectText() + "</option>"); } } sb.append("</select>"); return sb.toString(); } private String doSelectRedis(long cityId) { List<String> selectValuesList = new ArrayList<String>(); selectValuesList = Arrays.asList(selectedValues.split(",")); JedisManager JedisManager = this.getRequestContext().getWebApplicationContext().getBean("JedisManager", JedisManager.class); List<String> cityControlFunctionCodes = JedisManager.lrange("cityControlFunctionCodes", 0, -1); String[] redisKeyArray = redisKey.split(":"); StringBuffer _redisKey = new StringBuffer(redisKey); if (cityControlFunctionCodes.contains(redisKeyArray[1])) { _redisKey.append(":").append(cityId); } else { _redisKey.append(":").append(0); } StringBuffer sb = new StringBuffer(); if (CrmConst.RedisCfgCode.DICTIONARY.equals(redisKeyArray[0])) { List<BOCrmStaticData> list = (List<BOCrmStaticData>) JedisManager.getObject(_redisKey.toString()); sb.append("<select id='" + id + "' onchange='" + onchange + "' class='" + className + "' multiple='' data-placeholder='请选择...'>"); for (BOCrmStaticData s : list) { if (selectValuesList.contains(s.getValue())) { sb.append("<option value='" + s.getValue() + "' selected='selected'>" + s.getName() + "</option>"); } else { sb.append("<option value='" + s.getValue() + "'>" + s.getName() + "</option>"); } } sb.append("</select>"); } if (CrmConst.RedisCfgCode.BUILDING.equals(redisKeyArray[0])) { List<BOBuilding> list = (List<BOBuilding>) JedisManager.getObject(_redisKey.toString()); sb.append("<select id='" + id + "' onchange='" + onchange + "' class='" + className + "' multiple='' data-placeholder='请选择...'>"); for (BOBuilding s : list) { if (selectValuesList.contains(s.getPrjId())) { sb.append("<option value='" + s.getPrjId() + "' selected='selected'>" + s.getPrjItemname() + "</option>"); } else { sb.append("<option value='" + s.getPrjId() + "'>" + s.getPrjItemname() + "</option>"); } } sb.append("</select>"); } return sb.toString(); } }
(6)页面使用
<crm:singleSelect id="buildingId" crmTagCode="SELECT_REDIS" redisKey="B:100"
className="chosen-select col-xs-10 col-sm-5" selectedValues="${BOCrmProject.buildingId}">
</crm:singleSelect>
(7)页面效果以及Redis存储
相关推荐
标题 "基于springboot的论坛系统,主要使用的技术有springboot+mybatis+redis+自定义分页" 描述了一个使用现代Web技术构建的论坛应用程序。这个项目的核心是Spring Boot框架,它简化了Java应用程序的开发过程,提供...
- **标签处理类**(Tag Handler Class):每个自定义标签对应一个Java类,该类实现了`javax.servlet.jsp.tagext.Tag`或`javax.servlet.jsp.tagext.SimpleTag`接口。在这里,我们将处理分页逻辑,包括计算页码、查询...
Ruby 和 Redis 接口是开发过程中非常重要的工具,它们允许Ruby程序员充分利用Redis的高效数据存储和处理能力。Redis是一款开源的、基于键值对的数据结构存储系统,它以内存为运行基础,支持多种数据结构,如字符串、...
《Spring MVC、Shiro与...这种架构不仅提高了系统的安全性,还利用Redis的高性能特性提升了数据访问速度,为大型分布式应用提供了有力支持。在实际项目中,开发者应根据业务需求和环境调整具体配置,以达到最佳效果。
总结来说,这个示例展示了如何利用Redis构建一个分布式任务分发系统,通过创建多个队列来处理不同任务批次,以达到灵活管理和高效执行的目的。同时,通过自定义序列化类和配置类,优化了数据存储和传输的效率。整个...
安装后,用户可以利用其强大的功能,如实时监控Redis服务器的性能指标,查看内存占用情况,设置键的过期时间,以及备份和恢复数据等。 总结来说,Another-Redis-Desktop-Manager 1.6.1是一款功能齐全、易于使用的...
Redis是世界上最受欢迎的内存数据存储系统之一,常用于构建高性能、低延迟的数据缓存和数据库。Redis Desktop Manager是一款跨平台的、用户友好的图形界面工具,它为开发者提供了方便的Redis键值存储管理功能,使得...
Redis是一款开源的、高性能的键值对存储系统,主要用于数据缓存、消息中间件、数据库等功能。...通过深入学习,你将能够更好地利用Redis来满足各种应用场景的需求,并且有能力对其进行定制化开发。
通过集成"thinkphp_redis",开发者可以充分利用Redis的优势,提高应用程序的响应速度和整体性能。 "tpredis"这个标签表明了这个类库是ThinkPHP与Redis的整合,使得开发者无需深入了解Redis的底层细节,只需调用相应...
标题中的“使用redis管理对象缓存,可代替session”指的是在Web应用中,利用Redis作为对象缓存系统来替代传统的HTTP Session。Redis是一款高性能的Key-Value存储系统,它可以用来存储临时性的数据,如用户的Session...
为了解决这个问题,我们可以利用Redis作为中央会话存储,使得各个Tomcat实例都可以访问同一份会话数据。 1. **Redis作为会话存储**: Redis支持多种数据结构,如字符串、哈希、列表、集合和有序集合,其中哈希...
### Redis基础知识及特性 #### 1. 什么是Redis? Redis是一种高性能的键值对(Key-Value)数据库,它与Memcached类似,都是基于内存的操作...通过对Redis特性的深入了解,可以帮助开发者更好地利用Redis解决实际问题。
描述中的 "my_redis-5.0.14.tar" 同样强调了这是 Redis 的一个自定义或个人化的构建,可能是对官方发行版的某种修改或定制,以满足特定需求或环境。tar 文件是一种在类 Unix 系统(如 Linux)中常见的文件打包格式,...
标题 "Redis缓存url访问次数(SpringBoot拦截器)" 描述的是一个使用SpringBoot框架构建的应用中,通过拦截器来统计URL访问次数,并利用Redis作为缓存存储这些计数的过程。这个技术方案通常用于网站性能优化,通过...
**Django-Redis:在Django中高效利用Redis缓存** `django-redis`是一个针对Django框架的高度兼容和功能齐全的Redis缓存后端组件,遵循BSD许可证,允许自由使用和修改。它使得开发者能够充分利用Redis的强大功能,...
关于标签"redis",这表明内容与Redis这个内存数据存储系统密切相关。Redis支持多种数据结构,如字符串、哈希、列表、集合和有序集合,这些在数据库设计中非常有用。此外,Redis还支持发布/订阅、事务、持久化、复制...
`laravel-redis-tagger` 是一个针对Laravel的扩展,旨在帮助开发者更有效地利用Redis进行标签(tagging)管理。这个项目可能包含一组自定义的助手函数,使得在Laravel应用中管理和操作带有标签的数据变得更加便捷。 ...
Spring Data Redis使得在应用程序中集成Redis变得简单,提供了丰富的API和抽象层,让开发者能够利用Redis的高速缓存、持久化和分布式特性。这个“spring-data-redis-1.6.0.RELEASE.jar”是该库的特定版本,1.6.0....
标题“upupw_php_redis-7.0-nts-vc14-x64.zip”指的是一个针对UpUpW(一款Windows平台的Apache...正确安装和配置这个扩展,可以充分利用Redis的高性能特性,如缓存、消息队列等功能,提升Web应用的性能和响应速度。
5. 机器学习与数据处理:如何利用Redis进行大规模数据处理,支持机器学习任务。 6. Git版本控制:了解如何使用Git进行代码管理和协作,d28350a是一个具体的版本标识。 7. 分布式系统优化:在分布式环境中,如何通过...