package com.demo.h_servletcontext;
import java.io.IOException;
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;
/**
ServletContext 对象:叫做 Servlet 上下文对象,表示一个当前的 web 应用环境。
ServletConfig 与 ServletContext 的区别:
ServletConfig 对象用于加载一个 Servlet 的初始化参数,也就是说一个 Servlet 对象对应一个
ServletConfig 对象;如果一个 web 应用有多个 Servlet 对象,那么就会有多个 ServletConfig 对象;
ServletContext 对象用于描述一个 web 应用环境,一个 web 应用对应一个 ServletContext 对象,
也就是说一个 web 应用中不管有多少个 Servlet 对象,ServletContext 对象有且只有一个;
而且如果一个 web 应用中有多个 Servlet 对象,那么所有的 Servlet 对象都共用一个 ServletContext 对象;
所以 ServletContext 对象也叫作 域对象,可以实现在多个 Servlet 中共享数据。
ServletContext 的创建和得到
创建时机:tomcat 服务器在加载 web 应用的时候创建 ServletContext 对象;
得到时机:通过 ServletConfig 对象得到 ServletContext 对象(只有这一个途径获取 ServletContext 对象);
核心 API:
getContextPath():获取当前 web 应用的路径
request.getContextPath():作用和 servletContext.getContextPath()一样,也是获取 web 应用路径
getInitParameter(String name):得到 web 应用的初始化参数(根据参数名获取参数值)
getInitParameterNames():得到 web 应用的初始化参数的集合
setAttribute(String name, Object object):将数据存入域对象
getAttribute(String name):从域对象中获取数据
removeAttribute(String name):将数据从域对象中移除
getRequestDispatcher(String path).forward(request, response):转发
request.getRequestDispatcher(String path).forward(request, response):等价于上面代码,都是转发
getRealPath(String path):得到 web 应用的资源文件
getResourceAsStream(String path)
*/
@SuppressWarnings("serial")
@WebServlet("/ContextDemo1")
public class ContextDemo1 extends HttpServlet {
/**
* 获取当前 web 应用的路径
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// 获取 ServletContext 对象
// ServletContext context = this.getServletConfig().getServletContext();
// getServletContext()方法中的代码为:return getServletConfig().getServletContext();
ServletContext context = this.getServletContext();
/*
* 获取当前 web 应用的路径 (/02_Servlet)
* web 应用路径:就是部署到 tomcat 服务器上运行的 web 应用的名称(即项目名称);
*/
String contextPath = context.getContextPath();
System.out.println("contextPath:" + contextPath);
/*
* 获取当前 web 应用的路径 (/02_Servlet)
* 等价于上面的代码,作用和 context.getContextPath() 一样
*/
String contextPath2 = request.getContextPath();
System.out.println("contextPath2:" + contextPath2);
/*
* 案例:用于请求重定向
*/
// response.sendRedirect("/02_Servlet/index.html");
response.sendRedirect(contextPath + "/index.html");
}
}