Java学习笔记

1.DNS解析域名的过程
使用域名转换成IP地址,先看浏览器缓存里面有没有域名到具体ip的解析内容(解释浏览器会检查缓存中有没有这个域名对应的解析过的IP地址,如果缓存中有,这个解析过程就结束。浏览器缓存域名也是有限制的,不仅浏览器缓存大小有限制,而且缓存的时间也有限制,通常情况下为几分钟到几小时不等,域名被缓存的时间限制可以通过TTL属性来设置。这个缓存时间太长和太短都不太好,如果时间太长,一旦域名被解析到的IP有变化,会导致被客户端缓存的域名无法解析到变化后的IP地址,以致该域名不能正常解析,这段时间内有一部分用户无法访问网站。如果设置时间太短,会导致用户每次访问网站都要重新解析一次域名),如果没有那就读取本地HOST文件,本地文件没有,那么就从当前电信网管获取对应IP。
本地host文件 C:\Windows\System32\drivers\etc

2.Servlet重要的四个生命周期方法
构造方法: 创建servlet对象的时候调用。默认情况下,第一次访问servlet的时候创建servlet对象只调用1次。证明servlet对象在tomcat是单实例的。
init方法: 创建完servlet对象的时候调用。只调用1次。
service方法: 每次发出请求时调用。调用n次。
destroy方法: 销毁servlet对象的时候调用。停止服务器或者重新部署web应用时销毁servlet对象。只调用1次。

3.Servlet的多线程并发问题
注意: servlet对象在tomcat服务器是单实例多线程的。

	因为servlet是多线程的,所以当多个servlet的线程同时访问了servlet的共享数据,如成员变量,可能会引发线程安全问题。

	解决办法:
			1)把使用到共享数据的代码块进行同步(使用synchronized关键字进行同步)
			2)建议在servlet类中尽量不要使用成员变量。如果确实要使用成员,必须同步。而且尽量缩小同步代码块的范围。(哪里使用到了成员变量,就同步哪里!!),以避免因为同步而导致并发效率降低。

		Servlet学习:
			 HttpServletRequest  请求对象:获取请求信息
			 HttpServletResponse 响应对象: 设置响应对象
			 ServletConfig对象    servlet配置对象
			 ServletContext对象; servlet的上下文对象

4.Cookie原理
1)服务器创建cookie对象,把会话数据存储到cookie对象中。
new Cookie(“name”,“value”);
2) 服务器发送cookie信息到浏览器
response.addCookie(cookie);

					举例: set-cookie: name=eric  (隐藏发送了一个set-cookie名称的响应头)
			3)浏览器得到服务器发送的cookie,然后保存在浏览器端。
			4)浏览器在下次访问服务器时,会带着cookie信息
				    举例: cookie: name=eric  (隐藏带着一个叫cookie名称的请求头)
			5)服务器接收到浏览器带来的cookie信息
					request.getCookies();

Cookie的细节
1)void setPath(java.lang.String uri) :设置cookie的有效访问路径。有效路径指的是cookie的有效路径保存在哪里,那么浏览器在有效路径下访问服务器时就会带着cookie信息,否则不带cookie信息。

		2)void setMaxAge(int expiry) : 设置cookie的有效时间。
				正整数:表示cookie数据保存浏览器的缓存目录(硬盘中),数值表示保存的时间。
				负整数:表示cookie数据保存浏览器的内存中。浏览器关闭cookie就丢失了!!
				零:表示删除同名的cookie数据
		3)Cookie数据类型只能保存非中文字符串类型的。可以保存多个cookie,但是浏览器一般只允许存放300个Cookie,每个站点最多存放20个Cookie,每个Cookie的大小限制为4KB。

Cookie与Session讲解_编程
5.Session技术
session 也是一种记录客户状态的机制,不同的是 cookie 保存在客户端浏览器中,而 session保存在服务器上。客户端浏览器访问服务器的时候把客户端信息以某种形式记录在后台服务器
上,这就是 session 中查找该客户的状态。
引入
Cookie的局限:
1)Cookie只能存字符串类型。不能保存对象
2)只能存非中文。
3)1个Cookie的容量不超过4KB。
如果要保存非字符串,超过4kb内容,只能使用session技术!!!

session 生命周期:
session 保存在服务器端,为了获得更高的存取速度,服务器一般把 session 放在内存(解释:这里指的是后台服务器内存)。每个用户都会有一个独立的 session,如果 session 内容过于复杂,当大量客户访问服务器时可能会导致内存溢出(解释:后台服务器内存有限,所以可能会导致后台服务器内存溢出)。
session 在用户第一次访问服务器的时候自动创建,需要注意只有访问 JSP,Servlet 等程序
时才会创建 session;只要访问 HTML、IMAGE 等静态资源不会创建 session。
如果尚未生成
session,可以使用 request.getSession(true)强制生成 session。
session 生成后,只要用户访问,服务器就会更新 session 的最后访问时间,并维护该 session。
用户每访问服务器一次,无论是否续写 session 服务器都认为该用户的 session 活跃(active)
了一次。
Session 对应的类是 javax.servlet.http.HttpSession,每一个访问者都对应一个 session 对象,
并将其状态信息保存在这个 session 对象中,session 对象的创建是在用户第一次访问服务器时产生的
Session特点:
会话数据保存在服务器端。(内存中)

Session技术核心
HttpSession类:用于保存会话数据

		1)创建或得到session对象
			HttpSession getSession()  
			HttpSession getSession(boolean create)  
		2)设置session对象
			void setMaxInactiveInterval(int interval)  : 设置session的有效时间
			void invalidate()     : 销毁session对象
			java.lang.String getId()  : 得到session编号
		3)保存会话数据到session对象
			void setAttribute(java.lang.String name, java.lang.Object value)  : 保存数据
			java.lang.Object getAttribute(java.lang.String name)  : 获取数据
			void removeAttribute(java.lang.String name) : 清除数据

Session原理
问题: 服务器能够识别不同的浏览者!!!
现象:

   前提: 在哪个session域对象保存数据,就必须从哪个域对象取出!!!!
		浏览器1:(给s1分配一个唯一的标记:s001,把s001发送给浏览器)
				1)创建session对象,保存会话数据
						HttpSession session = request.getSession();   --保存会话数据 s1
		浏览器1	的新窗口(带着s001的标记到服务器查询,s001->s1,返回s1)	
				1)得到session对象的会话数据
					    HttpSession session = request.getSession();   --可以取出  s1

		新的浏览器1:(没有带s001,不能返回s1)
				1)得到session对象的会话数据
					    HttpSession session = request.getSession();   --不可以取出  s2

		浏览器2:(没有带s001,不能返回s1)
				1)得到session对象的会话数据
					    HttpSession session = request.getSession();  --不可以取出  s3

Session细节****加粗样式
1)java.lang.String getId() : 得到session编号
2)两个getSession方法:
getSession(true) / getSession() : 创建或得到session对象。没有匹配的session编号,自动创 建新的session对象。
getSession(false): 得到session对象。没有匹配的session编号,返回null
3)void setMaxInactiveInterval(int interval) : 设置session的有效时间
session对象销毁时间:
3.1 默认情况30分服务器自动回收
3.2 修改session回收时间
3.3 全局修改session有效时间