Servlet简介
一、概念
Servlet全称java Servlet,是使用java语言编写的服务器端程序。
二、工作原理
Servlet运行时需要特定的容器,即Servlet运行时所需要的运行环境,例如:tomcat。
Servlet工作原理图:
当web服务器接收到一个Http请求时,web服务器会将请求交给Servlet容器。Servlet容器首先对所请求的URL进行解析,并根据web.xml配置文件找到对应的处理Servlet,同时将request、response对象传递给Servlet。Servlet通过request对象获取客户端请求者、请求信息及其他信息等。Servlet处理完请求后,会把所有需要返回的信息放入response对象中并返回客户端。Servlet一旦处理完请求,Servlet容器就会刷新response对象,并将控制权重新交给web服务器。
当Servlet容器收到请求时,Servlet引擎就会判断这个Servlet是否是第一次访问,如果是第一次访问,Servlet引擎调用init()方法初始化这个Servlet。每个Servlet只被初始化一次,后续的请求只是新建一个线程,再调用Servlet中的service()方法。当多个用户请求同时访问一个Servlet时,由Servlet容器为每个用户启动一个线程,这些线程的启动和销毁由Servlet容器负责。
三、生命周期
Servlet的生命周期一般是从web服务器开始运行时开始,然后不断地处理来自浏览器的请求,并通过web服务器将响应结果返回给客户端,直到web服务器停止运行,Servlet才会被清除
一个Servlet的生命周期一般包括:加载、初始化、运行、销毁4个阶段
1、加载
当web服务器启动或web客户请求Servlet服务时,Servlet容器加载一个java Servlet类,一般情况下,Servlet容器是通过java类加载器加载一个Servlet的,这个Servlet可以是本地的,也可以是远程的。Servlet只需要加载一次,然后实例化该类的一个或多个实例。
2、初始化阶段
Servlet容器调用Servlet的init()初始化方法,对Servlet进行初始化。在初始化时,将会读取配置信息,完成数据连接等工作。
在初始化阶段,将包含初始化参数和容器环境信息的ServletConfig对象传入init()方法中,ServletConfig对象负责向Servlet传递信息,若传递失败,则发生ServletException异常,Servlet将不能正常工作,此时Servlet会被容器清除掉。由于初始化未完成,因此不会调用destroy()方法释放资源。清除该Servlet后容器将重新初始化这个Servlet,若抛出UnavailableException异常,并指定了最小的初始化间隔时间,则需要等待该指定时间之后,再进行新的Servlet初始化。
3、运行阶段
当web服务器接收到浏览器的访问请求后,会将该请求传给Servlet容器。Servlet容器将web客户接收到的HTTP请求包装成HttpServletRequest对象,由Servlet生成的响应包装成HttpServletResponse对象,将这两个对象作为参数,调用service()方法。在service()方法中,通过HttpServletRequest对象获取客户端的信息,HttpServletResponse对象生成HTTP响应数据。
容器在某些情况下,会将多个web请求发送给同一个Servlet实例进行处理。在这种情况下,一般通过Servlet实现SingleThreadModel接口来处理多线程的问题,从而保证一次只有一个线程访问service()方法。容器可以通过维护一个请求队列或维护一个Servlet实例池来实现这样的功能。
4、销毁阶段
Servlet被初始化后一直在内存中保存,直到服务器重启时Servlet对象被销毁。在这种情况下,通过调用destroy()方法,回收init()方法中使用的资源,如关闭数据库连接等。destroy()方法完成后,容器必须释放Servlet实例,以便它能够被垃圾回收。
一旦调用destroy()方法,容器就不会再向当前Servlet发送任何请求。如果容器还需要使用Servlet,则必须创建新的Servlet实例。
四、MVC开发模式
MVC模式将应用程序的开发分为三层:视图、模型、控制层。
视图层:负责从用户获取数据和向用户展示数据。
模型层:负责处理业务逻辑和数据库的底层操作。
控制层:负责处理视图层的交互。从视图层接收请求,然后从模型层取出对请求的处理结果,并将结果返回给视图层。只负责数据的流向,并不涉及具体的业务逻辑处理。
MVC模式图: