欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Javaweb三大组件:Servlet、Filter和Listener

程序员文章站 2022-05-23 08:37:22
...

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中的过滤器,它主要负责拦截请求和放行。
Javaweb三大组件:Servlet、Filter和Listener

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的使用就较为少见了。