技术标签: servlet、listener和servlet 网络容器
一、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,但是执行顺序与其特性相关。
文章浏览阅读3.1k次。完成系统配置之后,选择进入配置Global Tool Configuration,配置JDK,Git,Gradle,Ant,Maven等工具。在每一个下面单击Add(新增)按钮,添加实例的名称和绝对地址。_jenkins 参数 全局
文章浏览阅读577次。/** * 自定义gridview,解决ListView中嵌套gridview显示不正常的问题(1行半) * @author chenxiang * */public class MyGridView extends GridView{ public MyGridView(Context context, AttributeSet attrs) { super(_listview 嵌套gridview 子项显示不正常
文章浏览阅读888次。引入:前段时间浅析了一些I.MX6U的寄存器,那么接下来肯定是下载实验,但是下载前首先要知道I.MX6U是如何启动的。问题一:I.MX6U 有哪几种启动方式?引导ROM支持以下引导设备:•NOR闪存•NAND闪存•OneNAND闪存•SD / MMC•串行(SPI)NOR闪存和EEPROM•QuadSPI(QSPI)闪存问题二:如何选择启动方式?BOOT 的处理过程是..._boot from qspi qspi 是什么
文章浏览阅读5.8k次,点赞10次,收藏23次。经历python3执行python脚本import cv2报错,发现原因是指定的python2.7目录下的cv2,后来为了在安装python3版本的opencv,安装了pip3,结果安装opencv报错,然后升级了pip3,然后pip的所有指令都不能用了。。。一直报错Traceback (most recent call last): File "/usr/bin/pip3", line 11, in <module> sys.exit(main()) File "/home_ubuntu pip3 invalid syntax
文章浏览阅读1k次,点赞2次,收藏2次。本文目录预备知识:socket服务端socket客户端socket.channel模式(针对客户端)用 socket.channel 解决问题①用 socket.channel 解决问题② 预备知识:TCP/IP:https://www.cnblogs.com/h2zZhou/p/10488670.htmlsocket简单理解——socket是在应用层和传输层之间的一个抽象层,它把TCP/IP层复杂的操作抽象为几个简单的接口供应用层调用已实现进程在网络中通信。网络上的两个_skynet socket
文章浏览阅读197次。网站降权不收录?原来是302重定向惹得祸小A建站已经3个月了,可是连首页也没收录,在做了百度抓取诊断后,才发现一直抓取失败。_网站被恶意302
文章浏览阅读6.7k次。先附上配置version: '3.5'services: hadoop1: image: hadoop:1.3 container_name: hadoop1 command: bash -c "/usr/sbin/sshd && /bin/bash" tty: true networks: mynetwork: ipv4_address: 172.20.1.1networks: mynetwork: _docker-compose bridge 指定ip
文章浏览阅读4.8k次。现在最火的版本控制软件是什么,当然是git。git大有取代svn之势,就像svn当前取代cvs一样。作为老牌代码托管网站sourceforge面临github的竞争,也不得不调整战略,在原先的基础上增加了git和Mercurial 等软件的支持,但是却没有github或者bitbucket那样提供fork和pull request功能。要知道对于一个开源作品来说fork可以方便的将源码备份到自_sourceforge clone
文章浏览阅读6k次,点赞2次,收藏13次。抖音-无水印视频解析保存,获取原视频的方法及过程分析。附上代码截图,很简单,主要是分析过程废了些时间。抖音视频自己保存的都带有抖音的logo和视频片尾,让一些做自媒体和搬运工的朋友感到不爽,想要搬运还有水印,于是网上出现好多视频无水印解析的网站,包括微信小程序和公众号都在做,引流也确实可以,但是大部分都是调用的其它网站提供的解析接口,往往一些还要付费,或者不稳定各种问题。,因为他们都不是从最原始的代码里进行的提取,调用别人的API也确实没什么意思,都是别人写好的东西,你也不能控制,我也看了一些网上发的如何_抖音获取原始视频的代码
文章浏览阅读2.6k次。MySQL使用DECIMAL类型去存储对精度要求比较高的数值,比如金额,也叫定点数,decimal在mysql内存是以字符串二进制存储的。声明语法是DECIMAL(M,D),占用字节 M+2 bytes。M是数字最大位数(精度precision),范围1-65;D是小数点右侧数字个数(标度scale),范围0-30,但不得超过M。..._decimal类型怎么整出了9x 9l
文章浏览阅读381次。前言从之前的学习我们发现,一直在blog应用中进行开发。本章开始新建另一个App来开发,介绍Django的身份认证模块,实现用户登录、注册、注销。一个简单的登录界面创建应用为了实现用户登录、退出、注册等功能,从而进行用户管理,创建一个新的应用。python manage.py startapp accounts然后我们就多了一个accounts目录,然后在/myblog/settings.py中对新应用进行配置。INSTALLED_APPS = [ ..., 'blog', 'a_django accounts/login
文章浏览阅读1.2k次。JavaScript对象创建模式Object构造函数模式用法:先创建空Object对象,再动态添加属性/方法 适用场景:起使时不确定对象内部数据 问题:语句太多 代码解析: var p = new Object() p = {} p.name = 'Tom' p.age = 12 p.setName = function (name) { this.na..._javascript对象的创建和用法