一、Servlet上下文的基本概念
Servlet上下文又叫做:ServletContext。
当WEB服务器启动时,会为每一个WEB应用程序(webapps下的每个目录就是一个应用程序)创建一块共享的存储区域。
ServletContext也叫做“公共区域”,也就是同一个WEB应用程序中,所有的Servlet和JSP都可以共享同一个区域。
ServletContext在WEB服务器启动时创建,服务器关闭时销毁。
//通过当前Servlet类的对象,得到与它关联的ServletContext对象,也就是上下文 ServletContext application = this.getServletContext(); //HttpSession(私有区域) 与 ServletContext(公共区域) 的区别是什么? 1、作用范围不同:HttpSession是针对每一个客户端浏览器单独有一个。 ServletContext是针对每一个WEB应用程序有一个 2、存活时间不同:HttpSession第一次访问服务器,服务器端调用request.getSession()时创建,访问间隔时间超过30分钟就销毁。 ServletContext服务器启动时创建,服务器停止时销毁。
【ServletContext的5大作用】
1.获取web的上下文路径
String getContextPath();
2.获取全局的参数
String getInitParameter(String name);
Enumeration getInitParameterNames();
3.和域对象相关的
void setAttribute(String name,Onject object);
Object getAttribute(String name);
void removeAttribute(String name);
域对象(域对象就是在不同资源之前来共享数据,保存数据,获取数据)
ServletContext是我们学习的第一个域对象(Servlet共有三个域对象ServletContext、HttpServletRequest、HttpSession)
4. 请求转发
RequestDispatcher getRequestDispatcher(String path);
5.读取web项目的资源文件
二、Servlet会话
1、理解会话的作用
会话——浏览器请求一次服务器,服务器接收请求,处理之后,给出响应,这就是一次会话。
因为HTTP协议是一种“无状态”协议(断开连接式协议),也就是服务器给客户端浏览器响应之后,就会断开网络连接。下次客户端浏览器请求服务器时会再建立网络连接。实际上HTTP协议是为了保证服务器的性能。而这种情况下,默认服务器是不会记录客户端浏览器的信息的。
会话跟踪——在多次浏览器跟服务器的会话过程中,服务器必须要记录客户端浏览器的一些信息,这个叫会话跟踪。
2、会话跟踪原理
试想一下储户和银行的交互过程:
浏览器跟服务器交互的过程与其类似
三、HttpSession的使用
对于HttpSession来说,每个独立的浏览器窗口就是一个不同的客户端,会为它们分配不同的会话ID。
/* 得到会话对象 request.getSession() 方法有两重含义 1、如果浏览器是第一次请求服务器,则请求中没有会话ID,此时会分配ID,创建空间 2、如果浏览器不是第一次请求服务器,则请求中存在会话ID,此时会返回原来的HttpSession对象 */ HttpSession session = request.getSession();
HttpSession何时被创建,何时被销毁呢?
创建:第一次请求服务器,服务器端的Servlet调用了 request.getSession()方法时被创建。
销毁:如果浏览器间隔时间超过30分钟没有访问服务器,则服务器会销毁对应的HttpSession对象。(默认30分钟是可以配置的。)
<session-config> <session-timeout>30</session-timeout> </session-config>
void setAttribute(String key, Object value); 存入键值对 Object getAttribute(String key); 根据键取出对应的值 HttpSession又被称为“私有作用域”,或者也叫做“私有区域“
使用HttpSession实现保存用户信息及登录验证!
URL重写
我们前面如果要给Servlet传递数据,都是通过表单提交。
除了这种方式之外,还有一种常见的形式,就是:URL重写
URL重写的办法就是在URL地址之后传递请求参数:
格式:URL?参数名1=值1&参数名2=值2……
四、总结
1、 HttpServlet是所有我们自己编写的Servlet的父类。我们要通常要重写它的 doGet() 或 doPostt()方法。
Servlet的生命周期是怎样的?
首次访问:实例化——>初始化 init() ——> 服务 service() 根据请求是GET还是POST——> 调用 doGet() 或 doPost()
后续访问:服务 service() 根据请求是GET还是POST ——> 调用 doGet() 或doPost()
在服务器上,Servlet始终只有一个对象!
服务器关闭时:销毁 destroy()
2、 HttpServletRequest是请求对象,服务器会在有客户端请求的时候创建这个对象来保存请求的数据。
常用方法:
void setCharacterEncoding(编码方式) 设置请求内容的编码方式
String getParameter(参数名称) 得到请求参数(表单提交,URL重写)的值
HttpSession getSession() 得到一个私有区域。
首次调用:请求中没有SessionID,会创建一个新对象
后续调用:请求中有SessionID, 会得到原来的对象
3、 HttpServletResponse是响应对象,Servlet处理之后的结果会放到里面,由服务器发送给客户端浏览器。
常用方法:
void setCharacterEncoding(编码方式) 设置响应内容的编码方式
PrintWriter getWritter() 得到一个用来向客户端浏览器发送HTML内容的输出流对象
void sendRedirect(URL地址) 发送重定向(外部跳转)
4、 HttpSession 私有区域。
何时创建?
客户端浏览器第一次请求服务器,服务器端的Servlet调用了request.getSession()时创建。
何时销毁?
访问间隔时间超过30分钟(可以配置)就销毁。
SessionID是存储在客户端浏览器的内存中,而HttpSession对象存储在服务器端。每次客户端浏览器请求服务器时,会自动将SessionID发送给服务器。
常用方法:
void setAttribute(键,值)
Object getAttribute(键)
boolean isNew()
5、 ServletContext 公共区域
何时创建?
服务器启动时会为每一个WEB应用程序创建一个ServletContext。
何时销毁?
服务器停止时销毁。