req.getRequestDispather("page").forward(req,resp);
作用:实现多个servlet联动操作处理请求。避免代码冗余,让servlet的职责更加明确
地址是相对路径,直接书写servlet的别名
特点:一次请求,浏览器地址栏信息不改变。
注意:请求转发转发后直接return结束即可
问题:使用请求转发后,不同的Servlet之间怎么进行数据的共享
解决:使用request对象的作用域
使用:
作用:解决了一次请求内的不同Servlet的数据(请求数据+其他数据)共享问题
作用域:基于请求转发,一次请求中的所有Servlet共享
注意:使用Request对象进行数据流转,数据只在一次请求内有效
特点:1.服务器创建 2.每次都会创建 3.生命周期一次请求
问题:
解决:使用重定向
使用:
resp.sendRedirect(“路径”)
特点:
request作用域:解决了一次请求内的servlet数据共享问题
重定向:解决了表单重复提交的问题,以及当前servlet无法处理的请求的问题
时机:
作用:解决了发送的不同请求的数据共享问题
使用:
注意:一个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();
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失效了。重定向到登陆页面,让用户重新登陆。
问题:Request解决了一次请求内的数据共享问题,session解决了用户不同请求的数据共享问题,那么不同用户的数据共享该怎么办呢?
解决:使用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();
//配置方式:注意一组标签只能存储一组键值对数据
//多组可以声明多个进行存储
name
zhangsan
//作用:将静态数据和代码进行解耦
//获取项目web下的资源绝对路径(动态获取)
String path = sc.getRealPath("/doc.1.txt");
//获取项目根目录下资源的流对象
InputStream is = sc.getResourceAsStream("/doc/1.txt");
//注意:此种方式只能获取项目根目录下的资源流对象,class文件的流对象需要使用类加载器获取
注意:不同用户可以给ServletContext对象进行存取,获取的数据不存在返回null
作用:ServletConfig对象是Servlet的专属配置对象,每个Servlet都单独拥有一个ServletConfig对象,用来获取web.xml中的配置信息
作用:存储项目相关的配置信息,保护Servlet。解耦一些数据对程序的依赖
使用位置:
区别:
内容(核心组件):
加载顺序:
ServletContext -> context-param -> listener -> filter -> servlet
核心组件:
热部署: