前段时间学习spring框架的时候很想研究一下servlet的工做原理,可是一直没有时间,这几天有点时间了,因此赶忙的看了一下相关资料以及servlet的源码粗略的分析了一下咱们servlet的工做实现: java
首先要从tomcat开始提及,tomcat是一个web应用服务器,当咱们把咱们的servlet应用部署进咱们的tomcat时,咱们的tomcat就至关于一个servlet/jsp容器,当咱们的Tomcat容器也就是咱们的servlet容器启动的时候,他就会自动的读取咱们的web.xml里面的配置信息,初始化咱们的servlet的某些配置,下面我说一下当咱们的一个请求来的时候,咱们的servlet容器是怎么处理他的: web
1:web client发送一个request请求。 spring
2:Servlet容器接收咱们这个请求,把web client的请求的信息封装成一个HttpServletRequest对象,以及HttpServletResponse对象。 tomcat
3:Servlet容器把咱们的HttpServletRequest对象,以及HttpServletResponse对象封装成一个参数传递给咱们的httpservlet的service()方法。 服务器
4:在service()里面咱们经过读取咱们的httpServletRequst里面的信息进行一些操做,而后写入一些信息进入咱们的HttpServletResponse对象中。 框架
5:咱们的servlet容器把咱们的HttpServletResponse返回给咱们的webclint。 jsp
工做原理以下: 函数
以上是我理解的Servlet的工做原理,可是当咱们的请求到达了咱们的HttpServlet的时候,HttpServlet是怎么处理WebClient请求的? 学习
首先看一下咱们web应用最重要的一个包 javax.servlet里面的Servlet接口,以及他的子类 ,在咱们的java web应用中,有两个子类直接继承了它:JspPage,GenericServlet。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也何尝不可。
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错误(错误的请求)给咱们的客户端。