JavaWeb域对象
1.域对象的定义
域对象:把某个范围作为对象使用,并通过这个对象的Map在范围内实现资源共享(可在不同的Servlet中进行数据传递的对象)
作用域:域对象共享的数据的生效范围
2.域对象必须有的方法
1 | setAttribute(name,value); // 设置域属性(属性名,值) |
3.四大域对象
JavaWeb的四大作用域为:PageContext,ServletRequest,HttpSession,ServletContext:
- PageContext: 作用范围是整个JSP页面。
- ServletRequest:作用范围是一次请求链。
- HttpSession:作用范围是一次会话。
- ServletContext: 作用范围是整个Web应用。
之所以他们是域对象,原因是他们都内置了map
集合,都有setAttribute
和getAttribute
方法。
作用域从小到大为:PageContext(jsp页面),ServletRequest(一次请求),HttpSession(一次会话),ServletContext(整个web应用)。
3.1、ServletRequest域
Request
的生命周期1.当请求来时创建
request
对象。
2.当请求结束时,request
就销毁。
3.每次请求都是一个新的request
对象。request
域对象,是建议使用,并被频繁使用的域对象,因为它声明周期比较短,也就代表着,它效率比较高,释放资源比较及时。作用范围:
一次请求链(请求转发也存在)
功能
- 通过请求链中共享数据(请求转发等)
Request
域对象的数据传递。
request
对象提供了一个getRequestDispatcher
方法,该方法返回一个RequestDispatcher
对象,调用这个对象的forward
方法可以实现请求转发,从而共享请求中的数据。
3.2、HttpSession域
Session
生命周期
在第一次调用
request.getSession()
方法时,服务器会检查是否已经有对应的session
,如果没有就在内存中创建一个session
并返回。销毁:
- 主动释放:调用
session.invalidate()
,可以立即销毁session
。- 超时释放:当一段时间内
session
没有被使用(默认为30分钟),则服务器会销毁该session
。- 意外销毁:服务器意外关闭时,没有到期的
session
也会跟着销毁。注意:服务器正常关闭,再启动,
Session
对象会进行钝化和活化操作。同时如果服务器钝化的时间在session
默认销毁时间之内,则活化后session
还是存在的。否则Session
不存在。 如果JavaBean
数据在session
钝化时,没有实现Serializable
则当Session
活化时,会消失。
- Session的作用范围
作用范围是一次会话。
- 在同一服务器上不同的
request
请求是会得到唯一的session
Session
生成时机:request
对象调用getSession
方法时生成,服务器会为该Session
对象生成一个唯一的ID
。
服务器端响应客户端请求时会在报文头中设置Set-Cookie
属性,该属性内容中有一个JSESSIONID
即是Session
对象的标识,返回后由浏览器进行处理。客户端再次发送请求时,浏览器会在报文头中自动追加Cookie
属性,该属性将JSESSIONID
传到服务器端。在服务器端用request.getSession
时会取得SessionId
对应的对象而不会重新生成Session
。
- 监听
Session
的利器HttpSessionListener
Session
创建事件发生在每次一个新的session
创建的时候,类似地Session
失效事件发生在每次一个Session
失效的时候。任何一个Session
被创建或者销毁时,都会通知SessionCounter
这个类。比如在统计网站在线人数的这个场景下,可以使用HttpSessionListenner
进行监听。
Session
何时创建
Session
并不是一打开网页就创建了session
对象。对于Servlet
的请求中,只有当Servlet
内部调用了如下代码,才会生成session
1 | HttpSession session = request.getSession(); |
如果写成如下,则不会创建session
1 | HttpSession session = request.getSession(false); |
加入我们访问的是jsp页面,因为Jsp页面内置了session
对象,封装了调用session
的代码,则一打开jsp页面会创建session
3.3、ServletContext域
ServletContext
的生命周期
当Web应用被加载进容器时创建代表整个web应用的
ServletContext
对象。当服务器关闭或Web应用被移除时,
ServletContext
对象跟着销毁。
- 作用范围
整个WEB应用
- 作用
- 在WEB应用中共享数据(在不同
Servlet
之间转发) - 读取资源文件
- 在WEB应用中共享数据(在不同
不同的
servlet
之间进行调整。
1 | this.getServletContext().getRequestDispatcher("/servlet1").forward(request,response); |
- 读取文件
1.Web应用的根目录
1 | InputStream stream = this.getServletContext().getResourceAsStream("conf.properties"); |
2.Src下面
1 | InputStream stream = MyServlet.class.getClassLoader().getResourceAsStream("conf.properties"); |
3.Src下某个包下面,则
1 | InputStream stream = MyServlet.class.getClassLoader().getResourceAsStream("com/haoeasy/conf.properties"); |
4.获取绝对路径
1 | MyServlet.class.getClassLoader().getResourceAsStream("com/haoeasy/conf.properties").getPath(); |