Servlet_Context
什么是ServletContext
概念:每个Web项目对应了一个上下文对象,上下文对象与项目(模块)是一对一的关系。
创建的时机:在Tomcat启动的时候,由Tomcat创建,我们可以在Servlet中去使用。
ServletContext是一个接口,由Tomcat实现它的类
主要作用:
-
读取全局的配置参数
-
读取web目录下的资源
-
得到web目录下资源的真实地址
得到上下文域的方法
ServletConfig接口中方法 | 描述 |
---|---|
ServletConetext getServeltContext(); | 继承于父类,可以直接使用这个方法得到上下文对象 |
ServletContext:读取全局的配置参数
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
version="3.1">
<context-param>
<param-name>username</param-name>
<param-value>wsl</param-value>
</context-param>
<context-param>
<param-name>age</param-name>
<param-value>18</param-value>
</context-param>
</web-app>
package com.itheima03;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.Enumeration;
@WebServlet("/demo01")
public class Demo01Servlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//获取上下文对象`
ServletContext application = getServletContext();
//读取全局参数值,username就是在web.xml文件中参数名
String username = application.getInitParameter("username");
System.out.println("姓名"+username);
//读取所有的信息
Enumeration<String> names = application.getInitParameterNames();
while(names.hasMoreElements()){//判断是否有下一个元素
//如果有下一个元素就获取
String s = names.nextElement();
String parameter = application.getInitParameter(s);
System.out.println("参数名:"+s+" 值:"+parameter);
}
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
}
}
效果图
小结
方法 | 功能 |
---|---|
String getInitParameter(String name) | 通过参数名获取全局的参数值 |
Enumeration getInitParameterNames() | 获取所有全局参数名 |
ServletContext:获取当前工程的资源
需求:
在WEB-INF目录下有一张图片,要显示出来
流程:
用户访问Servlet -> 通过输入流读取文件 -> 写到浏览器上显示
好处:可以控制用户的访问,没有盗链的风险
效果
package com.itheima.servlet;
import org.apache.commons.io.IOUtils;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.InputStream;
@WebServlet("/demo03")
public class Demo03Servlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//得到一个输出流
ServletOutputStream outputStream = response.getOutputStream();
//得到上下文对象
ServletContext application = getServletContext();
InputStream inputStream = application.getResourceAsStream("/WEB-INF/VCG211126173663.jpg");
//创建一个IOUtils
IOUtils.copy(inputStream,outputStream);
outputStream.close();
inputStream.close();
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
}
}
ServletContext:获取资源在服务器的真实地址
需求
读取web目录下资源,部署到服务器上真实地址,这个地址是变化的。
代码
package com.itheima.servlet;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
@WebServlet("/demo04")
public class Demo04Servlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
PrintWriter out = response.getWriter();
ServletContext application = getServletContext();
String path = application.getRealPath("/WEB-INF/VCG211126173663.jpg");
out.print("图片的真实路径是:"+path);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
}
}
效果
上下文域的操作方法
ServletContext方法 | 作用 |
---|---|
Object getAttribute(“键”) | 获取上下文域中值 |
void setAttribute(“键”, Object 值) | 添加或修改上下文域值 |
void removeAttribute(“键”) | 删除上下文域中指定的键和值 |
案例
得到当前是第几个登录的用户
分析
- 上下文域的操作方法
- 得到第几个登录用户的分析
代码
package com.itheima.servlet;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
@WebServlet("/login")
public class LoginServlet extends HttpServlet {
//重写舒适化方法
@Override
public void init() throws ServletException {
getServletContext().setAttribute("sum",0);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("utf-8");
ServletContext application = getServletContext();
response.setContentType("text/html;charset=utf-8");
PrintWriter out = response.getWriter();
//得到用户登录的信息
String username = request.getParameter("username");
String password = request.getParameter("password");
System.out.println(username+password);
//判断用户名和密码是否正确
if(username.equals("张三")&&password.equals("123")){
//如果登录成功重新设置上下文域中的内容
int sum = (int)application.getAttribute("sum");
application.setAttribute("sum",++sum);
//再告诉用户是第几个登录的
out.print("您是第:"+ sum +"个登录");
}else {
out.print("登录失败");
}
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
}
}