个人笔记

来源:互联网 发布:软件中举报是什么意思 编辑:程序博客网 时间:2024/06/03 21:04

有时候知道一个点,一个新东西没必要去专门开一篇博客。就把平时的点滴记录这里。当作日记吧。有东西了就更新一下。



2017-07-15 Map集合 put方法put两次同值的key,第一次会被第二次覆盖。

public static void main(String[] args){    Map map=new HashMap();    map.put("aa","hello");    map.put("aa","world");    System.out.pring(map.get("aa"));}则结果是:word



2017-07-15 return会中断for循环

public static void main(String[] args) {    System.out.println(test(5));    }public static String test(int i){    for (int j = 0; j < i; j++) {        System.out.println("**********j="+j+"************");        if(j==1){            return "中断了for循环,从j=1处跳出";        }    }    return "bb";}



2017-07-15 获取资源文件.properties的路径:项目的根路径+具体文件夹下的具体文件。
项目根路径:CountNumJob.class.getClassLoader().getResource(“”).getPath()
具体文件夹下的具体文件:”MATE-INF/prop/count.properties”

String path=CountNumJob.class.getClassLoader().getResource("").getPath()+"MATE-INF/prop/count.properties";



2017-07-15 dom解析取值

dom部分节点节选:<datas>    <row col1="1" col2="000001"/></datas>问题:如何获取col2的值呢?col1,col2 为节点row的属性。也就是获取属性值。这里需要三个入参,dom文件,节点名称,属性名称。public String getNodeAtrr(Document document,String nodeName,String attrName){    NodeList nodeList=document.getElementByName(nodeName);    if(nodeList.getLength()>0){        Node node = nodeList.item(0);        if(node ==null){            return "";        }        Element element=node;        String value=element.getAttribute(attrName);        if(value !=null && value !=null){            value=value.trim();            return value;        }else{            return "";        }    }else{        return "";    }}



2017-07-17 测试解析报文的新手段
有些时候要测试一段对出参报文的解析是否能正确运行,又因为这段代码是核心方法的一部分,其前面还有很多别的方法调用,这里的出参依赖于前面方法的回参,因此用soupui反而太麻烦,最好是把这段解析代码单独拿到main方法中测试。问题在于如果手动拼接回参比较麻烦,这里有个别的方法来代替—读取文件的方式。直接把回参copy到一个文件,然后读取,用apache自带的文件解析工具可以转换成回参的String类型。然后解析称document就可以操作了。
注意点:
1.文件格式一定sava as ‘UTF-8’
2.XML报文在文件里保存注意开始不能有空格,不能大写XML。顶满格写入参,不然dom工具解析回报错—‘the processing instruction target matching “[xX][mM][lL]” is not allowed’
3.FileUtils.readFileToString工具方法可以对文件设置中文格式。

String returnXml=FileUtils.readFileToString(new File("D:/test/testdom.xml"),"UTF-8");Document document=null;try{    document=XMLUtils.parse(returnXml);}catch(IOException e){    e.printStackTrace();}String agentCode=XMLUtils.getNodeAttr(document,"row","col2");System.out.println(agentCode);



2017-07-17 JAXB中的注解@Xml…的注意点

@XmlElementWrapper ,对于数组或集合(即包含多个元素的成员变量),生成一个包装该数组或集合的XML元素(称为包装器)。@XmlRootElement,将Java类或枚举类型映射到XML元素。@XmlElement,将Java类的一个属性映射到与属性同名的一个XML元素。@XmlAttribute,将Java类的一个属性映射到与属性同名的一个XML属性。其他:对于要序列化(marshal)为XML的Java类,绝不能把成员变量声明为public,否则运行将抛出异常com.sun.xml.internal.bind.v2.runtime.IllegalAnnotationsException。对于JAXB相关的重要Annotation的声明,如@Xml.....,可以放在成员变量的setter()或getter()方法上,两者中任选其一即可,但决不能放在成员变量上,否则运行将抛出异常com.sun.xml.internal.bind.v2.runtime.IllegalAnnotationsException



2017-07-20 实体和json互转知识之Gson合集:
json和Gson
json转化利器Gson


2017-07-24 DB2数据库时间格式转为字符串显示24小时值,不是12小时的格式。

正常我们格式化时间格式为字符串显示24小时用的是format(“yyyy-MM-dd HH:mm:ss”),但在数据库中的format时间格式为字符串还是有区别的。在DB2中:
“YYYY-MM-DD HH:MI:SS” 十二小时制;
“YYYY-MM-DD HH24:MI:SS” 二十四小时制。
(“YYYY-MM-DD hh:mm:ss”或者’yyyy-MM-dd HH:mm:ss’不会报错,但是mm值取的是月的值,而不是时间的分钟值。)

SELECT TO_CHAR(TIMESTAMP('2012-5-25 21:18:12'),'YYYY-MM-DD') FROM SYSIBM.DUAL;--2012-05-25SELECT TO_CHAR(TIMESTAMP('2012-5-25 21:18:12'),'YYYY-MM-DD HH:MI:SS') FROM SYSIBM.DUAL;--2012-05-25 09:18:12SELECT TO_CHAR(TIMESTAMP('2012-5-25 21:18:12'),'YYYY-MM-DD HH24:MI:SS') FROM SYSIBM.DUAL;--2012-05-25 21:18:12(SELECT TO_CHAR(TIMESTAMP('2012-5-25 21:18:12'),'YYYY-MM-DD HH24:MM:SS') FROM SYSIBM.DUAL;--2012-05-25 21:05:12)

参考链接:db2日期和时间常用汇总



2017-07-24 报文转实体类时间的String类型转换为空值问题

xml转实体类,用到JAXB。先看mq报文中这个节点:<?xml version="1.0" encoding="UTF-8"?><MQ>    <OPERATETIME>2017-07-24 15:23:47</OPERATETIME></MQ>再看实体类对应的字段和注解:private timestamp operationTime;@XmlElement(name="OPERATETIME")@XmlJavaTypeAdapter(DateAdapter.class)public Timestamp getOperationTime(){    return (Date)getData().get("operationTime");}public void setOperationTime(Timestamp operationTime){    getData().put("operationTime",operationTime);    this.operationTime=operationTime;}这样转实体类时,时间的值并没有赋上值,而是null.原因在于类型错误。这里不该用java.sql.timestamp类型,应该用java.util.Date类型。所以这也是个经验:就是xml转实体类遇到时间格式的赋值要用Date类型,用JAXB是无法让java.sql.Timestamp 和xml的类绑定。另外还要标注@XmlJavaTypeAdapter声明为时间类型。有时,有的类和xml无法完全绑定,即xml和类中的某个属性无法绑定;同时JAXB要求类必须有个默认的构造函数,

参考:XmlJavaTypeAdapter



2017-07-27 ssm框架中mapper文件的查询语句中where条件为Integer类型,但是如果用 id=#{id},则生成的语句自动为参数值加上引号。如何处理?

这里就要设置类型。id=#{id,jdbcType=INTEGER},这样就可以了。



2017-07-27 有关业务方面:某公司下属分公司有北京分公司码=1,湖北分公司码=2,河南分公司=3,这些分公司下都有下属机构北京一部1TT,北京二部2TT,北京三部3TT,而湖北和河南的下属机构码也是1TT,2TT,3TT.那么如果查询湖北二部的信息。只用where 湖北二部码=2TT很显然不行了。但要求入参只能为一个。即只有一个where 条件。

解决办法:将入参进行改造为 '分公司码_机构码'这样的list集合为入参。例如  salecomList=[1-1TT,2-1TT,2-2TT]传入mapper,然后在mapper中进行遍历。where 1=1 <if test ="salecom !=null and salacom !=''">    and sp.managecom||'_'||sp.salecom in    <foreach item="item" index="index" collection="salecomList" open="(" separator="," close=")">        #{item}    </foreach></if>



2017-08-03 TCP连接,HTTP连接和二者的区别。

建立起一个TCP连接需要经过‘三次握手’第一次握手:客户端发送syn包(syn=j)到服务器,并进入SYN_SEND状态,等待服务器确认;第二次握手:服务器端收到syn包,必须确认客户端的SYN(ack=j+1),同时自己也发送一个SYN包(syn=k) SYN+ACK 包,此时服务器进入SYN_RECV状态;第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器端进入ESTABLISHED状态,完成三次握手。握手过程中传送的包里不包含数据,三次握手完毕,客户端和服务端才开始正式传送数据。理想状态下,连接一旦建立,在通信双方中的任何一方主动关闭连接之前,TCP连接都将被一致保存下去。断开连接时服务器和客户端均可以发起断开TCP连接的请求。断开过程需要经过‘四次握手’。HTTP连接HTTP协议即超文本传送协议(Hypertext Transfer Protocol),是Web联网的基础,也是收集联网的常用 的协议。HTTP协议是建立在TCP协议之上的一种应用。HTTP连接最显着的特点是客户端发送的每次请求都需要服务器会送响应,在请求结束后,会主动释放连接。从建立连接到关闭连接的过程称为‘一次连接’。1) 在HTTP1.0中,客户端的每次请求都要求建立一次单独的链接,在处理完本次请求后,就自动释放连接。2) 在HTTP1.1中则可以在一次链接中处理多个请求,并且多个请求可以重叠进行,不需要等待一个请求结束发送下一个请求。由于HTTP在每次请求结束后都会主动释放连接,因此HTTP连接是一种“短连接”,要保持客户端程序的在线状态,需要不断地向服务器发起连接请求。通常的做法是即时不需要获得任何数据,客户端也保持每隔一段固定的时间向服务器发送一次“保持连接”的请求,服务器在收到该请求后对客户端进行回复,表明知道客户端“在线”。若服务器长时间无法收到客户端的请求,则认为客户端“下线”,若客户端长时间无法收到服务器的回复,则认为网络已经断开。



2017-08-03 SOKET原理

1.套接字(socket)概念套接字socket是通信的基石,是支持TCP/IP协议的通信的基本操作单元。它是网络通信过程中的端点抽象表示,包含进行网络通信必须的五中信息:连接使用的协议本地主机的IP地址本地进程的协议端口远程主机的IP地址远程地点进程的协议端口应用层通过传输层进行数据通信时,TCP会遇到同时为多个应用程序进程提供并发服务的问题。多个TCP连接或多个应用程序进程可能需要通过同一个TCP协议端口号传输数据。为了区别不同的应用程序的进程和连接,许多计算机操作系统为应用程序与TCP/IP协议交互提供了套接字Socket接口。应用层可以和传输层通过Socket接口,区分来自不同应用程序进程或网络连接的通信,实现数据传输的并发服务。2.建立socket连接建立Socket连接至少需要一对套接字,其中一个运行于客户端,成为ClientSocket,另一个运行于服务器端,成为ServerSocket.套接字之间的连接过程分为三个步骤:服务器监听,客户端请求,连接确认。服务器监听:服务器端套接字并不定位具体的客户端套接字,而是处于等待连接的状态,实时监控网络状态,等待客户端的链接请求。客户端请求:客户端套接字提出连接请求,要连接的目标是服务器端的套接字。为此,客户端的套接字必须首先描述他要连接的服务器的套接字,支出服务器端套接字的地址和端口号,然后就向服务器端套接字提出连接请求。连接确认:当服务器端套接字间听到或者说接受者到客户端套接字的链接请求时,就响应客户端套接字的请求,建立一个新的线程,把服务器端的套接字的描述发送给客户端,一旦客户端确认了此描述,双方就正式建立的链接。而服务器端套接字继续处于监听状态,继续接收其他客户端套接字的链接请求。3.SOCKET连接与TCP连接创建Socket连接时,可以指定使用的传输层协议,Socket可以支持不同的传输层协议TCP/UDP,当使用TCP协议进行连接时,该Socket连接就是一个TCP链接。4.Socket连接与HTTP连接由于通常情况下Socket连接就是TCP连接,因此Socket连接一旦建立,通信双方即可开始相互发送数据内容,直到双发连接断开,但实际网络应用中,客户端到服务端之间的通信往往需要穿越多个中间节点,例如路由器,网关,防火墙等,大部分防火墙默认会关闭长时间处于非活跃状态的链接而导致Socket连接断开,因此需要通过轮循告诉网络,该连接处于活跃状态。而HTTP连接使用的是“请求-响应”的方式,不仅在请求时需要先建立连接,而且需要客户端向服务器端发出请求后,服务端才能回复数据。
原创粉丝点击