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