ServletContext-作用1(重要)
(1)什么是ServletContext
ServletContext官方叫servlet上下文。服务器会为每一个工程创建一个对象,这个对象就是ServletContext对象。这个对象全局唯一,而且工程内部的所有servlet都共享这个对象。所以叫全局应用程序共享对象
- ServletContext是Servlet中自带一个对象
- ServletContext对象时在第一次访问Servlet时,自动创建
- 一个项目中只有一个ServletContext对象
Servlet1可以往ServletContext添加键值对数,所有的Servlet都可以取
1.2. 作用
-
是一个域对象
-
可以读取全局配置参数
-
可以搜索当前工程目录下面的资源文件
-
可以获取当前工程名字(了解)
1.2.1 servletContext是一个域对象
1.2.1.1 域对象介绍
域对象是服务器在内存上创建的存储空间,用于在不同动态资源(servlet)之间传递与共享数据。
1.2.1.2 域对象方法
(2) 作用1:ServletContext可以实现多个Servlet之间数据的共享
方法 | 作用 |
---|---|
setAttribute(name,value);name是String类型,value是Object类型; | 往域对象里面添加数据,添加时以key-value形式添加 |
getAttribute(name); | 根据指定的key读取域对象里面的数据 |
removeAttribute(name); | 根据指定的key从域对象里面删除数据 |
1.2.1.3 域对象功能代码
1.域对象存储数据AddDataServlet代码
src\com\wzx\Demo01SetServlet.java
@WebServlet("/set")
public class Demo01SetServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request,response);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//1:获取ServletContext
ServletContext context = super.getServletContext();
//2:添加数据 key-value 集合 Map
context.setAttribute("name","jack");
context.setAttribute("age",22);
System.out.println("setServlet");
}
}
2.获取域对象数据Demo02GetServlet代码
src\com\wzx\Demo02GetServlet.java
@WebServlet("/get")
public class Demo02GetServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request,response);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//1.获取servletContext
ServletContext context = getServletContext();
//2.根据键获取值
String name = (String) context.getAttribute("name");
Integer age = (Integer) context.getAttribute("age");
System.out.println(name);
System.out.println(age);
}
}
servletContext存储数据特点,
全局共享,里面的数据所有动态资源都可以写入和获取
服务器启动的时候创建,服务器关闭的时候销毁,因为这是全局应用程序对象,全局共享对象。
1.2.2 ServletContext可以读取web项目中文件的内容
src下的文件:
InputStream is=Demo3FileServlet.class.getClassLoader().getResourceAsStream("a.txt");
web目录下文件
InputStream is = getServletContext().getResourceAsStream("a.txt");
src\com\wzx\Demo03FileServlet.java
src\com\wzx\Demo03FileServlet.java
@WebServlet("/file")
public class Demo03FileServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request,response);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//1:java使用类加载器去读取
//InputStream inputStream = Demo03FileServlet.class.getClassLoader().getResourceAsStream("a.txt");
InputStream inputStream = getServletContext().getResourceAsStream("b.txt");
//2:将字节流转成字符流
BufferedReader br = new BufferedReader(new InputStreamReader(inputStream));
String line = br.readLine();
response.setCharacterEncoding("utf-8");
response.getWriter().println(line);
System.out.println(line);
}
}
1.2.3 可以读取全局配置参数(了解)
1.2.3.1 servletContext读取全局参数核心方法
getServletContext().getInitParameter(name);//根据指定的参数名获取参数值
getServletContext().getInitParameterNames();//获取所有参数名称列表
1.2.3.2 实现步骤:
- 在web.xml中配置全局参数
<!-- 全局配置参数,因为不属于任何一个servlet,但是所有的servlet都可以通过servletContext读取这个数据 -->
<context-param>
<param-name>param1</param-name>
<param-value>value1</param-value>
</context-param>
<context-param>
<param-name>param2</param-name>
<param-value>value2</param-value>
</context-param>
- 在动态资源servlet里面使用servletcontext读取全局参数代码
public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {
//使用servletContext读取全局配置参数数据
//核心方法
/*getServletContext().getInitParameter(name);//根据指定的参数名获取参数值
getServletContext().getInitParameterNames();//获取所有参数名称列表*/
//打印所有参数
//1.先获取所有全局配置参数名称
Enumeration<String> enumeration = getServletContext().getInitParameterNames();
//2.遍历迭代器
while(enumeration.hasMoreElements()){
//获取每个元素的参数名字
String parameName = enumeration.nextElement();
//根据参数名字获取参数值
String parameValue = getServletContext().getInitParameter(parameName);
//打印
System.out.println(parameName+"="+parameValue);
}
}
ServletContext实战 一个网站被多少用户登录访问
比如 三个人 通过LoginServlet登录成功,那必须让LoginServlet 对count值三次+1
在前面的登录案例里面修改
(1)初始化count值
src\com\wzx\web\LoginServlet.java
@Override
public void init() throws ServletException {
//Servlet创建出来,ServletContext也会创建出来
//1:获取ServletContext
ServletContext context = getServletContext();
//2:添加一个count变量,默认值为0
context.setAttribute("count",0);
}
(2)每次登录成功对count值+1
src\com\wzx\web\LoginServlet.java
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//1:获取参数
String username=request.getParameter("username");
String password=request.getParameter("password");
//2:处理参数
UserService userService = new UserService();
//2.1登录就是拿着账号,密码去数据库判断,存在就返回true,否则就返回false
boolean result = userService.login(username,password);
response.setCharacterEncoding("utf-8");
//2.2根返回结果提示用户
if(result){
//登录成功,对count值+1
//a.获取servletContext
ServletContext context = getServletContext();
//b.获取里面的count
Integer count= (Integer) context.getAttribute("count");
//c. count + 1
count += 1;
//d. 放回ServletContext
context.setAttribute("count",count);
//3:响应给浏览器
response.getWriter().println("登录成功,您是第"+count+"个登录");
}else{
response.getWriter().println("账号或者密码出错");
}
}