`
toknowme
  • 浏览: 139862 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

利用Redis构建自定义标签(2)

 
阅读更多
最近工作有点忙,不过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存储
 


 

 

 
 
  • 大小: 24.2 KB
  • 大小: 19.6 KB
  • 大小: 21.5 KB
  • 大小: 57.6 KB
  • 大小: 23.3 KB
0
0
分享到:
评论
1 楼 liyonghui160com 2017-01-11  
请问 redis的结构是什么样的?

相关推荐

    基于springboot的论坛系统,主要使用的技术有springboot+mybatis+redis+自定义分页.zip

    标题 "基于springboot的论坛系统,主要使用的技术有springboot+mybatis+redis+自定义分页" 描述了一个使用现代Web技术构建的论坛应用程序。这个项目的核心是Spring Boot框架,它简化了Java应用程序的开发过程,提供...

    自定义分页标签 Java

    - **标签处理类**(Tag Handler Class):每个自定义标签对应一个Java类,该类实现了`javax.servlet.jsp.tagext.Tag`或`javax.servlet.jsp.tagext.SimpleTag`接口。在这里,我们将处理分页逻辑,包括计算页码、查询...

    ruby和redis接口

    Ruby 和 Redis 接口是开发过程中非常重要的工具,它们允许Ruby程序员充分利用Redis的高效数据存储和处理能力。Redis是一款开源的、基于键值对的数据结构存储系统,它以内存为运行基础,支持多种数据结构,如字符串、...

    shiro-redis-cluster

    《Spring MVC、Shiro与...这种架构不仅提高了系统的安全性,还利用Redis的高性能特性提升了数据访问速度,为大型分布式应用提供了有力支持。在实际项目中,开发者应根据业务需求和环境调整具体配置,以达到最佳效果。

    redisMq(按任务批次分不同队列)

    总结来说,这个示例展示了如何利用Redis构建一个分布式任务分发系统,通过创建多个队列来处理不同任务批次,以达到灵活管理和高效执行的目的。同时,通过自定义序列化类和配置类,优化了数据存储和传输的效率。整个...

    Another-Redis-Desktop-Manager.1.6.1

    安装后,用户可以利用其强大的功能,如实时监控Redis服务器的性能指标,查看内存占用情况,设置键的过期时间,以及备份和恢复数据等。 总结来说,Another-Redis-Desktop-Manager 1.6.1是一款功能齐全、易于使用的...

    redis-desktop-manager-0.9.3.817

    Redis是世界上最受欢迎的内存数据存储系统之一,常用于构建高性能、低延迟的数据缓存和数据库。Redis Desktop Manager是一款跨平台的、用户友好的图形界面工具,它为开发者提供了方便的Redis键值存储管理功能,使得...

    redis-unstable.zip_Redis C_c redis_redis_redis c++_visual c

    Redis是一款开源的、高性能的键值对存储系统,主要用于数据缓存、消息中间件、数据库等功能。...通过深入学习,你将能够更好地利用Redis来满足各种应用场景的需求,并且有能力对其进行定制化开发。

    thinkphp_redis

    通过集成"thinkphp_redis",开发者可以充分利用Redis的优势,提高应用程序的响应速度和整体性能。 "tpredis"这个标签表明了这个类库是ThinkPHP与Redis的整合,使得开发者无需深入了解Redis的底层细节,只需调用相应...

    使用redis管理对象缓存,可代替session

    标题中的“使用redis管理对象缓存,可代替session”指的是在Web应用中,利用Redis作为对象缓存系统来替代传统的HTTP Session。Redis是一款高性能的Key-Value存储系统,它可以用来存储临时性的数据,如用户的Session...

    redis整合到tomcat集群的支持

    为了解决这个问题,我们可以利用Redis作为中央会话存储,使得各个Tomcat实例都可以访问同一份会话数据。 1. **Redis作为会话存储**: Redis支持多种数据结构,如字符串、哈希、列表、集合和有序集合,其中哈希...

    Redis面试题(含答案)_20190220222533.pdf

    ### Redis基础知识及特性 #### 1. 什么是Redis? Redis是一种高性能的键值对(Key-Value)数据库,它与Memcached类似,都是基于内存的操作...通过对Redis特性的深入了解,可以帮助开发者更好地利用Redis解决实际问题。

    my_redis-5.0.14.tar

    描述中的 "my_redis-5.0.14.tar" 同样强调了这是 Redis 的一个自定义或个人化的构建,可能是对官方发行版的某种修改或定制,以满足特定需求或环境。tar 文件是一种在类 Unix 系统(如 Linux)中常见的文件打包格式,...

    Redis缓存url访问次数(SpringBoot拦截器)

    标题 "Redis缓存url访问次数(SpringBoot拦截器)" 描述的是一个使用SpringBoot框架构建的应用中,通过拦截器来统计URL访问次数,并利用Redis作为缓存存储这些计数的过程。这个技术方案通常用于网站性能优化,通过...

    django-redis-chs-readthedocs-io-zh_CN-latest.zip

    **Django-Redis:在Django中高效利用Redis缓存** `django-redis`是一个针对Django框架的高度兼容和功能齐全的Redis缓存后端组件,遵循BSD许可证,允许自由使用和修改。它使得开发者能够充分利用Redis的强大功能,...

    redis-desktop-manager的exe文件

    关于标签"redis",这表明内容与Redis这个内存数据存储系统密切相关。Redis支持多种数据结构,如字符串、哈希、列表、集合和有序集合,这些在数据库设计中非常有用。此外,Redis还支持发布/订阅、事务、持久化、复制...

    Laravel开发-laravel-redis-tagger

    `laravel-redis-tagger` 是一个针对Laravel的扩展,旨在帮助开发者更有效地利用Redis进行标签(tagging)管理。这个项目可能包含一组自定义的助手函数,使得在Laravel应用中管理和操作带有标签的数据变得更加便捷。 ...

    spring-data-redis-1.6.0.RELEASE.jar + jedis-2.7.2.jar包

    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_php_redis-7.0-nts-vc14-x64.zip”指的是一个针对UpUpW(一款Windows平台的Apache...正确安装和配置这个扩展,可以充分利用Redis的高性能特性,如缓存、消息队列等功能,提升Web应用的性能和响应速度。

    cpp-一个Redis模块用于提供张量并执行深度学习模型

    5. 机器学习与数据处理:如何利用Redis进行大规模数据处理,支持机器学习任务。 6. Git版本控制:了解如何使用Git进行代码管理和协作,d28350a是一个具体的版本标识。 7. 分布式系统优化:在分布式环境中,如何通过...

Global site tag (gtag.js) - Google Analytics