1.Servlet 的生命周期:
1) 当一个servlet第一次被调用的时候,容器会创建servlet对象,并且调用init()方法进行初始化,一个servlet只会创建一个对象;
2) 调用service方法判断请求的提交方式;
3) 执行具体的业务逻辑代码;
4)当这个servlet被销毁的时候,会调用destroy方法来做收尾的工作;
2.Servlet不是一个人在战斗.
Servlet没有main方法,它们受控于另外的一个java程序,称之为容器(container)。
容器能够提供什么?
1) 通信的支持:不用自己去创建ServerSocket,监听接口,不用创建流,容器知道如何去通信,使你只关心业务逻辑;
2) 管理生命周期:容器控制着servlet的生和死,负责加载,实例化和初始化servlet,并调用生命周期方法;
3) 多线程的支持:会为每一个servlet请求创建一个新的java线程;
4) JSP的支持:能够把JSP翻译成为一个真正的Servlet。
3.容器如何处理请求?
1) 用户发送一个HTTP请求,指向的是一个Servlet而不是静态页面;
2) 容器看出来这个请求是一个servlet,就会创建两个对象
HttpServletRequest
HttpServletResponse
3) 容器根据请求报文中的url找到正确的servlet,并且为这个servlet对象创建或分配一个线程,把请求和响应对象传递给servlet线程;
4) 容器会调用service方法,根据不同的类型调用doGet或doPost
5) doGet方法调用,生成一个动态的HTML,并且传递给响应对象
6) 线程结束,容器会将响应对象转换成HTTP响应报文,发回客户端,删除请求和响应对象。
4.请求和响应对象
1) 请求对象 (javax.servlet.http.HttpServletRequest) ServletRequest
作用:
1> 提取客户端的信息
username=tom&pwd=123
- 提取客户端提交的表单信息(页面控件的值);
- 提取客户端的详细信息(ip,提交方法…)
- 提取客户端的Cookie信息
例子:用户登录功能,在servlet中检查提交上来的值
2> 设置字符集
- 表单以Post方式提交
- 页面的字符集必须是支持中文
- Request设定的字符集和页面的字符集要一致;
3> 资源的跳转 – 请求转发
4> 作用域,可以用来传值
2) 响应对象 (javax.servlet.http.HttpServletResponse)ServletResponse
1> 设定字符集;
2> 向客户端发送信息
- HTML页面
- XML信息 – AJAX
- 发送Cookie信息
- 发送任意类型的文件信息 – 文件的下载;
3> 提供页面跳转的功能 – 请求重定向
5.两种跳转方式的区别
Request对象提供的跳转叫做 请求转发(站内跳转)
Response对象提供的跳转叫做请求重定向
1> 请求转发实际上是问题的转发,在跳转的过程中并没有响应客户端,在源和目标之间是可以用request对象进行传值的;请求重定向在跳转的过程中实际上是响应了客户端了,客户端发送了两次请求,不能够使用request进行传值的;
2> 客户端可以看到请求重定向目标资源的URL,不能看到请求转发目标资源的URL;
3> 请求转发速度快,请求重定向速度慢;
4> 请求转发只能访问站内资源,而请求重定向可以定位到站外资源(比如 百度);
6. Cookie的使用
可以在客户端保存信息;可以把信息保存在客户端的文件中,或浏览器的缓冲中。纯文本的,以name-value对的形式保存;
- request对象,可以将cookie信息从客户端发送到服务器端;
- response对象,可以向客户端写cookie信息;
7.Session对象
Session对象是一个作用域,可以用来存属性(attribute)值,这个作用域可以持续多个请求,保存用户的会话信息;
Session对象是在服务器端生成的,由容器来进行维护;一般来讲,我们会在用户登录成功以后,把用户的详细信息保存在当前会话的session对象中,在当前会话后续的请求中,都可以通过session对象得到当前用户的详细信息;
我们约定,只有session对象中有用户的信息,就说明用户已经登录了。
使用request.getSession()方法可以得到session对象,当用户第一次调用这个方法,会新建一个session对象,每个session对象都有一个唯一的id,这个id会随着响应,以cookie的形式发送到客户端,客户端后面的请求中都会将id发回服务器,服务器就会找到当前会话所对应的session对象。
含有Sessionid的cookie由容器维护,而且保持在客户端的浏览器缓存中,这就意味着一旦客户关闭的浏览器,就结束了本次会话。
Session的三种死法:
1). 超时;
2). 调用invalidate;(销毁当前会话的session对象)
3). 应用结束; (所有的session对象都会被销毁)
如果cookie被禁用的话,还有一个补救的办法来使用session,就是URL重写,response对象中有一个encodeURL方法,可以进行URL的重写
监控Session的使用情况,监控session的创建,session的销毁,什么时候向session里存入什么值…
关于session的监听器
1). HttpSessionListener(接口):监控session的创建和销毁;
2). HttpSessionAttributeListener (接口):监控session对象的添加,删除和修改;
3). HttpSessionBindingListener (接口):监控某一个类的对象在session中的出入情况;
8.容器如何找到Servlet?
一个servlet有三个名字
1). 类名:开发人员所关注的;
2). 部署名(内部名):部署人员关注的;
3). 公共的URL名:客户;
<servlet>标签将内部名和类名映射到一起
<servlet-mapping>将内部名映射到公共的URL名上
web容器是一种服务程序,在服务器一个端口就有一个提供相应服务的程序,而这个程序就是处理从客服端发出的请求,如JAVA中的Tomcat容器,ASP的IIS或PWS都是这样的容器。一个服务器可以多个容器。