Servlet、Filter、Listener是Javaweb开发中的三大组件,分别提供不同的功能。

1.Servlet

1.1概念

从广义上说,Servlet是运行在web服务器上的程序,主要用于处理客户端请求的动态资源(Servlet = Service + Applet)表示它是一个服务的小程序。

1.2创建

Servlet的创建需要实现一个Servlet的接口,我们也可以继承GenericServlet或者HttpServlet,通常来说我们是采用继承HttpServlet的方式来创建一个Servlet,具体可参考博主关于Servlet原理的文章。

1.3配置
<servlet>
  <servlet-name>Servlet名称</servlet-name>
  <servlet-class>Servlet的全路径类名</servlet-class>
</servlet>
<servlet-mapping>
  <servlet-name>Servlet名称</servlet-name>
  <url-pattern>请求路径</url-pattern>
</servlet-mapping>

3.0之后可以直接在Servlet类上面加注解配置。

1.4生命周期

第一次访问时初始化,然后再提供服务,运行Service方法,由于它是单例模式的,后面每次访问都不会再次初始化,当web应用销毁关闭时才关闭销毁。

2.Filter

2.1概念

Filter是Javaweb中的过滤器,它主要负责拦截请求和放行。

java常见的第三方组件有哪些_servlet

2.2创建

过滤器的创建可以实现Filter接口,或者继承GenericFilter或者HttpFilter类,一般来说都是直接实现Filter接口。比如下面过滤编码的Filter:

package cn.ara.servlet;

import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

public class CharSetFilter implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {

    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {

        //转换类型
        HttpServletRequest req = (HttpServletRequest) request;
        HttpServletResponse resp = (HttpServletResponse) response;

        //设置编码
        req.setCharacterEncoding("UTF-8");
        resp.setContentType("text/html;charset=UTF-8");
        resp.setCharacterEncoding("UTF-8");

        //放行
        chain.doFilter(req, resp);

    }

    @Override
    public void destroy() {

    }
}
2.3配置
<filter>
  <filter-name>CharSetFilter</filter-name>
  <filter-class>cn.ara.servlet.CharSetFilter</filter-class>
</filter>
<filter-mapping>
  <filter-name>CharSetFilter</filter-name>
  <url-pattern>/*</url-pattern>
</filter-mapping>
2.4生命周期

从web应用加载的时候就被创建初始化,直到web应用关闭销毁时销毁。

3.Listener

3.1概念

Listener就是Javaweb中的监听器,它是一个实现了某个特定监听器接口的Java类,这个java类用来监听另外一个java类的方法调用或者属性改变,当被监听的对象发生上述事件后,监听器的某个方法就会立即执行。其中包括如下概念:

  • 事件源:被监听的对象。
  • 事件:事件源一旦发生某种改变,事件就被触发。
  • 监听器:实现监听功能的类。
  • 绑定监听器:在某个事件上与监听器进行绑定,使其事件一旦发生监听器就会被触发。
3.2创建

监听器的创建方式有很多种,因为它的类确实太多了,但是我们实际会用的还是很少,所以博主不做赘述,直接举个例子吧,监听web应用当前被多少人访问的例子:

package cn.ara.servlet;

import javax.servlet.ServletContext;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;
//统计网站在线人数:就是统计session的个数,所以我们在此实现 HttpSessionListener
public class OnlineCountListener implements HttpSessionListener {

    //创建session的监听
    @Override
    public void sessionCreated(HttpSessionEvent se) {
        ServletContext servletContext = se.getSession().getServletContext();
        Integer onlineCounts = (Integer) servletContext.getAttribute("OnlineCounts");

        if (onlineCounts != null) {
            int i = onlineCounts.intValue();
            servletContext.setAttribute("OnlineCounts", i++);
        } else {
            servletContext.setAttribute("OnlineCounts", 1);
        }

    }

    //销毁session的监听
    @Override
    public void sessionDestroyed(HttpSessionEvent se) {
        ServletContext servletContext = se.getSession().getServletContext();
        Integer onlineCounts = (Integer) servletContext.getAttribute("OnlineCounts");

        if (onlineCounts != null) {
            int i = onlineCounts.intValue();
            servletContext.setAttribute("OnlineCounts", i--);
        }
    }
}
3.3配置
<!--配置监听器-->
<listener>
  <listener-class>cn.ara.servlet.OnlineCountListener</listener-class>
</listener>
<!--设置session自动销毁时间 1分钟销毁-->
<session-config>
  <session-timeout>1</session-timeout>
</session-config>
3.4生命周期

在web应用发布时被创建,直到web应用销毁时销毁。


总体来说,Servlet和Filter的使用比较频繁,但是Listener的使用就较为少见了。