一、servlet

1、什么是servlet

Java Servlet 是运行在 Web 服务器或应用服务器上的程序,它是作为来自 Web 浏览器或其他 HTTP 客户端的请求和 HTTP 服务器上的数据库或应用程序之间的中间层。

2、servlet与tomcat

Tomcat 是Web应用服务器,是一个Servlet/JSP容器Tomcat 作为Servlet容器,将http请求文本接收并解析,然后封装成HttpServletRequest类型的request对象,传递给servlet;同时会将响应的信息封装为HttpServletResponse类型的response对象,然后将response交给tomcat,tomcat就会将其变成响应文本的格式发送给浏览器。

3、servlet编程使用

创建一个servlet,继承HttpServlet类,复写doGet和doPost方法,也可以复写init方法,增加初始化值设定。

package com.xiaomi.mifi.scf.api.servlet;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

public class LoginServlet extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.sendRedirect("/");
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        super.doPost(req, resp);
    }

    @Override
    public void destroy() {
        System.out.println("destory");
        super.destroy();
    }

    @Override
    public void init() throws ServletException {
        System.out.println("init value");
        super.init();
    }
}

在web.xml中配置servlet的使用:

<filter>
    <filter-name>loginServlet</filter-name>
    <filter-class>com.xiaomi.mifi.scf.api.core.LoggingFilter</filter-class>
</filter>
<filter-mapping>
    <filter-name>loginServlet</filter-name>
    <url-pattern>/api/*</url-pattern>
</filter-mapping>

3、servlet的生命周期

1)服务器启动时(web.xml中配置load-on-startup=1,默认为0)或者第一次请求该servlet时,就会初始化一个Servlet对象,也就是会执行初始化方法init(ServletConfig conf)。

2)servlet对象去处理所有客户端请求,在service(ServletRequest req,ServletResponse res)方法中执行

3)服务器关闭时,销毁这个servlet对象,执行destroy()方法。

4)由JVM进行垃圾回收。

4、servlet的单例多线程

servlet默认采用是单实例多线程处理多个请求的。单实例能减少servlet对象的生成和销毁开销,具有很好的执行效率,但是servlet是线程不安全的,实例变量可能被多个线程同时使用,但获取到不同的对象关系。

二、filter

1、filter简介

filter也称之为过滤器,是对Servlet技术的一个强补充,其主要功能是在HttpServletRequest到达 Servlet 之前,拦截客户的HttpServletRequest ,根据需要检查HttpServletRequest,也可以修改HttpServletRequest 头和数据;在HttpServletResponse到达客户端之前,拦截HttpServletResponse ,根据需要检查HttpServletResponse,也可以修改HttpServletResponse头和数据。

2、filter的实现

创建一个filter,实现Filter接口,复写init、doFilter和destory方法。


import javax.servlet.*;
import java.io.IOException;

/**
 * Created by Wei Chen on 11:14 2018/6/26.
 */
public class LoginFilter implements Filter {
    
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        System.out.println("init value");
    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        System.out.println("start to filter request and response");
        filterChain.doFilter(servletRequest, servletResponse);
    }

    @Override
    public void destroy() {
        System.out.println("destroy filter");
    }
}

在web.xml中配置filter

    <filter>
        <filter-name>loginFilter</filter-name>
        <filter-class>com.xiaomi.mifi.scf.api.filter.LoginFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>loginFilter</filter-name>
        <url-pattern>/api/*</url-pattern>
    </filter-mapping>

3、filter的生命周期

与servlet一样,Filter的创建和销毁也由web容器负责。 web 应用程序启动时,web 服务器将创建Filter 的实例对象,并调用其init方法,读取web.xml配置,完成对象的初始化功能,从而为后续的用户请求作好拦截的准备工作(filter对象只会创建一次,init方法也只会执行一次)。开发人员通过init方法的参数,可获得代表当前filter配置信息的FilterConfig对象。

Filter对象创建后会驻留在内存,当web应用移除或服务器停止时才销毁。在Web容器卸载 Filter 对象之前被调用。该方法在Filter的生命周期中仅执行一次。在这个方法中,可以释放过滤器使用的资源。

4、filter链

当多个filter同时存在的时候,组成了filter链。web服务器根据Filter在web.xml文件中的注册顺序,决定先调用哪个Filter。当第一个Filter的doFilter方法被调用时,web服务器会创建一个代表Filter链的FilterChain对象传递给该方法,通过判断FilterChain中是否还有filter决定后面是否还调用filter。

三、Listener

1、监听器用于监听web应用中某些对象、信息的创建、销毁、增加,修改,删除等动作的发生,然后作出相应的响应处理。根据监听对象,java web中Listener分为三大类:

ServletContextListener:监控servletContext的创建、销毁等。

HttpSessionListener:用来监控session的创建,销毁等

ServletRequestListener:用于监控servlet上下文request

ServletRequestAttributeListener:用来监控request中的attribute的操作


import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;

/**
 * Created by Wei Chen on 11:30 2018/6/26.
 */
public class LoginListener implements ServletContextListener {

    @Override
    public void contextInitialized(ServletContextEvent servletContextEvent) {
        System.out.println("context initialized");
    }

    @Override
    public void contextDestroyed(ServletContextEvent servletContextEvent) {
        System.out.println("context destroy");
    }
}

web.xml中配置监听器

<listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>/

2、生命周期

listener的生命周期从web容器启动,到web容器销毁。

3、listener、filter和servlet的顺序

启动的顺序为listener->Filter->servlet,但是执行顺序与其特性相关。

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐