资源描述:
《servlet-我们到底能走多远系列(7)》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、Servlet的核心类图如下:上面的servlet只是接口,相当于描述了servlet的标准,也就是说与协议无关。而HttpServlet的实现是根据Http协议来完成的。看下面的截图: 打开源码看后发现大多数接口和抽象类,那么真正的实现都在哪呢?在servlet容器源代码里,即类似Tomcat这样的servlet容器。 所以我觉得可以这样理解Servlet的作用:它提供了操控的按钮,这些按钮一旦被安装到Servlet容器里面,http://gexing.qqq80.com我们就可以通过这些按钮操控
2、servlet容器,从而管理我们自己的Servlet实例。 这一点很重要。所以阅读Servlet源码其实就是了解他的基本结构和API,我们真正要读的是Tomcat的源码! Servlet的运行结构和API:首先看下一次Http请求-响应的过程: A,首先客户端通过浏览器向服务器发送Http请求; B,Tomcat监听服务器的8080端口,当有Http请求发过来之后,解析出项目名称,然后到webapps目录下搜索到该项目文件夹。 C,Tomcat作为servlet的容器,实例化第一次请求调用的的s
3、ervlet实例(以后再有相同的servlet的请求,使用第一次的实例)。 D,调用init()方法,初始化工作。 E,调用HttpServlet的service方法,中间会更加请求,调用doGet或doPost方法,执行核心逻辑代码。 F,执行完servlet后,返回响应,客户端浏览器根据响应呈现效果。然后我们看下基本的运行机制:从图上可以看出,不同的用户请求并发使用同一个Servlet实例,这是一个比较重要的基础机制。Container解析Http请求后,实例化Servlet,因为是Http请
4、求,会执行HttpServlet的代码:首先会执行HttpServlet中的service(ServletRequestreq,ServletResponseres)方法:publicvoidservice(ServletRequestreq,ServletResponseres)throwsServletException,IOException{HttpServletRequestrequest;HttpServletResponseresponse;http://www.caise8.comtry
5、{request=(HttpServletRequest)req;//请求转换成Http请求response=(HttpServletResponse)res;//响应转换成Http响应}catch(ClassCastExceptione){thrownewServletException("non-HTTPrequestorresponse");}service(request,response);//调用处理Http的service方法}然后会调用service(HttpServletRequest
6、req,HttpServletResponseresp)方法:protectedvoidservice(HttpServletRequestreq,HttpServletResponseresp)throwsServletException,IOException{Stringmethod=req.getMethod();//取得req中的方法类型if(method.equals(METHOD_GET)){//根据方法类型来决定执行后续的方法,我们只关注doGet和doPostlonglastModif
7、ied=getLastModified(req);if(lastModified==-1){doGet(req,resp);}else{longifModifiedSince=req.getDateHeader(HEADER_IFMODSINCE);if(ifModifiedSince<(lastModified/1000*1000)){maybeSetLastModified(resp,lastModified);doGet(req,resp);//如此我们就能执行到自己写的doGet方法,从而执行自
8、己的业务逻辑。}else{resp.setStatus(HttpServletResponse.SC_NOT_MODIFIED);}}}elseif(method.equals(METHOD_HEAD)){longlastModified=getLastModified(req);maybeSetLastModified(resp,lastModified);doHead(req,resp);}elseif(method.equals(ME