2018-08-16 解决实体转json时,字段为空或者null时转json后没有这个字段的问题
首先导包:
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.serializer.SerializerFeature;
然后:
String json= JSONArray.toJSONString(orList,SerializerFeature.WriteMapNullValue);
或 String json=JSONObject.toJSONString(obj,SerializerFeature.WriteMapNullValue)
2018-08-08 下载老版eclips的地址
https://www.eclipse.org/downloads/packages/release/mars/2
2018-07-12 mysql Decimal的简单理解
DECIMAL (5,2)规定了存储的值将不会超过5位数字,开且小数点后面有2位数字。
比如:123.45这个是比较规范的。如果存储123.456 则最后一位会被四舍五入。结果为:123.46
2018-07-11 switch case的用法注意点
适用类型:byte short int char 枚举类型, jdk 1.7以上可以适用字符串
不能是boolean类型
case: 后面的语句必须是常量或枚举值
default: 顺序任意
温馨提示:记得每个case 加 break(除需要求外),不然会满足case条件后会往下全部运行
2018-07-11 参数在方法间传递,方法对参数的影响
当对象、数组作为参数进行传递时,是按照地址传递,所以可以在调用的方法里修改对象的某些属性的值。
2018-07-11 给类引入日志的通用方法
引入的日志包:
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
对应获取日志类的方法:
private final Logger logger = LoggerFactory.getLogger(getClass());
在代码中的demo:
2018-07-04 在linux环境查看应用的实时日志命令
tail -800f catalina.out
使用方式:首先知道应用的日志在那个文件夹下,然后通过cd命令进入到和日志同一级后,执行上面这个命令。-800f指定最新的显示。 catalina.out是日志文件
-
linux tail命令用途是将指定的文件的最后几行输出到命令窗口,假设该文件有更新,tail会自己主动刷新,确保你看到最新的内容。
-
tail命令语法
tail [ -f ] [ -c Number | -n Number | -m Number | -b Number | -k Number ] [ File ]
参数解释:
-f 该参数用于监视File文件增长。
-c Number 从 Number 字节位置读取指定文件
-n Number 从 Number 行位置读取指定文件。
-m Number 从 Number 多字节字符位置读取指定文件,比方你的文件假设包括中文字,假设指定-c参数,可能导致截断,但使用-m则会避免该问题。
-b Number 从 Number 表示的512字节块位置读取指定文件。
-k Number 从 Number 表示的1KB块位置读取指定文件。
File 指定操作的目标文件名称
上述命令中,都涉及到number,假设不指定,默认显示10行。Number前面可使用正负号,表示该偏移从顶部还是从尾部開始计算。
tail可运行文件一般在/usr/bin/以下。
二、tail命令使用方法演示例子
1、tail -f filename(这个在查看日志文件中最常用,你执行操作,后台打印最新日子,这样就可以直接看到你执行的日志输出了。)
说明:监视filename文件的尾部内容(默认10行,相当于增加参数 -n 10),刷新显示在屏幕上。退出,按下CTRL+C。
2、tail -n 20 filename
说明:显示filename最后20行。
3、tail -r -n 10 filename
说明:逆序显示filename最后10行。
三、日志下载命令
sz 日志文件名
四、日志显示中文乱码,解决的命令
export LC_ALL=en_ZW.utf8
2018-07-04 mysql数据库中的VARCHAR(500),500这个定义的长度的理解
我们经常 mysql创建 varchar(20) name这个 20长度 究竟是表示的字符数还是字节数?根编码字符集又有没有关系?
首先 mysql 5.X 以上的版本的 定义中 表示的字符长度,如上varchar(20)你既可以添加20个英文字符,也可以添加二十个中文字符。 表示的字符长度
mysql 4.X 的版本表示的是字节长度,会根据字符集转变 内容字节长度存储。
字符集是GBK或者UTF-8在char(255)下都可已添加255个字符(字母或者汉字或者都有)
2019-01-23 ThreadLocal的应用
ThreadLocal的作用是提供线程内的局部变量,这种变量在线程的生命周期内起作用。作用:提供一个线程内公共变量(比如本次请求的用户信息),减少同一个线程内多个函数或者组件之间一些公共变量的传递的复杂度,或者为线程提供一个私有的变量副本,这样每一个线程都可以随意修改自己的变量副本,而不会对其他线程产生影响。
TheadLocal的原理:这是链接地址
在实际项目中的应用:
package com
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.List;
import java.util.Map;
public class ControllerContext {
private static Logger LOGGER = Logger.getLogger(ControllerContext.class);
private static ThreadLocal<HttpServletRequest> request = new ThreadLocal<HttpServletRequest>();
private static ThreadLocal<HttpServletResponse> response = new ThreadLocal<HttpServletResponse>();
private static ThreadLocal<Long> platformId = new ThreadLocal<Long>();
private static ThreadLocal<Long> domainGroupId = new ThreadLocal<Long>();
private static ThreadLocal<String> currentDomain = new ThreadLocal<String>();
private static ThreadLocal<Map> domains = new ThreadLocal<Map>();
private static ThreadLocal<List> mallDomainInfos = new ThreadLocal<List>();
private static ThreadLocal<FormsAuthenticationTicket> ticket = new ThreadLocal<FormsAuthenticationTicket>();
private static ThreadLocal<Map> userInfo = new ThreadLocal<Map>();
private static ThreadLocal<Integer> CATEGORY_LEVEL = new ThreadLocal<Integer>();
private static ThreadLocal<Map<String, String>> priceShowProperties = new ThreadLocal<Map<String, String>>();
private static ThreadLocal<Map<String, String>> bankShowProperties = new ThreadLocal<Map<String, String>>();
private static ThreadLocal<Map<String, String>> deliveryProperties = new ThreadLocal<Map<String, String>>();
private static ThreadLocal<Integer> CUSTOMIZED_ENABLE = new ThreadLocal<Integer>();
public static void set(HttpServletRequest request, HttpServletResponse response) {
ControllerContext.request.set(request);
ControllerContext.response.set(response);
currentDomain.set(ControllerContext.request.get().getServerName());
}
public static HttpServletRequest getRequest() {
return request.get();
}
public static HttpServletResponse getResponse() {
return response.get();
}
public static String getCurrentDomain() {
currentDomain.set(request.get().getServerName());
}
return currentDomain.get();
}
public static void setPlatformId(Long pid) {
platformId.set(pid);
}
public static Long getPlatformId() {
return platformId.get();
}
public static Long getDomainGroupId() {
return domainGroupId.get();
}
public static void setDomainGroupId(Long dgid) {
domainGroupId.set(dgid);
}
public static void setDomains(Map<Long, String> dmns) {
domains.set(dmns);
}
public static Map<Long, String> getDomains() { return domains.get(); }
public static List<MallDomainInfoVo> getMallDomainInfos() { return mallDomainInfos.get(); }
public static void setMallDomainInfos(List<MallDomainInfoVo> list) { mallDomainInfos.set(list); }
public static String getDomain(){
return getCurrentDomain();
}
public static String getDomain(Long domainType){
String domain = (String)domains.get().get(domainType);
return domain;
}
public static Long getDomainType(String domain) {
Map<Long, String> mapDomains = domains.get();
for (Map.Entry<Long, String> entry : mapDomains.entrySet()) {
if (domain.equals(entry.getValue())) {
return entry.getKey();
}
}
LOGGER.error("____ ERROR!!! couldn't get domain type: " + domain);
return -1L;
}
public static Long getCurrentDomainType() {
String curDomain = currentDomain.get();
Map<Long, String> mapDomains = domains.get();
for (Map.Entry<Long, String> entry : mapDomains.entrySet()) {
if (curDomain.equals(entry.getValue())) {
return entry.getKey();
}
}
LOGGER.error("____ ERROR!!! couldn't get current domain type: " + curDomain);
return -1L;
}
public static void setTicket(FormsAuthenticationTicket tkt){
ticket.set(tkt);
// for certain occasions. To clean later.
if (tkt != null) {
request.get().setAttribute("userName", tkt.getUsername());
}
Map userDataMap = null;
if (tkt != null) {
String userDataStr = tkt.getUserData();
if (userDataStr != null && !userDataStr.isEmpty()) {
LOGGER.debug("____ userDataStr = " + userDataStr);
userDataMap = CookieUtils.parseData(userDataStr);
}
}
userInfo.set(userDataMap);
}
public static FormsAuthenticationTicket getTicket(){
return ticket.get();
}
public static Map getUserInfo() {
return userInfo.get();
}
public static void setUserInfo(Map userInfoMap) {
userInfo.set(userInfoMap);
}
public static boolean isUserLoggedIn() {
if (ticket.get() == null || userInfo.get() == null) {
return false;
}
Map<String, String> userDataMap = userInfo.get();
String strUserId = userDataMap.get(CookieInfoType.COOKIE_NAME_USER_ID);
String strUserType = userDataMap.get(CookieInfoType.COOKIE_NAME_USER_TYPE);
long currentDomainType = getCurrentDomainType();
if (StringUtils.isNotEmpty(strUserType) && Long.parseLong(strUserType) == UserType.USER_SUB_ACCOUNT
&& (currentDomainType == DomainTypeDict.DOMAIN_MALL)) {
return false;
}
boolean isUserLoggedIn = (strUserId != null && ! strUserId.isEmpty());
return isUserLoggedIn;
}
public static Integer getCategoryLevel() {
return CATEGORY_LEVEL.get();
}
public static void setCategoryLevel(Integer categoryLevel) {
CATEGORY_LEVEL.set(categoryLevel);
}
public static Map<String, String> getPriceShowProperties() {
return priceShowProperties.get();
}
public static void setPriceShowProperties(Map<String, String> properties) {
priceShowProperties.set(properties);
}
public static Map<String, String> getBankShowProperties() {
return bankShowProperties.get();
}
public static void setBankShowProperties(Map<String, String> properties) {
bankShowProperties.set(properties);
}
public static Map<String, String> getDeliveryProperties() {
return deliveryProperties.get();
}
public static void setDeliveryProperties(Map<String, String> properties) {
deliveryProperties.set(properties);
}
public static Integer getCustomizedEnable() {
return CUSTOMIZED_ENABLE.get();
}
public static void setCustomizedEnable(Integer customizedEnable) {
CUSTOMIZED_ENABLE.set(customizedEnable);
}
public static String getCustomizedTZhfx() {
return CUSTOMIZED_TZHFX.get();
}
public static void setCustomizedTZhfx(String customizedTZhfx) {
CUSTOMIZED_TZHFX.set(customizedTZhfx);
}
}
2019-01-24 StringBuider和StringBuffer,String的用法场景和区别。老忘记,就多写几遍
String :用于少量的字符串操作。
StringBuilder:用于单线程的大量字符串操作。因为多线程下不安全。
StringBuffer:用于多线程下大量字符串操作。多线程下是安全的。
StringBuiler和StringBuffer既然都用于大量字符串操作,StringBuffer又是线程安全的,那StringBuilder存在的意义在那?速度。没错。在执行速度上
在这方面运行速度快慢为:StringBuilder > StringBuffer > String
String最慢的原因:String为字符串常量,而StringBuilder和StringBuffer均为字符串变量,即String对象一旦创建之后该对象是不可更改的,但后两者的对象是变量,是可以更改的。
2019-01-24 如何从一个http的请求url中获取域名www.****?
通过正则匹配。具体看代码!
static void ss(){
String requestUrl="http://passport.whatok.com/login/submit";
String domainInfo =null;//域名
Pattern p = Pattern.compile("(?<=http://)[^/]*(?=/)");//正則
Matcher m = p.matcher(requestUrl);//正则匹配出的部分
if(m.find()){
domainInfo = m.group();
}
System.out.println(domainInfo);
}