会话管理
1.请求转发
req.getRequestDispather("page").forward(req,resp);
作用:实现多个servlet联动操作处理请求。避免代码冗余,让servlet的职责更加明确
地址是相对路径,直接书写servlet的别名
特点:一次请求,浏览器地址栏信息不改变。
注意:请求转发转发后直接return结束即可
2.request对象作用域
问题:使用请求转发后,不同的Servlet之间怎么进行数据的共享
解决:使用request对象的作用域
使用:
- request.setAttribute(Object name,Object value);
- request.getAttribute(Object obj);
作用:解决了一次请求内的不同Servlet的数据(请求数据+其他数据)共享问题
作用域:基于请求转发,一次请求中的所有Servlet共享
注意:使用Request对象进行数据流转,数据只在一次请求内有效
特点:1.服务器创建 2.每次都会创建 3.生命周期一次请求
3.重定向
问题:
- 如果当前的请求servlet无法进行处理怎么办
- 如果使用请求转发,造成表单数据重复提交怎么办
解决:使用重定向
使用:
resp.sendRedirect(“路径”)
特点:
- 两次请求,两个request对象
- 浏览器地址栏信息改变
request作用域:解决了一次请求内的servlet数据共享问题
重定向:解决了表单重复提交的问题,以及当前servlet无法处理的请求的问题
时机:
- 如果请求中有表单数据,而数据又比较重要,不能重复提交,建议使用重定向
- 如果请求被servlet接收后,无法进行处理,建议使用重定向到可以处理的资源
4.Cookie
作用:解决了发送的不同请求的数据共享问题
使用:
- 创建Cookie对象 (key-value键值对)
- 添加Cookie信息给客户端
注意:一个Cookie对象存储一条数据,多条数据可以多创建几个Cookie对象进行存储
特点:
- 浏览器端的数据存储技术。
- 存储的数据声明在服务器.
- 临时存储:存储在浏览器的运行内存中,浏览器关闭即失效
- 定时存储:设置了Cookie的有效期,存储在客户端的硬盘中,在有效期内符合路径要求的请求都会附带该信息
- 默认cookie信息存储好之后,每次请求都会附带,除非设置有效路径
//创建Cookie对象
Cookie c = new Cookie(String name, String value);
//设置Cookie
c.setMaxAge(int expiry);//Cookie的有效期,保存在硬盘中,单位为秒
c.setPath(String url);//设置Cookie所应用的url
//响应Cookie信息
resp.addCookie(c);
//Cookie的获取
Cookie[] cks = req.getCookies();
5.Session
Request
问题:一个用户的不同请求处理的数据共享怎么办
解决:使用session
原理:用户第一次访问服务器,服务器会创建一个session对象给此对象,并将该session对象的id使用Cookie存储到浏览器中,保证用户的其他请求能够获取到同一个session对象,也就保证了不同请求能够获取到共享的数据。
特点:存储在服务器端,服务器进行创建,依赖于Cookie,一次会话,默认30分
作用:解决了一个用户不同请求处理的数据共享问题
注意:JSessionID存储在了cookie的临时存储空间中,浏览器关闭即失效
//创建/获取session对象
HttpSession hs = req.getSession();
//如果请求中拥有session的id,则返回其session对象。如果请求中没有session的id
//则创建新的session对象,并将其JSessionID作为cookie数据存储
//设置session存储时间
hs.setMaxInactiveInterval(int seconds);
//注意:销毁时间为:在指定时间内session对象没有被使用,则销毁。如果使用了,则重新计时
//设置session强制失效
hs.invalidate();
//存储和获取数据
hs.setAttribute(String name,Object value);
hs.getAttribute(String name);//返回类型为Object类型,需要强制转换
//注意:存储的动作和取出的动作发生在不同的请求中,但是存储要先于取出执行
使用时机:一般用户在登陆web项目时,会将用户的个人信息存储到session中,供该用户的其他请求使用
总结:session解决了一个用户的不同请求的数据共享问题,只要在JSessionID不失效和session对象不失效的情况下,用户的任意请求在处理时都能获取到同一个session对象
作用域:一次会话,在JSessionID和session对象不失效的情况下为整个项目内
session失效处理:将用户请求中的JSessionID和后台获取到的session对象的ID进行比对,如果一致,则session没有失效。如果不一致,则证明session失效了。重定向到登陆页面,让用户重新登陆。
6.ServletContext对象
问题:Request解决了一次请求内的数据共享问题,session解决了用户不同请求的数据共享问题,那么不同用户的数据共享该怎么办呢?
解决:使用ServletContext对象
作用:解决了不同用户的数据共享问题
原理:ServletContext对象由服务器进行创建,一个项目只有一个对象。不管在项目的任意位置进行获取得到的都是同一个对象,那么不同用户发起的请求获取到的也就是一个对象了,该对象由用户共同拥有
特点:
- 服务器创建
- 用户共享
- 一个项目各只有一个
- 声明周期:服务器启动到关闭
- 作用域:项目内
- 使用:获取ServletContext对象
//获取ServletContext对象
//第一种方式
ServletContext sc = this.getServletContext();
//第二种方式
ServletContext sc2 = this.getServletConfig().getServletContext();
//第三种方式
ServletContext sc3 = req.getSession().getServletContext();
//数据存储
sc.setAttribute(String name,Object value);
//数据获取
sc.getAttribute(String name,Object value);
//获取项目web.xml文件的全局配置
sc.getInitParameter(String name);
//根据键的名字返回web.xml中配置的全局数据的值,返回String类型,如果数据不存在返回null
//返回键名的枚举
sc.getInitParameterNames();
//配置方式:注意一组<context-param>标签只能存储一组键值对数据
//多组可以声明多个<context-param>进行存储
<context-param>
<param-name>name</param-name>
<param-value>zhangsan</param-value>
</context-param>
//作用:将静态数据和代码进行解耦
//获取项目web下的资源绝对路径(动态获取)
String path = sc.getRealPath("/doc.1.txt");
//获取项目根目录下资源的流对象
InputStream is = sc.getResourceAsStream("/doc/1.txt");
//注意:此种方式只能获取项目根目录下的资源流对象,class文件的流对象需要使用类加载器获取
注意:不同用户可以给ServletContext对象进行存取,获取的数据不存在返回null
ServletContext
作用:ServletConfig对象是Servlet的专属配置对象,每个Servlet都单独拥有一个ServletConfig对象,用来获取web.xml中的配置信息
- 获取ServletConfig对象
- 获取web.xml中的配置数据
Web.xml文件使用总结
作用:存储项目相关的配置信息,保护Servlet。解耦一些数据对程序的依赖
使用位置:
- 每个Web项目中
- Tomcat服务器中(在服务器目录conf目录中)
区别:
- Web项目下的web.xml文件为局部配置,针对本项目的位置
- Tomcat下的web.xml文件为全局配置,配置公共信息
内容(核心组件):
- 全局上下文配置
- Servlet配置
- 过滤器配置
- 监听器配置
加载顺序:
ServletContext -> context-param -> listener -> filter -> servlet
server.xml文件:
核心组件:
<Server>
<service>
<Connector/>
<Connector/>
<Engine>
<Host>
<Context/>
</Host>
</Engine>
</Service>
</Server>
热部署: