一、 ServletConfig 对象
作用 : 封装 Servlet 初始化参数
1. 可以在 web.xml 文件中 Servlet 元素下 为Servlet配置初始化参数
<init-param>
<param-name>name</param-name>
<param-value>aaaa</param-value>
</init-param>
2. web 容器在初始化Servlet时,会将初始化参数封装到一个 ServletConfig 对象中,传给init方法
3. 我们在Servlet 中覆写 init方法,就可以获得ServletConfig
4. 父类 GenericServlet 中定义了一个成员变量用于记住此对象,并提供了 getServletConfig 方法
我们可以直接调用此方法 获得 config 对象
5. 再调用 getInitParameter(name) 方法获得想要配置项
// 指定编码
// 获得ServletConfig 对象
ServletConfig config = getServletConfig();
String encoding = config.getInitParameter("encoding");
System.out.println("encoding=" + encoding);
二、 ServletContext 对象
1. ServletContext对象代表整个web应用
2. ServletContext对象是一个域对象(可以存储数据的对象)
ServletContext对象的内部维护了一个map集合, key是String类型 value是Object类型
class ServletContext {
private Map<String, Object> map ;
}
3. ServletContext 作为域对象, 多个Servlet 可以共享数据
Servlet6
// 1. 获得ServletContext 对象
ServletContext context = getServletContext();
// 2. 存入域
context.setAttribute(“name”, “zhangsan”);
Servlet7
// 获得 context 域, getAttribute
String name = (String) getServletContext().getAttribute("name");
4.获取web应用的初始化参数
getContext().getInitParameter(“name”);
5. 统计一个web应用的访问量
在 context 域中维护一个count变量
访问Servlet时,取出变量加1
6. 实现请求转发
实现请求转发需要用到转发对象 RequestDispatcher
有一个 forward 方法能转发请求
7. 如何读取工程中的文件
7.1. 读取web工程下的资源文件
// 获得绝对路径
String realPath = ServletContext.getRealPath(相对web应用的路径);
注意URL url = ServletContext.getResource(); web的url
// 获得与文件关联的流
InputStream in=
ServletContext.getResourceAsStream(“WEB-INF/classes/config.properties”;
7.2 读取java工程下的文件
// 不能相对虚拟机目录不能用绝对路径
// 只能类加载的方式读
// 获得 流
ClassLoader classLoader = Demo.class.getClassLoader();
InputStream in = classLoader.getResourceAsStream("a.txt");
// 获得绝对路径
URL url = Demo.class.getClassLoader().getResource("a.txt");
String path = url.getPath();
类加载方式缺点
1)不能读取类路径以外文件
2) 由于需要加载到内存,不能读大文件
web工程中如果用类加载的方式读
类加载实际上读取的是内存中加载的文件,此时将读不到硬盘上资源文件的修改
解决办法Demo.class.getClassLoader().getResource("a.txt").getPath()
通过绝对路径去读硬盘上的文件 避开内存的文件
三、 Servlet缓存
HttpServlet 的 Service方法中的代码
// 调用方法
long lastModified = getLastModified(req);
// 如果为 -1 ,就直接放行,给最新的
if (lastModified == -1) {
doGet(req, resp);
}
// 方法返回不是-1
else {
// 读取IE发送的头If-Modified-Since
long ifModifiedSince = req.getDateHeader(HEADER_IFMODSINCE);
// 拿着客户端的时间头和方法的返回值比较
if (ifModifiedSince < (lastModified / 1000 * 1000)) {
// If the servlet mod time is later, call doGet()
// Round down to the nearest second for a proper compare
// A ifModifiedSince of -1 will always be less
// 方法的返回值大于ie发送过来的时间头
// 重新向浏览器发送了一个时间头
maybeSetLastModified(resp, lastModified);
// 放行, 发送页面
doGet(req, resp);
} else {
// 方法的返回值没有大于ie发送过来的时间头
// 发送 304 状态码,让用户去读缓存
resp.setStatus(HttpServletResponse.SC_NOT_MODIFIED);
}
}