1. ServletContext对象
1.1. ServletContext对象概述
ServletContext对象代表当前web应用。当服务器启动时,服务器在启动时会依次加载web应用,每一个web应用加载完成后都会创建一个ServletContext对象唯一代表该web应用,这个对象一直存活,直到web应用移除出容器或服务器关闭时,随着应用销毁,ServletContext对象跟着销毁。
1.2. 获取ServletContext对象
在ServletConfig对象身上提供了getServletContext()方法可以用来获取ServletContext对象。
而在GenericServlet中提供了便捷的getServletContext(),我们编写的servlet继承自GenericServlet,所以可以直接调用此方法,便捷的获取ServletContext。
1.3. ServletContext对象读取web应用初始化参数
我们可以在web.xml中利用<context-param>标签为整个web应用配置初始化信息
<context-param>
<param-name>encode</param-name>
<param-value>utf-8</param-value>
</context-param>
可以利用ServletContext对象的如下方法获取初始化信息:
ServletContext.getInitParameter();
ServletContext.getInitParameterNames();
之前我们在学习Servlet时,知道Servlet的web.xml配置中可以配置初始化参数,但是这种初始化参数只能在该Servlet内部获取。而为整个web应用配置的初始化参数,通过ServletContext可在整个web应用中使用。
一般来说,整个站点的编码应该是一致的,所以我们可以修改之前的代码,将配给servlet的编码集改为整个站点配置,通过ServletContext获取。
1.3.1. ServletContext对象作为域对象使用
域:一个对象具有了可以被看见的范围,利用这个对象身上的Map,在这个范围内共享数据,这样的对象叫做域对象
javaweb开发中一共有4大域对象
ServletContext域:
作用范围:
整个web应用
生命周期:
当服务器启动web应用加载后立即创建代表这个web应用的ServletContext对象,一直驻留在内存中,唯一的代表这个web应用,直到服务器关闭或web应用被移除出容器时,随着web应用的销毁,ServletContext对象销毁
操作域的方法:
setAttribute(String name,Object obj);//向域中设置数据
Object getAttribute(String name);//从域中获取数据
removeAttribute(String name);//从域中移除数据
1.4. ServletContext对象读取web资源
1.4.1. 路径难题
在web环境中读取资源时,如果写的是相对路径,则在tomcat/bin目录下寻找资源。如果写的是绝对路径,则在tomcat所在目录的根目录下寻找资源。如果写的是盘符开始的绝对路径可以正确找到资源,但是一旦改变了发布环境路径很可能是错的。我们发现无论怎么写路径都有问题。
1.4.2. ServletContext读取资源
面对路径难题,ServletContext为我们提供管理解决方法。
servletContext.getRealPath("xxxx");--这个方法会在传入的路径前拼接当前web应用的硬盘路径,从而拼接出资源的硬盘路径,从而可以找到资源。
这种方式没有将web应用的硬盘路径写死,所以即使换了一个发布环境,路径也是正确的
1.4.3. 类加载器读取资源
如果当前程序中没有ServletContext可以用,此时可以拜托类加载器帮我们加载资源:
类加载器可以加载.class文件,同样也可以加载其他类型的资源文件
在ClassLoader上提供了getResource("相对于类加载目录的路径")可以加载资源,但是要求这个路径给一个相对于类加载器加载类的目录的路径(WEB-INF/classes)