通过前面知识点的学习,我们对于请求的处理已经可以说比较灵活了,但是还不够。我们再介绍两个重要的对象 ServletContext 对象和 ServletConfig 对象

ServletContext 对象:

问题:Request 解决了一次请求内的数据共享问题,session 解决了用户不同请求的数据共享问题,那么不同的用户的数据共享该怎么办呢?

解决:使用 ServletContext 对象

作用:解决了不同用户的数据共享问题原理:ServletContext 对象由服务器进行创建,一个项目只有一个对 象。不管在项目的任意位置进行获取得到的都是同一个对象,那么不同用户发起的请求获取到的也就是同一个对象了,该对象由用户共同拥有。

特点:服务器进行创建用户共享一个项目只有一个

生命周期:服务器启动到服务器关闭

作用域:项目内

使用:

1.获取 ServletContext 对象

2.使用作用域进行共享数据流转

3.获取 web.xml 中的全局配置

4.获取 webroot 下项目资源流对象

5.获取 webroot 下资源绝对路径

TestServlectContextA:


import java.io.File;
import java.io.IOException;
import java.io.InputStream;

import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* ServletContext对象:
* 作用:
* 解决了不同用户之间的数据共享问题
* 使用:
* 创建ServletContext对象
* ServletContext sc1 = this.getServletContext();
ServletContext sc2 =this.getServletConfig().getServletContext();
ServletContext sc3=req.getSession().getServletContext();
存储用户共享数据
sc.setAttribute(String name,Object value);
获取用户共享数据
sc.getAttribute(String name);
删除共享数据
sc.removeAttribute(String name);
获取web.xml中的全局配置属性,作用:将部分动作和源文件进行解耦,我们只需要在xml配置文件中进行相关配置就会改变代码的执行效果。
sc.getInitParameter(String name);注意返回的是String类型数据
获取webRoot下的资源流对象
sc.getResourceAsStream(String path);
注意:
path为相对路径,写从webRoot开始查找资源的路径即可。
获取webRoot下的资源绝对路径
sc.getRealPath(String path);
注意:
path为相对路径,写从webRoot开始查找资源的路径即可。
* 特点:
* 服务器创建
* 所有用户共享
* 生命周期:
* 服务器开启到服务器关闭
* @author MyPC
*/
public class TestServlectContextA extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
//设置请求编码格式
req.setCharacterEncoding("utf-8");
//设置响应编码格式
resp.setContentType("text/html;charset=utf-8");
//获取请求信息
//处理请求信息
String str="我是用户共享数据";
//获取ServletContext对象
ServletContext sc1 = this.getServletContext();
ServletContext sc2 =this.getServletConfig().getServletContext();
ServletContext sc3=req.getSession().getServletContext();
System.out.println(sc1==sc2);
System.out.println(sc2==sc3);
//存储用户共享数据到ServletContext中
sc1.setAttribute("str", str);
//获取web.xml中的全局配置属性
String f=sc1.getInitParameter("flag");
if("false".equals(f)){
System.out.println("TestServlectContextA.service(关闭***资源)");
}else{
System.out.println("TestServlectContextA.service(打开***资源)");
}
//获取webRoot下资源的流对象
//File f2=new File("D:\\apache-tomcat-7.0.56\\webapps\\sc\\image");
InputStream resourceAsStream = sc1.getResourceAsStream("image/s.png");
//获取WebRoot下资源的绝对路径
String path=sc1.getRealPath("image/s.png");
System.out.println(path);
//响应处理结果
//直接响应
resp.getWriter().write("数据已经在ServletContext中存储完毕");
//请求转发
//重定向
}
}

TestServletContextB:

import java.io.IOException;

import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class TestServletContextB extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
//设置请求编码格式
req.setCharacterEncoding("utf-8");
//设置响应编码格式
resp.setContentType("text/html;charset=utf-8");
//获取请求信息
//获取ServletContext对象
ServletContext sc = this.getServletContext();
//获取共享数据
String s=(String) sc.getAttribute("str");
//处理请求信息
System.out.println("TestServletContextB.service()"+s);
//响应处理结果
//直接响应
//请求转发
//重定向
}
}



案例:网页浏览器次数统计

ServletConfig 对象:

问题:使用 ServletContext 对象可以获取 web.xml 中的全局配置文件,在 web.xml 中每个 Servlet 也可以进行单独的配置,那么该怎么获取配置信息呢?

解决:使用 ServletConfig对象

作用:ServletConfig 对象是 Servlet 的专属配置对象,每个 Servlet 都单独拥有一个 ServletConfig 对象,用来获取 web.xml 中的配置信息。

使用:

1.获取 ServletConfig 对象

2.获取 web.xml 中 servlet 的配置信息


import java.io.IOException;

import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class TestServletConfig extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
//获取ServletConfig对象
ServletConfig sg = this.getServletConfig();
//设置请求编码格式
req.setCharacterEncoding(sg.getInitParameter("code"));
//设置响应编码格式
resp.setContentType("text/html;charset=utf-8");
//获取请求信息
//获取web.xml中的属性配置
String flag = sg.getInitParameter("flag");
System.out.println(flag);
//获取用户请求信息
String uname=req.getParameter("uname");
//处理请求信息
System.out.println(uname);
//响应处理结果
}
}