ServletContext接口概述
ServletContext接口实现类的对象是在web部署到服务器上之后启动的时候创建的, 是在web工程停止的时候销毁的
什么是ServletContext?
- ServletContext是一个接口, 它表示Servlet上下文对象
- 一个web工程中只能有一个ServletContext对象实例
- ServletContext对象是一个域对象
什么是域对象?
域对象 : 是可以像Map一样存储数据的对象
- 域指定是存取数据的操作范围
Map和域对象对比:
存数据 | 取数据 | 删除数据 | |
---|---|---|---|
Map | put() | get() | remove() |
域对象 | setAttribute() | getAttribute() | removeAttribute() |
- 上面的这几个方法是域对象中通用的方法, 我们的域对象中都有这几个方法, 方法名都是如上的几种形式
ServletContext类的作用(四个):
- 获取web.xml中配置的上下文参数: context-param
- 方法 : getInitParameter(String name)
- context-param是web.xml文件中的一个标签, 和Servlet标签是同级的
- context-param标签之下也是有两个子标签:
- param-name
- param-value
- context-param标签之下也是有两个子标签:
注意: 之前的时候我们讲过可以使用ServletConfig对象获取初始化参数, 也就是init-param标签中的键值对, 这个时候我们可以使用ServletContext对象获取上下文参数context-param
-
注意: 我们的上下文参数和初始化参数是不一样的, 获取的方式也是不同的
- 这里的获取方式不同指的是获取这两个参数的时候的调用者不同, 调用的方法当然也是不同的, 但是方法名是相同的, 都是getInitParameter()方法
测试:
- 由于我们之前没有测试使用ServletConfig接口实现类对象获取初始化参数的方法, 这里我们就和使用ServletContext接口实现类调用获取上下文参数的
先给出web.xml配置文件:
<?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_4_0.xsd"
version="4.0">
<servlet>
<servlet-name>demo</servlet-name>
<servlet-class>com.ffyc.demo.DemoServlet</servlet-class>
<init-param>
<param-name>username</param-name>
<param-value>miaomiao</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>demo</servlet-name>
<url-pattern>/demo</url-pattern>
</servlet-mapping>
<context-param>
<param-name>id</param-name>
<param-value>23</param-value>
</context-param>
</web-app>
然后给出Servlet代码:
package com.ffyc.demo;
import javax.servlet.ServletConfig;
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;
/**
* 我们来测试获取初始化参数和获取上下文参数的方法
*/
public class DemoServlet extends HttpServlet{
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
/*
===================== 获取初始化参数 ==============================
*/
//此时我们获取到ServletConfig对象
ServletConfig servletConfig = this.getServletConfig();
//使用ServletConfig对象调用getInitParameter()方法获取初始化参数
//注意: 我们要传入一个键, 我们是通过键获取值
String username = servletConfig.getInitParameter("username");
System.out.println(username);
/*
========================= 获取上下文参数 ============================
*/
//获取ServletContext对象
ServletContext servletContext = this.getServletContext();
//通过ServletContext对象获取上下文参数, 调用的方法也是getInitParameter()
String id = servletContext.getInitParameter("id");
System.out.println(id);
}
}
- 获取当前的工程访问路径, 也就是项目访问路径
- 方法 : getContextPath()
- 格式 : /项目访问路径
- 注意: 这里获取的是项目访问路径 ,就是我们在浏览器中访问当前项目中的资源的时候在URL中的项目访问路径
- 项目访问路径就是我们在IDEA中的Configurations中的Deployment中的Application context中配置的值
- 一般默认项目访问路径就是: 项目名_war_exploded, 但是我们一般都是会将项目访问路径修改为: 项目名
测试:
package com.ffyc.demo;
import javax.servlet.ServletConfig;
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;
/**
* 我们来测试获取初始化参数和获取上下文参数的方法
*/
public class DemoServlet extends HttpServlet{
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
/*
======================== 获取工程路径 ==========================
*/
//获取ServletContext接口实现类的对象
ServletContext servletContext1 = this.getServletContext();
//调用getContextPath()方法获取工程路径()
String contextPath = servletContext1.getContextPath();
System.out.println(contextPath);
}
}
- 获取工程部署之后的各文件在服务器硬盘上的绝对路径 --> 我们一般都是使用这个方法获取当前项目部署到服务器上之后的项目的绝对路径
- 方法 : getRealPath(String name);
- 使用这个方法的时候如果我们要获取项目部署的绝对路径我们就要传入一个"/"
- 这里我们之前就说过: 如果是服务器解析的时候"/"表示的就是http://ip:port/项目访问路径
- 所以我们传入一个"/“的时候其实就是传入了一个"http://ip:port/项目访问路径” , 这个项目访问路径就会映射到项目部署到服务器之后的绝对路径上 —> 我们就可以获得到服务器中部署的项目路径
- 这里我们之前就说过: 如果是服务器解析的时候"/"表示的就是http://ip:port/项目访问路径
- 使用这个方法的时候如果我们要获取项目部署的绝对路径我们就要传入一个"/"
- 注意: 我们这里获取的是项目部署到服务器上的位置, 而不是项目部署之前在IDEA中保存的位置
- 工程最终会部署到out文件夹中 —> 最终我们的web项目会被打成一个war包之后部署到tomcat服务器中
- 注意: 我们获取的项目部署之后的位置中项目的路径默认是:webback_war_exploded, 这里的部署之后的项目访问路径和在IDEA中的Configurations中配置的项目访问路径无关
- 方法 : getRealPath(String name);
测试:
package com.ffyc.demo;
import javax.servlet.ServletConfig;
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;
/**
* 我们来测试获取初始化参数和获取上下文参数的方法
*/
public class DemoServlet extends HttpServlet{
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
/*
======================= 获取当前项目部署到服务器上的位置 ================
*/
//获取ServletContext接口实现类的对象
ServletContext servletContext2 = this.getServletContext();
//调用getContextPath()方法获取工程路径()
String realPath = servletContext2.getRealPath("/");
System.out.println(realPath);
}
}
- 我获取到的项目部署之后的路径是: E:\javaProject\webback\out\artifacts\webback_war_exploded\
- 像Map一样存取数据
- setAttribute(String name, String value)
- getAttribute(String name)
- ServletContext作用是在整个web项目中
- ServletContext接口实现类对象是在web工程部署启动的时候创建, 在web工程停止的时候销毁