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中的过滤器,它主要负责拦截请求和放行。
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的使用就较为少见了。