您的位置:首页 > 其它

传智播客学习之Servlet提高篇

2009-12-27 14:16 281 查看
Servlet的学习已经结束一段时间了,当成功完成一个简单的web版的小型图书管理系统时,特别有种冲动去将Servlet的相关内容进行一下整理,以此来感谢带病给我们讲课的可爱可敬的冯老师。

一、Servlet的生命周期

Servlet生命周期定义了一个Servlet如何被加载,初始化,以及怎样接受请求,响应请求,提供服务。在代码中,主要体现在java.servlet.Servlet中的initservicedestory等方法中

注意运行程序顺序,第一次:构造函数,initservice destory,但是第二次的时候就直接调用service的方法,servlet消亡执行 destory()。

1) 初始化 Init()

servlet的init方法在生命周期之执行一次,当Servlet容器调用init方法之前,容器会将创建一个ServletConfig对象(是tomcat的类的对象,这个类有实现了servletconfig,遵从规范,可以让Servlet从部署描述符文件中读取一些键值对形式的参数值,还可以接受一个ServletConfig对象等),Servlet容器调用init方法,同时将创建的servlet容器调用init方法对象,ServletConfig作为init方法的实参传递。

2) 提供服务 Service()方法

生命周期中可执行多次,当客户发出请求时,Servlet容器将创建两个对象,ServletRequest(将客户端请求信息封装到对象中)ServletResponse(对客户端应答的信息封装到该对象中),Servlet容器将调用service方法,同时将请求对象和响应对象以参数形式传递service方法。可以通过实现ServletResponse接口,访问ServletOutputStream流,向客户端返回数据。

3) 释放 destroy方法

生命周期只执行一次,注意必须让其完成当前实例的service方法或是等到时间超时,才能释放。

注:一般我们直接继承HTTPServlet,一般要做初始化会覆盖那个空参数的init方法。重写doGet方法或doPost,特殊需求均重写。Service方法会自动根据请求消息头调用这两个方法。

总结:Servlet的生命周期

不存在Servlet实例,客户端发出请求,服务器通知Servlet容器装载Servlet创建实例,调用init方法初始化Servlet。然后调用对应Servlet的service方法处理相关服务,最后通过destroy方法结束servlet。

二、Servlet的Cookie和Session技术

1. Cookie技术

是一种在客户端保持HTTP状态信息的技术,Cookie是在浏览器访问WEB服务器端的某个资源时,由WEB服务器在HTTP应答头中附带传送给浏览器的一个数据,WEB服务器传送给各个客户端浏览器的数据可以是各不相同的。浏览器一般最多能存入300个Cookie,每个站点的Cookie最多可以放20个Cookie,每个Cookie大小限制在4K

注意:Cookies只能送回给创建它们的服务器,不可以送到其他的服务器

cookie工作原理

cookie的发送

1).创建Cookie对象 new Cookie(name,value)

2).设置最大时效 setMaxAge(int age),并设置Cookie的存储路径

3).将Cookie放入到HTTP响应报头

持久cookie于会话cookie的区别:

1).如果不设置过期时间,则表示这个cookie生命周期为浏览器会话期间,只要关闭浏览器窗口,cookie就消失了。这种生命期为浏览器会话期的cookie被称为会话cookie。会话cookie一般不保存在硬盘上而是保存在内存里。

2).如果设置了过期时间,浏览器就会把cookie保存到硬盘上,关闭后再次打开浏览器,这些cookie依然有效直到超过设定的过期时间。

3).存储在硬盘上的cookie可以在不同的浏览器进程间共享,比如两个IE窗口。而对于保存在内存的cookie,不同的浏览器有不同的处理方式。

cookie的读取

1).调用request.getCookies

注:要获取浏览器发送来的cookie,需要调用HttpServletRequest的getCookies方法,这个调用返回Cookie对象的数组,对应由HTTP请求中Cookie报头输入的值。

2).对数组进行循环,调用每个cookie的getName方法.

2. Session技术

Session机制采用的是在服务器端保持 HTTP 状态信息的方案。

原理:

当程序需要为某个客户端的请求创建一个session的时候, Servlet容器首先检查这个客户端的请求里是否已包含了一个session标识 - 称为session id,如果已包含一个session id则说明以前已经为此客户端创建过session, Servlet容器就按照session id把这个session检索出来使用(如果检索不到,可能会新建一个),如果客户端请求不包含session id,则为此客户端创建一个session并且生成一个与此session相关联的session id,session id的值应该是一个既不会重复,又不容易被找到规律以仿造的字符串,这个session id将被在本次响应中返回给客户端保存。

session通过SessionID来区分不同的客户, session是以cookie或URL重写为基础的,默认使用cookie来实现,系统会创造一个名为JSESSIONID的输出cookie,这个cookie是存储于浏览器内存中的,并不是写到硬盘上的,是一个会话级别的cookie。当把浏览器的cookie禁止后,web服务器会采用URL重写的方式传递Sessionid,地址栏可以看到信息。关闭浏览器,只会使浏览器端内存里的cookie消失,但不会使保存在服务器端的session对象消失,同样也不会使已经保存到硬盘上的持久化cookie消失。

注意:并不是客户端访问时就创建Session。而是调用某个servlet时才创建,在实际开发中能用request完成的,最好不要用session。注意不同客户端会有不同的Session,而且ie6在开两个浏览器窗口时,session是不共享的。

创建HTTP会话:通过HttpServletRequest提供的方法:

1) HttpSession getSession(): Web服务器会创建或找到该客户端的HttpSession对象。Web服务器查看客户端请求中是否有名为jsessionid的Cookie,没有,为客户创建Session对象,并分配一个唯一的jsessionid,用Cookie的方式响应给客户端。有,而且未超时,直接用这个jsessionid查找到对应的HttpSession对象。

2) HttpSession getSession(boolean flag):

getSession(false):当客户端先前没有建立过会话时,将返回null。

存取会话内容

1) void setAttribute(String name, Object obj) //往session属性域存放“键-值”对

2) Object getAttribute(String name) //从session属性域中取出指定名称的对象。

3) void removeAttribute(String name)

结束会话

1) void invalidate() 手动结束会话。

2) void setMaxInactiveInterval(int second) 设置会话超时的时间间隔秒值

3) 在当前应用的web.xml中配置会话超时时间间隔分钟值

4. 会话跟踪技术

1) Cookie(内存Cookie),默认采用,自动进行。通过Cookie来传递会话ID(jsessionid)

2) URL重写:在Cookie被禁用时,它会把jsessionid添加到URL结尾。

3) SSL(https)

三、Servlet的请求分派和重定向

请求分派

重定向

方法

Request.getRequestDispatcher.forward()

response.sendRedirect()

地址栏变化

转发后地址栏不发生变化

地址栏发生变化

跳转方式

容器中控制权的转向

完全的跳转,浏览器将会得到跳转的地址,并重新发送请求链接

数据变化

request对象的内容不丢失, 是服务器转发

request对象的内容丢失, 是客户端转发

请求次数

一次请求

两次请求

请求的资源

请求的资源是当前的web应用

可以是当前的web应用,也可以请求外部的资源

是否可以访问WEB-INF下的文件

可以访问

不能访问

重定向:你先去了A局,A局的人说:“这个事情不归我们管,去B局”,然后,你就从A退了出来,自己乘车去了B局。

转发:你先去了A局,A局看了以后,知道这个事情其实应该B局来管,但是他没有把你退回来,而是让你坐一会儿,自己到后面办公室联系了B的人,让他们办好后,送了过来。

最后,想真心希望冯老师的病快快好起来,我们大家希望你健健康康,你的笑容和肯定的眼神是我们坚持的动力。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: