Servlet
- Servlet定义
全称Java Servlet。是用Java编写的服务器端程序。其主要功能在于交互式地浏览和修改数据,生成动态Web内容。狭义的Servlet是指Java语言实现的一个接口,广义的Servlet是指任何实现了这个Servlet接口的类,一般情况下,人们将Servlet理解为后者。引自Wikipedia
Servlet生命周期
- 加载
容器通过类加载器使用servlet类对应的文件加载servlet
- 创建
通过调用servlet构造函数创建一个servlet对象
- 初始化
调用init方法初始化
- 处理HTTP请求
每当有一个客户请求,容器会创建一个线程来处理客户请求
- 销毁
调用destroy方法让servlet自己释放其占用的资源
Servlet处理HTTP请求过程
- Web客户向Servlet容器发出Http请求;
- Servlet容器解析Web客户的Http请求;
- Servlet容器创建一个HttpRequest对象,在这个对象中封装Http请求信息;
- Servlet容器创建一个HttpResponse对象;
- Servlet容器调用HttpServlet的service方法,这个方法中会根据request的Method来判断具体是执行doGet还是doPost,把HttpRequest和HttpResponse对象作为service方法的参数传给HttpServlet对象;
- HttpServlet调用HttpRequest的有关方法,获取HTTP请求信息;
- HttpServlet调用HttpResponse的有关方法,生成响应数据;
8.Servlet容器把HttpServlet的响应结果传给Web客户。
Java Servlet 体系
Java Servlet 体系组成
- Servlet interface
- GenericServlet class
- HttpServlet class
- ServletRequest 和 HttpServletRequest inteface
- ServletResponse 和 HttpServletResponse interface
- ServletConfig
- ServletContext
Servlet 各组件间的关系
- 组件关系有实现、继承、依赖,具体如下图所示
在图中可以看出各个组件之间的关系,Servlet以及HttpServlet需要依赖相关的Request和Response作为参数输入,至于Request和Response内的数据由容器负责封装。
从客户端请求到服务器返回响应过程中,数据的流动过程
- 浏览器向目标地址发送HTTP请求数据;(扩展:可以了解一下网络协议TCP/IP)
- tomcat接收到请求数据;
- tomcat解析Socket与封装数据(Request、Response、客户端相关等)
tomcat解析具体过程可参考如下链接:
https://blog.csdn.net/li295214001/article/details/48133989 - 执行相应的servlet生命周期中的五步,在此过程中需要注意的点有
相关Servlet何时实例化
如果有在web.xml的相关servlet中配置loadOnStartup属性,如下,则在容器(这里指tomcat)启动时,就创建实例;
<servlet> <servlet-name>HelloServlet</servlet-name> <servlet-class>com.servlet.HelloServlet04</servlet-class> <load-on-startup>1(任意大于零的数字)</load-on-startup> </servlet>
如果未配置,则在有对此Servlet请求时,进行实例化;
- 将Response数据回传容器,由容器与客户端进行响应数据传输。
Servlet销毁
- 关闭容器
- 没了,destroy()只是用于销毁后的处理事宜,类似于try/catch/finally中的finally,或用于GC的finalize()。
Servlet需要注意的地方
- Servlet是单例多线程的,即同一个Servlet只初始化一次,但是service()方法支持多线程调用。
- Servlet是非线程安全的。