1.生成16位数字(当时日期时间加随机两位数)
public static String getNo16() { String getNo = getNo(); return getNo.substring(0, getNo.length() - 4); }
//生成年月日时分秒+随机6位数 public static String getNo() { Calendar c = Calendar.getInstance(); String year = String.valueOf(c.get(Calendar.YEAR)); String month = String.valueOf(c.get(Calendar.MONTH) + 1); String day = String.valueOf(c.get(Calendar.DAY_OF_MONTH)); String hours = String.valueOf(c.get(Calendar.HOUR_OF_DAY)); String m = String.valueOf(c.get(Calendar.MINUTE)); String s = String.valueOf(c.get(Calendar.SECOND)); if (month.length() == 1) { month = "0" + month; } if (day.length() == 1) { day = "0" + day; } if (hours.length() == 1) { hours = "0" + hours; } if (m.length() == 1) { m = "0" + m; } if (s.length() == 1) { s = "0" + s; } return year + month + day + hours + m + s + getN(6);
}
//获取4-8位随机数 public static int getN(int num) { Random random = new Random(); int number = 0; switch (num) { case 4: number = random.nextInt(8999) + 1000; break; case 5: number = random.nextInt(89999) + 10000; break; case 6: number = random.nextInt(899999) + 100000; break; case 7: number = random.nextInt(8999999) + 1000000; break; case 8: number = random.nextInt(8999999) + 10000000; break; default: number = random.nextInt(8999999) + 1000000;// 默认7位 break; } return number; }
2.判断非空
public static boolean isEmpty(Object str) { return str == null || "".equals(str) || String.valueOf(str).length() == 0 || String.valueOf(str).matches("\s*"); } public static boolean isNotEmpty(Object str){ return !isEmpty(str); }
Java工具类:
时间:
package com.yingjun.ssm.util; import java.text.SimpleDateFormat; import java.util.Date; /** * TimeUtils * */ public class TimeUtils { private final static long minute = 60 * 1000;// 1分钟 private final static long hour = 60 * minute;// 1小时 private final static long day = 24 * hour;// 1天 private final static long month = 31 * day;// 月 private final static long year = 12 * month;// 年 public static final SimpleDateFormat DATE_FORMAT_DATE_D = new SimpleDateFormat("yyyy-MM-dd"); public static final SimpleDateFormat DATE_FORMAT_DATE_M = new SimpleDateFormat("yyyy-MM-dd HH:mm"); public static final SimpleDateFormat DATE_FORMAT_DATE_S = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); private TimeUtils() { throw new AssertionError(); } /** * long time to string * * @param timeInMillis * @param dateFormat * @return */ public static String getTime(long timeInMillis, SimpleDateFormat dateFormat) { return dateFormat.format(new Date(timeInMillis)); } /** * long time to string, format is {@link #DEFAULT_DATE_FORMAT} * * @param timeInMillis * @return */ public static String getTime(long timeInMillis) { return getTime(timeInMillis, DATE_FORMAT_DATE_S); } /** * get current time in milliseconds * * @return */ public static long getCurrentTimeInLong() { return System.currentTimeMillis(); } /** * get current time in milliseconds, format is {@link #DEFAULT_DATE_FORMAT} * * @return */ public static String getCurrentTimeInString() { return getTime(getCurrentTimeInLong()); } /** * get current time in milliseconds * * @return */ public static String getCurrentTimeInString(SimpleDateFormat dateFormat) { return getTime(getCurrentTimeInLong(), dateFormat); } public static String getTimeFormatText(Date date) { if (date == null) { return null; } long diff = new Date().getTime() - date.getTime(); long r = 0; if (diff > year) { r = (diff / year); return r + "年前"; } if (diff > month) { r = (diff / month); return r + "个月前"; } if (diff > day) { r = (diff / day); return r + "天前"; } if (diff > hour) { r = (diff / hour); return r + "小时前"; } if (diff > minute) { r = (diff / minute); return r + "分钟前"; } return "刚刚"; } }
请求的返回类型封装JSON结果:
package com.yingjun.ssm.dto; import com.fasterxml.jackson.annotation.JsonInclude; import java.io.Serializable; /** * * @author yingjun * * ajax 请求的返回类型封装JSON结果 */ @JsonInclude(JsonInclude.Include.NON_NULL) public class BaseResult<T> implements Serializable { private static final long serialVersionUID = -4185151304730685014L; private boolean success; private T data; private String error; public BaseResult(boolean success, String error) { this.success = success; this.error = error; } public BaseResult(boolean success, T data) { this.success = success; this.data = data; } public boolean isSuccess() { return success; } public void setSuccess(boolean success) { this.success = success; } public T getData() { return data; } public void setData(T data) { this.data = data; } public String getError() { return error; } public void setError(String error) { this.error = error; } @Override public String toString() { return "BaseResult [success=" + success + ", data=" + data + ", error=" + error + "]"; } }
对未处理的错误信息做一个统一处理:
package com.yingjun.ssm.exception; import com.alibaba.fastjson.JSON; import com.yingjun.ssm.dto.BaseResult; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Component; import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.servlet.HandlerExceptionResolver; import org.springframework.web.servlet.ModelAndView; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.PrintWriter; /** * 错误信息统一处理 * 对未处理的错误信息做一个统一处理 * @author yingjun * */ @Component public class GlobalExceptionResolver implements HandlerExceptionResolver { private final Logger LOG = LoggerFactory.getLogger(this.getClass()); @ResponseBody public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) { LOG.error("访问" + request.getRequestURI() + " 发生错误, 错误信息:" + ex.getMessage()); //这里有2种选择 //跳转到定制化的错误页面 /*ModelAndView error = new ModelAndView("error"); error.addObject("exMsg", ex.getMessage()); error.addObject("exType", ex.getClass().getSimpleName().replace(""", "'"));*/ //返回json格式的错误信息 try { PrintWriter writer = response.getWriter(); BaseResult<String> result=new BaseResult(false, ex.getMessage()); writer.write(JSON.toJSONString(result)); writer.flush(); } catch (Exception e) { LOG.error("Exception:",e); } return null; } }
spring配置文件需加上如下:
<!--全局异常捕捉 --> <bean class="com.yingjun.ssm.exception.GlobalExceptionResolver" />
序列化工具类:
package com.yingjun.ssm.util; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.util.List; import com.dyuproject.protostuff.LinkedBuffer; import com.dyuproject.protostuff.ProtostuffIOUtil; import com.dyuproject.protostuff.Schema; import com.dyuproject.protostuff.runtime.RuntimeSchema; /** * 序列话工具 */ public class ProtoStuffSerializerUtil { /** * 序列化对象 * @param obj * @return */ public static <T> byte[] serialize(T obj) { if (obj == null) { throw new RuntimeException("序列化对象(" + obj + ")!"); } @SuppressWarnings("unchecked") Schema<T> schema = (Schema<T>) RuntimeSchema.getSchema(obj.getClass()); LinkedBuffer buffer = LinkedBuffer.allocate(1024 * 1024); byte[] protostuff = null; try { protostuff = ProtostuffIOUtil.toByteArray(obj, schema, buffer); } catch (Exception e) { throw new RuntimeException("序列化(" + obj.getClass() + ")对象(" + obj + ")发生异常!", e); } finally { buffer.clear(); } return protostuff; } /** * 反序列化对象 * @param paramArrayOfByte * @param targetClass * @return */ public static <T> T deserialize(byte[] paramArrayOfByte, Class<T> targetClass) { if (paramArrayOfByte == null || paramArrayOfByte.length == 0) { throw new RuntimeException("反序列化对象发生异常,byte序列为空!"); } T instance = null; try { instance = targetClass.newInstance(); } catch (InstantiationException | IllegalAccessException e) { throw new RuntimeException("反序列化过程中依据类型创建对象失败!", e); } Schema<T> schema = RuntimeSchema.getSchema(targetClass); ProtostuffIOUtil.mergeFrom(paramArrayOfByte, instance, schema); return instance; } /** * 序列化列表 * @param objList * @return */ public static <T> byte[] serializeList(List<T> objList) { if (objList == null || objList.isEmpty()) { throw new RuntimeException("序列化对象列表(" + objList + ")参数异常!"); } @SuppressWarnings("unchecked") Schema<T> schema = (Schema<T>) RuntimeSchema.getSchema(objList.get(0).getClass()); LinkedBuffer buffer = LinkedBuffer.allocate(1024 * 1024); byte[] protostuff = null; ByteArrayOutputStream bos = null; try { bos = new ByteArrayOutputStream(); ProtostuffIOUtil.writeListTo(bos, objList, schema, buffer); protostuff = bos.toByteArray(); } catch (Exception e) { throw new RuntimeException("序列化对象列表(" + objList + ")发生异常!", e); } finally { buffer.clear(); try { if (bos != null) { bos.close(); } } catch (IOException e) { e.printStackTrace(); } } return protostuff; } /** * 反序列化列表 * @param paramArrayOfByte * @param targetClass * @return */ public static <T> List<T> deserializeList(byte[] paramArrayOfByte, Class<T> targetClass) { if (paramArrayOfByte == null || paramArrayOfByte.length == 0) { throw new RuntimeException("反序列化对象发生异常,byte序列为空!"); } Schema<T> schema = RuntimeSchema.getSchema(targetClass); List<T> result = null; try { result = ProtostuffIOUtil.parseListFrom(new ByteArrayInputStream(paramArrayOfByte), schema); } catch (IOException e) { throw new RuntimeException("反序列化对象列表发生异常!", e); } return result; } }
redis缓存:
package com.yingjun.ssm.cache; import com.yingjun.ssm.util.ProtoStuffSerializerUtil; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.dao.DataAccessException; import org.springframework.data.redis.connection.RedisConnection; import org.springframework.data.redis.core.RedisCallback; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.stereotype.Component; import java.util.List; import java.util.Set; /** * redis缓存 * * @author yingjun * */ @Component public class RedisCache { public final static String CAHCENAME="cache";//缓存名 public final static int CAHCETIME=60;//默认缓存时间 @Autowired private RedisTemplate<String, String> redisTemplate; public <T> boolean putCache(String key, T obj) { final byte[] bkey = key.getBytes(); final byte[] bvalue = ProtoStuffSerializerUtil.serialize(obj); boolean result = redisTemplate.execute(new RedisCallback<Boolean>() { @Override public Boolean doInRedis(RedisConnection connection) throws DataAccessException { return connection.setNX(bkey, bvalue); } }); return result; } public <T> void putCacheWithExpireTime(String key, T obj, final long expireTime) { final byte[] bkey = key.getBytes(); final byte[] bvalue = ProtoStuffSerializerUtil.serialize(obj); redisTemplate.execute(new RedisCallback<Boolean>() { @Override public Boolean doInRedis(RedisConnection connection) throws DataAccessException { connection.setEx(bkey, expireTime, bvalue); return true; } }); } public <T> boolean putListCache(String key, List<T> objList) { final byte[] bkey = key.getBytes(); final byte[] bvalue = ProtoStuffSerializerUtil.serializeList(objList); boolean result = redisTemplate.execute(new RedisCallback<Boolean>() { @Override public Boolean doInRedis(RedisConnection connection) throws DataAccessException { return connection.setNX(bkey, bvalue); } }); return result; } public <T> boolean putListCacheWithExpireTime(String key, List<T> objList, final long expireTime) { final byte[] bkey = key.getBytes(); final byte[] bvalue = ProtoStuffSerializerUtil.serializeList(objList); boolean result = redisTemplate.execute(new RedisCallback<Boolean>() { @Override public Boolean doInRedis(RedisConnection connection) throws DataAccessException { connection.setEx(bkey, expireTime, bvalue); return true; } }); return result; } public <T> T getCache(final String key, Class<T> targetClass) { byte[] result = redisTemplate.execute(new RedisCallback<byte[]>() { @Override public byte[] doInRedis(RedisConnection connection) throws DataAccessException { return connection.get(key.getBytes()); } }); if (result == null) { return null; } return ProtoStuffSerializerUtil.deserialize(result, targetClass); } public <T> List<T> getListCache(final String key, Class<T> targetClass) { byte[] result = redisTemplate.execute(new RedisCallback<byte[]>() { @Override public byte[] doInRedis(RedisConnection connection) throws DataAccessException { return connection.get(key.getBytes()); } }); if (result == null) { return null; } return ProtoStuffSerializerUtil.deserializeList(result, targetClass); } /** * 精确删除key * * @param key */ public void deleteCache(String key) { redisTemplate.delete(key); } /** * 模糊删除key * * @param pattern */ public void deleteCacheWithPattern(String pattern) { Set<String> keys = redisTemplate.keys(pattern); redisTemplate.delete(keys); } /** * 清空所有缓存 */ public void clearCache() { deleteCacheWithPattern(RedisCache.CAHCENAME+"|*"); } }
redis缓存,采用Jedis Cluster
package com.yingjun.ssm.cache; import com.yingjun.ssm.util.ProtoStuffSerializerUtil; import org.springframework.stereotype.Component; import redis.clients.jedis.Jedis; import redis.clients.jedis.JedisCluster; import redis.clients.jedis.JedisPool; import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Set; /** * redis缓存 * * 采用Jedis Cluster * * @author yingjun * */ @Component public class RedisClusterCache { public final static String CAHCENAME="cache";//缓存名 public final static int CAHCETIME=60;//默认缓存时间 //@Autowired private JedisCluster jedisCluster; public <T> void putCache(String key, T obj) { final byte[] bkey = key.getBytes(); final byte[] bvalue = ProtoStuffSerializerUtil.serialize(obj); jedisCluster.set(bkey,bvalue); } public <T> void putCacheWithExpireTime(String key, T obj, int expireTime) { final byte[] bkey = key.getBytes(); final byte[] bvalue = ProtoStuffSerializerUtil.serialize(obj); jedisCluster.setex(bkey, expireTime, bvalue); } public <T> void putListCache(String key, List<T> objList) { final byte[] bkey = key.getBytes(); final byte[] bvalue = ProtoStuffSerializerUtil.serializeList(objList); jedisCluster.set(bkey,bvalue); } public <T> void putListCacheWithExpireTime(String key, List<T> objList, int expireTime) { final byte[] bkey = key.getBytes(); final byte[] bvalue = ProtoStuffSerializerUtil.serializeList(objList); jedisCluster.setex(bkey, expireTime, bvalue); } public <T> T getCache(final String key, Class<T> targetClass) { byte[] result =jedisCluster.get(key.getBytes()); if (result == null) { return null; } return ProtoStuffSerializerUtil.deserialize(result, targetClass); } public <T> List<T> getListCache(String key, Class<T> targetClass) { byte[] result =jedisCluster.get(key.getBytes()); if (result == null) { return null; } return ProtoStuffSerializerUtil.deserializeList(result, targetClass); } /** * 精确删除key * * @param key */ public void deleteCache(String key) { jedisCluster.del(key); } /** * 模糊删除key * * @param pattern */ public void deleteCacheWithPattern(String pattern) { Set<String> keys =this.keys(pattern); for(String key:keys){ jedisCluster.del(key); } } /** * 清空所有缓存 */ public void clearCache() { deleteCacheWithPattern(RedisClusterCache.CAHCENAME+"|*"); } /** * 由于JedisCluster没有提供对keys命令的封装,只能自己实现 * @param pattern * @return */ public Set<String> keys(String pattern){ Set<String> keys = new HashSet<>(); Map<String, JedisPool> clusterNodes = jedisCluster.getClusterNodes(); for(String k : clusterNodes.keySet()){ JedisPool jp = clusterNodes.get(k); Jedis connection = jp.getResource(); try { keys.addAll(connection.keys(pattern)); } catch(Exception e){ e.printStackTrace(); } finally{ //用完一定要close这个链接!!! connection.close(); } } return keys; } }
JedisCluster 集群高可用配置需加:
<bean id="jedisCluster" class="redis.clients.jedis.JedisCluster"> <constructor-arg index="0"> <set> <bean class="redis.clients.jedis.HostAndPort"> <constructor-arg index="0" value="${redis.ip1}" /> <constructor-arg index="1" value="${redis.port1}" type="int" /> </bean> <bean class="redis.clients.jedis.HostAndPort"> <constructor-arg index="0" value="${redis.ip2}" /> <constructor-arg index="1" value="${redis.port2}" type="int" /> </bean> <bean class="redis.clients.jedis.HostAndPort"> <constructor-arg index="0" value="${redis.ip3}" /> <constructor-arg index="1" value="${redis.port3}" type="int" /> </bean> <bean class="redis.clients.jedis.HostAndPort"> <constructor-arg index="0" value="${redis.ip4}" /> <constructor-arg index="1" value="${redis.port4}" type="int" /> </bean> <bean class="redis.clients.jedis.HostAndPort"> <constructor-arg index="0" value="${redis.ip5}" /> <constructor-arg index="1" value="${redis.port5}" type="int" /> </bean> <bean class="redis.clients.jedis.HostAndPort"> <constructor-arg index="0" value="${redis.ip6}" /> <constructor-arg index="1" value="${redis.port6}" type="int" /> </bean> </set> </constructor-arg> <constructor-arg index="1" value="2000" type="int"></constructor-arg> <constructor-arg index="2" value="100" type="int"></constructor-arg> <constructor-arg index="3" ref="jedisPoolConfig"></constructor-arg> </bean>
获取指定字数的字符:
private String getNumber(int size) { String str = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"; String number = ""; Random r = new Random(); for (int i = 0; i < size; i++) { number += str.charAt(r.nextInt(str.length())); } return number; }