宁波实习
今天是第一天宁波实习,分班,考试
考试
一堆模棱两可的问题让我头很大,一些似懂非懂的问题也让我知道了知识的短缺。
常见的content-type及含义
http协议是建立在tcp/ip协议之上的应用层协议,主要包括三个部分,状态行,头部信息,消息主体。对应一个http请求就是:请求行,请求头,请求体。
content-type就是Http的实体首部字段,用于说明请求或返回的消息主体是用何种方式编码,在request header和response header里都存在。
1、application/x-www-form-urlencoded
1)浏览器的原生form表单
2) 提交的数据按照 key1=val1&key2=val2 的方式进行编码,key和val都进行了URL转码
此时可以直接调用request.getInputStream或request.getReader获取到请求内容,再解析出具体的参数。后者只是对前者的一个封装,可以让调用者更方便字符内容的处理。
@Override
public BufferedReader getReader() throws IOException {
if (this.reader == null) {
this.reader = new BufferedReader(new InputStreamReader(getInputStream(),
getCharacterEncoding()));
}
return this.reader;
}
public InputStreamReader(InputStream in, String charsetName)
throws UnsupportedEncodingException
{
super(in);
if (charsetName == null)
throw new NullPointerException("charsetName");
sd = StreamDecoder.forInputStreamReader(in, this, charsetName);
}
也可以通过request.getParameter获取到参数。multipart/form-data
此种方式多用于文件上传,表单数据都保存在http的正文部分,各个表单项之间用boundary分开。
一次完整的抓包如下:
POST /ecard/uploadFaceImage?timestamp=1531906535406 HTTP/1.0
Host: www.example.com
X-Real-IP: 183.156.142.242
X-Forwarded-For: 183.156.142.242
Connection: close
Content-Length: 230101
sign: 9a7d3b4978979ef65a12e34ae1cf7b2d
accept: */*
user-agent: Mozilla/5.0 (Linux; U; Android 6.0.1; zh-CN; OPPO R9s Build/MMB29M)
AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/57.0.2987.108
UCBrowser/11.8.8.968 UWS/2.13.1.42 Mobile Safari/537.36 UCBS/2.13.1.42_180629181124
ChannelId(1) NebulaSDK/1.8.100112 Nebula AlipayDefined(nt:WIFI,ws:360|0|3.0)
AliApp(AP/10.1.28.560) AlipayClient/10.1.28.560 Language/zh-Hans useStatusBar/true
isConcaveScreen/false
Cookie: ssl_upgrade=0; spanner=6tlJA6NZwnkqTDN+BMhdT7lbzLPsFJUeXt2T4qEYgj0=
Accept-Encoding: gzip
Content-Type: multipart/form-data; boundary=pgRq9HriiaBmfSo5rfyEJPtcumxb4fd6o15f_3G
--pgRq9HriiaBmfSo5rfyEJPtcumxb4fd6o15f_3G
Content-Disposition: form-data; name="personCode"
Content-Type: text/plain; charset=US-ASCII
Content-Transfer-Encoding: 8bit
DM1203
--pgRq9HriiaBmfSo5rfyEJPtcumxb4fd6o15f_3G
Content-Disposition: form-data; name="DM1203"; filename="123524587.jpg"
Content-Type:
Content-Transfer-Encoding: binary
图片二进制数据(特别长)
--pgRq9HriiaBmfSo5rfyEJPtcumxb4fd6o15f_3G--
HTTP/1.1 200
Access-Control-Allow-Origin: *
Access-Control-Allow-Methods: POST, GET, OPTIONS, DELETE
Access-Control-Max-Age: 3600
Access-Control-Allow-Headers: Origin, No-Cache, X-Requested-With,
If-Modified-Since, Pragma, Cache-Control, Expires, Content-Type
Access-Control-Allow-Credentials: true
XDomainRequestAllowed: 1
Content-Type: application/json;charset=UTF-8
Date: Wed, 18 Jul 2018 09:35:36 GMT
Connection: close
{"retCode":1,"msg":"success","data":null}
application/json
现在越来越多的应用使用application/json,用来告诉服务端消息主体是序列化的json字符串。由于json规范的流行,各大浏览器都开始原生支持JSON.stringfy。
而且spring对这个content-Type上传的数据有很好的支持,可以直接通过@RequestBody进行接收。也是当前完美适配当前流行的RestApi。
参考 https://blog.csdn.net/u014209205/article/details/81147783
java虚拟机!!!
Java程序的跨平台特性主要是指字节码文件可以在任何具有Java虚拟机的计算机或者电子设备上运行,Java虚拟机中的Java解释器负责将字节码文件解释成为特定的机器码进行运行。因此在运行时,Java源程序需要通过编译器编译成为.class文件。众所周知java.exe是java class文件的执行程序,但实际上java.exe程序只是一个执行的外壳,它会装载jvm.dll(windows下,下皆以windows平台为例,linux下和solaris下其实类似,为:libjvm.so),这个动态连接库才是java虚拟机的实际操作处理所在。
JVM是JRE的一部分。它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。JVM有自己完善的硬件架构,如处理器、堆栈、寄存器等,还具有相应的指令系统。Java语言最重要的特点就是跨平台运行。使用JVM就是为了支持与操作系统无关,实现跨平台。所以,JAVA虚拟机JVM是属于JRE的,而现在我们安装JDK时也附带安装了JRE。
java产生死锁
思路是创建两个字符串a和b,再创建两个线程A和B,让每个线程都用synchronized锁住字符串(A先锁a,再去锁b;B先锁b,再锁a),如果A锁住a,B锁住b,A就没办法锁住b,B也没办法锁住a,这时就陷入了死锁。
public class DeadLock {
public static String obj1 = "obj1";
public static String obj2 = "obj2";
public static void main(String[] args){
Thread a = new Thread(new Lock1());
Thread b = new Thread(new Lock2());
a.start();
b.start();
}
}
class Lock1 implements Runnable{
@Override
public void run(){
try{
System.out.println("Lock1 running");
while(true){
synchronized(DeadLock.obj1){
System.out.println("Lock1 lock obj1");
Thread.sleep(3000);//获取obj1后先等一会儿,让Lock2有足够的时间锁住obj2
synchronized(DeadLock.obj2){
System.out.println("Lock1 lock obj2");
}
}
}
}catch(Exception e){
e.printStackTrace();
}
}
}
class Lock2 implements Runnable{
@Override
public void run(){
try{
System.out.println("Lock2 running");
while(true){
synchronized(DeadLock.obj2){
System.out.println("Lock2 lock obj2");
Thread.sleep(3000);
synchronized(DeadLock.obj1){
System.out.println("Lock2 lock obj1");
}
}
}
}catch(Exception e){
e.printStackTrace();
}
}
}
产生死锁必须同时满足以下四个条件,只要其中任一条件不成立,死锁就不会发生。
- 互斥条件:进程要求对所分配的资源(如打印机)进行排他性控制,即在一段时间内某 资源仅为一个进程所占有。此时若有其他进程请求该资源,则请求进程只能等待。
- 不剥夺条件:进程所获得的资源在未使用完毕之前,不能被其他进程强行夺走,即只能 由获得该资源的进程自己来释放(只能是主动释放)。
- 请求和保持条件:进程已经保持了至少一个资源,但又提出了新的资源请求,而该资源 已被其他进程占有,此时请求进程被阻塞,但对自己已获得的资源保持不放。
- 循环等待条件:存在一种进程资源的循环等待链,链中每一个进程已获得的资源同时被 链中下一个进程所请求。即存在一个处于等待状态的进程集合{Pl, P2, …, pn},其中Pi等 待的资源被P(i+1)占有(i=0, 1, …, n-1),Pn等待的资源被P0占有。
安装配置JDK,tomcat,maven
从老师拷过来的压缩包解压后很多zip文件,
简单来说(因为直接自己摸索过所以这一块搞过很多次很难受),配置JDK,tomcat,maven的时候,环境变量中都要加入变量名#_HOME(如JAVA_HOME),赋值都是安装目录,其中maven需要多添加一个M2_HOME变量,值还是安装目录,然后JDK和maven都要在Path环境变量(不用新添加)里添加值JDK和maven的bin文件夹目录.之后WIN+R cmd 输入JAVA -vertion 或mvn -vertion 查看是否配置成功,遇到很多细小的问题那就难受了,百度吧。。。tomcat需要打开bin文件夹里的startup.bat文件,打开运行之后相当于启动了tomcat服务器和之前安装时候设置的端口一般默认是8080,然后浏览器搜索localhost:8080,跳出tomcat的小猫界面就说明配置成功。
这里讲的很简单,实际操作起来问题多到让人头大,特别是自己在网上下载一些包的话。
IDEA修改快捷键设置
如果你之前使用的eclipse比较多的话,换成IDEA可能很多快捷键都用的不太习惯,虽然我本人很早就开始使用IDEA,但是有些快捷键还是会需要修改一下
1.打开设置中心: file–> Settings (也可以使用快捷键:ctrl+alt+s )
settings界面如下:
2.选择keymap选项卡,在右侧的keymap下拉框中选择合适自己的快捷键(这里已eclipse为例),点击copy按钮
3.点击 apply —> 点击ok (说明:也可以直接点击ok);设置完成
二:设置快捷键
注意:我们idea默认的代码提示快捷键是ctrl+空格,但是我们知道ctrl+空格这个快捷点已经被我们的输入法使用了,那么目前就有两种方法:一:取消我们输入法中的ctrl+空格;二:修改我们idea中的代码提示的快捷键。下面的做法是采用第二种方案。
步骤一:打开设置中心(上面已经有打开的方法了,在啰嗦一遍吧): ctrl+alt+s
步骤二:选择keymap选项卡—>点击搜索图标—>让搜索框获得焦点
步骤三:打上搜索对话框的 Second stroke复选框,将按下键盘的 ctrl + 空格键
注意:这里说明一下:ctrl + 空格; 这是让你按下键盘上的 ctrl 键 和 空格键,加号不用按下呀;
步骤四:在basic上面鼠标右键 —> 选择第一项 add keyboard shortcut
步骤五:让输入框获取焦点,按下键盘的ctrl+逗号(这里讲ctrl+逗号作为代码提示功能),点击ok
步骤六:点击apply –> 点击ok 到此修改完成
参考自 https://blog.csdn.net/xinghuo0007/article/details/78441574;
今天的总结先到这里。