今天完成第四章——【作为Servlet】的阅读,真是厚实的一章,内容不少:
Servlet的存在就是要为客户服务。
12、他居然用get来更新数据库,后果肯定很严重……(P93);
13、servlet的存在就是要为客户服务。servlet的任务是得到一个客户的请求,(处理请求,)再发回一个响应。(P93);
14、servlet的生命周期很简单,只有一个主要状态——初始化,如果servlet没有初始化,则要么正在初始化、正在撤销,要么就是还不存在。servlet生命周期简切:容器加载类,实例化(无参构造),init(),不断service-->doGet() doPost(),destroy()(P97);
15、每个请求都在一个单独的线程中运行,容器运行多个线程来处理对一个servlet的多个请求,对应每个客户的请求,会生成一对新的请求和响应对象。任何servlet类都不会有多个实例,只有SingleThreadModel情况例外。(P101);
16、在一个分布式Web应用中,每个JVM都会有特定servlet的一个实例,不过对每个JVM来说,仍只有该servlet的一个实例。(P101too^_^);
17、servlet从构造函数开始。但是构造函数只是使之成为一个对象,而不是一个servlet。
在调用构造函数和init()方法之间,servlet处于一章薛定谔servlet状态,不要在构造中放任何东西,可以都放在init()里。(P103);
18、GET和POST的区别:<1>发送数据的大小,<2>安全性,<3>get可以建立书签,post不能,<4>get对服务器不做任何改变,post则用于发送数据来进行处理(get为幂等,post为非幂等)。(P111~115);(谁说我不能用get中的参数来更新服务器P116);
19、可以从请求得到一个InputStream(),可以做很多事情,比如去除所有首部信息,处理请求负载(体)的原始字节,可能还会立即把它写到服务器上的一个文件中。
getHeader(),getIntHeader()中,后者返回一个整数,指示请求可以经过的最大路由跳数(如果想跟踪一个请求,看看是不是陷入一个循环,可以使用这个首部)
getRemotePort(),远程相对应servlet来讲是指客户,该方法“得到客户的端口”;getServerPort()说“请求原来发送到哪个端口?”getLocalPort()说“请求最后发送到哪个端口?”服务器会为每个线程找一个不同的本地端口,这样,一个应用就能同时处理多个客户了。(P123);
20、大多数情况下,响应只是为了向客户发回数据,不过,你也可以使用响应设置其他首部,发送错误,以及增加cookie。(P126);
21、response.setContentType("application/jar")/("text/html");设置响应内容的类型,具体类型google(P130);
22、一个响应有首部,
还有些有效负载在内部,
没有一个首部有多值,
此时就该用setHeader()。 //setHeader()会覆盖现有的值
(与addHeader()刚好相反,明白了吗? //addHeader()会增加另外一个值)
(P133);
23、重定向使得servlet完全 卸下担子,确定无法完成工作后,servlet只是调用sendRedirect()方法;不能在响应已经提交之后再调用sendRedirect()!换句话说,如果已经向流中写了东西,在想重定向就太晚了(P136~137,140);
24、重定向 = 客户,请求分派 = 服务器。
重定向:我没时间!你为什么不问问Barney呢?没准他有时间。重新打过电话,用户会在浏览器地址栏看到新的URL。
请求分派:嘿,Karl,我是Dan……我想让你办一位客户。我会把怎么练习题的详细资料转发给你,不过希望你现在就接管。一个电话另一个人继续接,地址栏URL没任何变化。(P139);
这一章太多新东西,除了拼命摘呀就是拼命抄&_&。