宁波实习day1

宁波实习

今天是第一天宁波实习,分班,考试

考试

一堆模棱两可的问题让我头很大,一些似懂非懂的问题也让我知道了知识的短缺。

常见的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 )
Alt
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;

今天的总结先到这里。

over

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值