1.servlet是什么 servlet的执行原理是什么?
Servlet是一个用于扩展服务器端功能的服务器端组件技术 运行在服务器端,所以调用执行是由服务器负责 在web.xml中需要进行配置,就是将servlet和一个请求地址建立对应关系,当浏览器对地址 发起请求时,服务器则按照规则调用serlvet类中的方法 服务器端的组件技术 直接或者间接的实现Servlet接口 用于扩展服务器端功能,可以实现动态网页的开发。
2. servlet的生命周期是什么
1. init()方法
在Servlet的生命周期中,仅执行一次init()方法,它是在服务器装入Servlet时执行的,可以配置服务器,以在启动服务器或客户机首次访问Servlet时装入Servlet。无论有多少客户机访问Servlet,都不会重复执行init();
2. service()方法
它是Servlet的核心,每当一个客户请求一个HttpServlet对象,该对象的Service()方法就要调用,而且传递给这个方法一个“请求”(ServletRequest)对象和一个“响应”(ServletResponse)对象作为参数。在HttpServlet中已存在Service()方法。默认的服务功能是调用与HTTP请求的方法相应的do功能。
3. destroy()方法
仅执行一次,在服务器端停止且卸载Servlet时执行该方法,有点类似于C++的delete方法。一个Servlet在运行service()方法时可能会产生其他的线程,因此需要确认在调用destroy()方法时,这些线程已经终止或完成。
(1)加载和实例化:默认情况下,当Servlet第一次被访问时,由容器创建Servlet对象;
(2)初始化:在Servlet实例化之后,容器将调用Servlet的init()方法初始化这个对象,完成一些如加载配置文件、创建连接等初始化的工作,该方法只调用一次;
(3)请求处理:每次请求Servlet时,Servlet容器都会调用Servlet的Servlet()方法对请求进行处理;
(4)服务终止:当需要释放内存或者容器关闭时,容器就会调用Servlet实例的destroy()方法完成资源的释放。在destroy()方法调用之后,容器会释放这个Servlet实例,该实例随后会被Java垃圾收集器所回收。
3.servlet是线程安全的吗?如果不是,应该怎么处理
首先,默认的servlet是非线程安全的,servlet是单例模式,只产生一个实例,根据项目中web.xml实例,这个实例是web容器产生的,比如Tomcat,JBOSS,weblogic等。
就是说多个客户请求产生多个线程,一个线程对应一个客户,但是用的servlet对象却是一个。既然用的对象是一个,那么实例变量就是共享数据了,说到共享数据还不同步,必然是非线程安全的。
servlet安全问题处理方法
1.使用方法内局部变量
是因为各线程有自己堆栈空间,存储局部变量
方法参数传入,多采用传值(volue copy)传入方法内
2.对操作共享资源的语句,方法,对象, 使用同步
比如写入磁盘文件,采用同步锁,但建议尽量用同步代码块,不要用同步方法
3.使用同步的集合类
使用Vector代替ArrayList
使用Hashtable代替HashMap。
4.不要在 Servlet中再创建自己的线程来完成某个功能。