传智播客学习之Servlet提高篇
2009-12-27 14:16
281 查看
Servlet的学习已经结束一段时间了,当成功完成一个简单的web版的小型图书管理系统时,特别有种冲动去将Servlet的相关内容进行一下整理,以此来感谢带病给我们讲课的可爱可敬的冯老师。
一、Servlet的生命周期
Servlet生命周期定义了一个Servlet如何被加载,初始化,以及怎样接受请求,响应请求,提供服务。在代码中,主要体现在java.servlet.Servlet中的init、service、destory等方法中
注意运行程序顺序,第一次:构造函数,init,service 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的请求分派和重定向
重定向:你先去了A局,A局的人说:“这个事情不归我们管,去B局”,然后,你就从A退了出来,自己乘车去了B局。
转发:你先去了A局,A局看了以后,知道这个事情其实应该B局来管,但是他没有把你退回来,而是让你坐一会儿,自己到后面办公室联系了B的人,让他们办好后,送了过来。
最后,想真心希望冯老师的病快快好起来,我们大家希望你健健康康,你的笑容和肯定的眼神是我们坚持的动力。
一、Servlet的生命周期
Servlet生命周期定义了一个Servlet如何被加载,初始化,以及怎样接受请求,响应请求,提供服务。在代码中,主要体现在java.servlet.Servlet中的init、service、destory等方法中
注意运行程序顺序,第一次:构造函数,init,service 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局来管,但是他没有把你退回来,而是让你坐一会儿,自己到后面办公室联系了B的人,让他们办好后,送了过来。
最后,想真心希望冯老师的病快快好起来,我们大家希望你健健康康,你的笑容和肯定的眼神是我们坚持的动力。
相关文章推荐
- 传智播客Servlet学习,Servlet api,Servlet的编写与编译
- 传智播客学习之Servlet过滤器
- 传智播客Servlet学习,b/s系统架构与c/x系统架构的区别
- 传智播客Servlet学习,Servlet的特点及运行过程
- JAVA学习提高之---- FileUpload组件实现多文件上传(JSP+SERVLET)实现
- 传智播客erp项目学习,使用Ajax提高用户体验效果
- 传智播客学习之Servlet监听器
- 传智播客Servlet学习,Servlet的映射,注册和运行
- 传智播客Servlet学习,Servlet类的装载机制
- 传智播客Servlet学习,请求重定向与请求转发
- 传智播客java web 学习,Servlet事件监听器
- 传智播客Servlet学习,Tomcat中的类装载器对Servlet程序的装载机制
- 传智播客Servlet学习,ServletConfig接口和GenericServlet类
- JAVA学习提高之---- FileUpload组件实现多文件上传(JSP+SERVLET)实现
- 传智播客servlet学习,Servlet的概念和前置知识
- 传智播客Servlet学习,Servlet执行时一般要实现的几个方法
- 传智播客学习之Servlet预习
- [传智播客学习日记]多线程Thread类的基本应用
- 不断花时间学习新知识,对于一辈子来说应该提高效率的。
- Servlet学习笔记—ServletConfig参数配置与获取