Servlet工作原理以及源码解析

   前段时间学习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也未尝不可。


    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错误(错误的请求)给我们的客户端。


转载于:https://my.oschina.net/u/2505383/blog/649585

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值