1.什么是Servlet?
可以把它理解为一个小程序,该程序运行在服务器端,用来处理客户端发送过来的请求。
例如:
1.获取请求数据:登录的时候,Servlet就需要获取到用户输入的用户名和密码;
2.处理请求:Servlet获取到用户密码后,就需要进行相应的处理
3.响应请求:对于登录来说,Servlet需要给浏览器响应,登录成功或失败
2.Servlet的原理
有了对Servlet一定的基础,下面来看一下Servlet运行原理。在Tomact中是如何找到Servlet的呢?
当用户在客户端访问Servlet时,是通过Servlet在Tomact的web.xml文件配置的访问路径放问的。下面通过一张图来看一下。
根据上图我们来分析一下,具体流程如下。
(1)服务器根据客户端的访问路径,获得Servlet的访问路径。
(2)服务器通过获得的路径去web.xml中进行匹配,其中在这个过程中需要对web.xml进行解析
(3)匹配成功后,会找到相应的<servlet-class>标签,这是关键所在,其值为Servlet类名,可以通过反射获取该Servlet的class对象
(4)然后调用Class对象的newInstance()方法,实例化一个Servlet对象。在此一定要为Servlet提供一个无参数的构造方法。
(5)利用反射获得Service()方法的Method对象,然后调用service方法,这样就可以实现了service方法的执行。
3.Servlet生命周期
有了对Servlet实现原理的介绍,我们来看一下,Servlet整个生命周期的运作。
4.Servlet中相关接口和类
注意:其中我们经常用的是继承的HttpServlet
5.Servlet的线程安全
通过了解Servlet的生命周期,我们可以得出以下几点
(1)客户端不同的请求会对应不同的Servlet
(2)每个Servlet都是独一无二的
(3)服务器端会保存多个Servlet,来处理不同的请求
通过这几点我们知道,一个Servlet对应一个Servlet实例,也就是说Servlet是单实例的,那么就有可能出现一个Servlet同时处理多个不同的请求,这时就可能造成线程不安全,解决办法通常如下:
1.不用在servlet中创建成员变量,可以创建局部变量
2.如果要创建成员变量,必须保证是无状态的成员变量
3.如果创建的有状态的成员变量,状态必须是只读的。