java web请求三大器——listener、filter、servlet
一、servlet1、什么是servletJava Servlet 是运行在 Web 服务器或应用服务器上的程序,它是作为来自 Web 浏览器或其他 HTTP 客户端的请求和 HTTP 服务器上的数据库或应用程序之间的中间层。2、servlet与tomcatTomcat 是Web应用服务器,是一个Servlet/JSP容器.Tomcat 作为Servlet容器,将http请求文本...
一、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,但是执行顺序与其特性相关。
更多推荐
所有评论(0)