Servlet 过滤器和监听器是 Java Web 应用程序中常见的两种组件,它们提供了各种扩展 Web 应用程序功能的方式。
总的来说,过滤器和监听器都可以通过 Java Web 应用程序的配置文件或注解进行使用,方便灵活,并可以很好地实现框架与业务逻辑的分离,提高代码可维护性和扩展性。
下面是一个基本的 Servlet 过滤器示例,它拦截所有以 *.do 结尾的请求,输出一些日志信息,并记录请求执行时间:
public class LogFilter implements Filter {
public void init(FilterConfig config) throws ServletException {
// 初始化方法,在应用程序启动时调用
}
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
long startTime = System.currentTimeMillis();
HttpServletRequest req = (HttpServletRequest) request;
HttpServletResponse res = (HttpServletResponse) response;
String uri = req.getRequestURI();
if (uri.endsWith(".do")) { // 拦截以 .do 结尾的请求
System.out.println("LogFilter: start handling request " + uri);
}
chain.doFilter(request, response); // 调用下一个 filter 或 servlet/jsp 处理请求
if (uri.endsWith(".do")) {
System.out.println("LogFilter: end handling request " + uri +
", execution time: " + (System.currentTimeMillis() - startTime) + "ms");
}
}
public void destroy() {
// 销毁方法,在应用程序停止时调用
}
}
在 web.xml 中配置 LogFilter:
<filter>
<filter-name>logFilter</filter-name>
<filter-class>com.example.LogFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>logFilter</filter-name>
<url-pattern>/*.do</url-pattern>
</filter-mapping>
这个过滤器会对所有以 .do 结尾的请求进行拦截和处理,并输出一些日志信息和请求执行时间。这个示例演示了过滤器的基本使用方法,开发者还可以根据具体需求实现不同的功能来增强应用程序的性能、安全性等特性。
以下是一个使用ServletContextListener和ServletRequestListener实现的简单Web应用程序示例,它跟踪并记录用户访问应用程序的次数:
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.ServletRequestEvent;
import javax.servlet.ServletRequestListener;
import javax.servlet.annotation.WebListener;
@WebListener
public class VisitorCounterListener implements ServletContextListener, ServletRequestListener {
private int count; // 用户访问计数器
public void contextInitialized(ServletContextEvent event) {
count = 0; // 将计数器设置为0
// 将计数器保存在ServletContext属性中
event.getServletContext().setAttribute("visitorCount", count);
}
public void requestInitialized(ServletRequestEvent event) {
count++; // 每当有请求进来,计数器加1
// 将增加后的计数器再次保存在ServletContext属性中
event.getServletContext().setAttribute("visitorCount", count);
}
// 空实现其他方法(不能省略)
public void contextDestroyed(ServletContextEvent event) {}
public void requestDestroyed(ServletRequestEvent event) {}
}
上面的代码实现了ServletContextListener和ServletRequestListener接口,并用于在应用程序范围内跟踪用户访问计数器。在Servlet初始化期间,将初始计数器值设置为0,并在每个ServletRequest初始化时将其递增。最终,将当前计数器值存储在ServletContext属性"visitorCount"中,以供应用程序中的其他部分检索。
要使用此监听器,请将以下代码添加到web.xml文件中:
<listener>
<listener-class>com.example.VisitorCounterListener</listener-class>
</listener>
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。