首先来了解 ServletContext 这个全局作用域对象。它相当于整个 Web 应用程序的“总管”,所有 Servlet 共享同一个实例。观察下方示意图,可以快速建立直观认知——

编程实现非常简洁:只需调用 this.getServletContext() 即可获取该对象。获取后能做什么?可以获取服务器上的真实路径、上下文路径,还能存取全局属性数据,功能全面。以下代码展示了这些常见操作:
import ja vax.servlet.ServletConfig;
import ja vax.servlet.ServletContext;
import ja vax.servlet.ServletException;
import ja vax.servlet.annotation.WebServlet;
import ja vax.servlet.http.HttpServlet;
import ja vax.servlet.http.HttpServletRequest;
import ja vax.servlet.http.HttpServletResponse;
import ja vax.servlet.http.HttpSession;
import ja va.io.IOException;
public class HelloServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
ServletConfig config = this.getServletConfig(); // 创建ServletConfig对象
System.out.println(config.getInitParameter("className"));
System.out.println(config.getInitParameter("url"));
ServletContext servletContext = this.getServletContext();
// servletContext.getAttribute() // 通过name取属性值
// servletContext.setAttribute(); // 添加键值对
// servletContext.removeAttribute(); // 删除属性
// servletContext.getAttributeNames(); // 获取所有属性名称
System.out.println("servletContext.getRealPath(\"/WEB-INF\") = " + servletContext.getRealPath("/WEB-INF")); // 绝对路径
System.out.println("servletContext.getContextPath() = " + servletContext.getContextPath()); // 工程路径(root下为空)
// 多种方式获取ServletContext
// this.getServletConfig().getServletContext()
// this.getServletContext()
// req.getServletContext()
// req.getSession().getServletContext()
}
}
过滤器:资源访问的必经关卡
过滤器会在任何资源被请求之前执行,非常适合进行全局性的前置处理。常见应用场景如下:
- 数据库加载
- 权限验证
- 数据检查
- 数据加工
- 数据缓存
来看一下基本实现方式:过滤器需要实现 Filter 接口,并在 doFilter 方法中编写处理逻辑,通过调用 filterChain.doFilter() 放行请求。例如下方代码,仅当请求的 URL 以 .jpg 结尾时才允许继续访问:
import ja vax.servlet.*;
import ja vax.servlet.annotation.WebFilter;
import ja vax.servlet.http.HttpServlet;
import ja vax.servlet.http.HttpServletRequest;
import ja vax.servlet.http.HttpServletResponse;
import ja va.io.IOException;
//@WebFilter("*")
public class AFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest) servletRequest;
HttpServletResponse response = (HttpServletResponse) servletResponse;
if (request.getRequestURL().toString().endsWith(".jpg")) {
// 判断条件满足,放行
filterChain.doFilter(servletRequest, servletResponse);
}
}
@Override
public void destroy() {}
}
监听器:实时监测 Session 的创建与属性变化
监听器的核心功能是监控 Session 对象的创建、销毁以及属性的添加、移除和替换操作。实现起来也很直观:实现相应接口,重写方法即可。以下示例实现了 HttpSessionIdListener、HttpSessionListener 和 HttpSessionAttributeListener 接口,可以将 Session 中的各类事件信息输出到控制台:
@WebListener
public class SessionListener implements HttpSessionIdListener, HttpSessionListener, HttpSessionAttributeListener {
public void sessionIdChanged(HttpSessionEvent var1, String var2) {
System.out.println("sessionIdChanged..");
}
@Override
public void sessionCreated(HttpSessionEvent httpSessionEvent) {
System.out.println("sessionCreated..");
}
@Override
public void sessionDestroyed(HttpSessionEvent httpSessionEvent) {
System.out.println("sessionDestroyed..");
}
@Override
public void attributeAdded(HttpSessionBindingEvent httpSessionBindingEvent) {
System.out.println("attributeAdded..");
}
@Override
public void attributeRemoved(HttpSessionBindingEvent httpSessionBindingEvent) {
System.out.println("attributeRemoved..");
}
@Override
public void attributeReplaced(HttpSessionBindingEvent httpSessionBindingEvent) {
System.out.println("attributeReplaced..");
}
}