Servlet工做原理以及源码解析

   前段时间学习spring框架的时候很想研究一下servlet的工做原理,可是一直没有时间,这几天有点时间了,因此赶忙的看了一下相关资料以及servlet的源码粗略的分析了一下咱们servlet的工做实现: java

首先要从tomcat开始提及,tomcat是一个web应用服务器,当咱们把咱们的servlet应用部署进咱们的tomcat时,咱们的tomcat就至关于一个servlet/jsp容器,当咱们的Tomcat容器也就是咱们的servlet容器启动的时候,他就会自动的读取咱们的web.xml里面的配置信息,初始化咱们的servlet的某些配置,下面我说一下当咱们的一个请求来的时候,咱们的servlet容器是怎么处理他的: web

1web client发送一个request请求。 spring

2Servlet容器接收咱们这个请求,把web client的请求的信息封装成一个HttpServletRequest对象,以及HttpServletResponse对象。 tomcat

3Servlet容器把咱们的HttpServletRequest对象,以及HttpServletResponse对象封装成一个参数传递给咱们的httpservletservice()方法。 服务器

4:在service()里面咱们经过读取咱们的httpServletRequst里面的信息进行一些操做,而后写入一些信息进入咱们的HttpServletResponse对象中。 框架

5:咱们的servlet容器把咱们的HttpServletResponse返回给咱们的webclint jsp

工做原理以下: 函数

以上是我理解的Servlet的工做原理,可是当咱们的请求到达了咱们的HttpServlet的时候,HttpServlet是怎么处理WebClient请求的? 学习

首先看一下咱们web应用最重要的一个包 javax.servlet里面的Servlet接口,以及他的子类 ,在咱们的java web应用中,有两个子类直接继承了它:JspPageGenericServlet。HttpServlet就是继承自GenericServlet。 spa



以上是Servlet接口的源代码,当咱们的Servlet容器实例化了一个Servlet的时候首先会调用init()方法,以后再调用service()。。。。。。


这里面有几个基本的方法:

Init():初始化servlet时调用它

getServletConfig():获取servlet的配置信息

Service(Request,Response):对咱们的请求进行操做的方法

getServletinfo();获取咱们servlet的信息

Destroy:销毁咱们的servlet


重点说下GenericServlet,GenericServlet是一个抽象方法,必须经过类的实现才能引用他,GenericServlet它提供了咱们的Servlet的基本接口的实现,而且实现了一些基本的方法,要知道咱们的请求可不仅有咱们的Http请求,还有FTP等等之类的请求,若是之后咱们要写ftp类型的服务的话咱们就能够继承这个方法写个FtpServlet也何尝不可。


    HttpServlet是 GenericServlet 的子类,可是 HttpServlet 扩展了 GenericServlet 而且提供了 servlet 接口基于 http 的实现,源码太多就不贴出来了,这只分析HttpServlet中几个重要的方法

service(ServletRequest req, ServletResponse res):

当咱们实例化servlet时,servlet容器会调用这个service方法,这方法的做用主要是ServletRequest ,以及ServletResponse 封装成咱们的HttpServletRequest 参数传递给

service(HttpServletRequest req, HttpServletResponse resp)方法处理。固然有必要咱们也能够重写这个方法

service(HttpServletRequest req, HttpServletResponse resp):

在这个service()方法里面经过req.getMethod()方法得到Http请求的method,而后经过他的请求方式来判断他因该由那个函数处理,若是获取的Http method在这个方法里面没有对应的函数处理它,那么就会经过: resp.sendError(501, errMsg1)这个方法返回给客户端501(服务器端不支持此请求)错误。

当Servlet里没有重写doGet()方法的时候,一个get请求到达服务器端时就会执行默认的doget()

这里经过req.getProtocol()来获取客户端向服务器端传送数据所依据的协议名称,若是是Http1.1的话返回405错误(方法不被容许),不然返回400错误(错误的请求)给咱们的客户端。

相关文章
相关标签/搜索