




已阅读5页,还剩47页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
深入淺出Web容器,Tomcat原始碼分析,林信良資深技術顧問http:/openhome.cccaterpillaropenhome.cc,主題,Web容器與Servlet從HTTP請求到service()在service()的前後從JSP到Servlet自訂標籤處理,Web容器與Servlet,Web容器與Servlet,容器(Container)裝水的嗎?,別鬧了容器是個Java應用程式,介於Servlet與Web伺服器之間,我管很多事,你不用認識Web伺服器,你只要認得我!,Web容器與Servlet,管很多事?哪些事啊?,你沒想過HTTP那些麻煩的東西是怎麼變成Java物件的嗎?你以為Servlet中的Request與Response是怎麼來的?,Web容器與Servlet,看起來好像很複雜?,要了解我的內在確實不容易,那先從簡單的開始好了,知道一個Servlet是實作Servlet介面嗎?,.,來個簡化版的,if(servlets.get(servletName)=null)servlet=(Servlet)myClass.newInstance();servlets.put(servletName,servlet);servlet.init(newConfig(myClass);elseservlet=servlets.get(servletName);servlet.service(ServletRequest)requestFacade,(ServletResponse)responseFacade);,publicvoiddestroy()for(Servletservlet:servlets.values()servlet.destroy();,至少你要知道init()、service()與destroy(),Web容器與Servlet,你管的就是這些?,當然更多!不只ServletRequest、ServletResponse、ServletConfig、Servlet這些,對了!這個範例改寫自這邊,從HTTP請求到service(),我實際上很強壯的啦.XD,從HTTP請求到service(),當請求來到時是WorkerThread模式,publicvoidrun()while(running)/AllocateanewworkerthreadMasterSlaveWorkerThreadworkerThread=createWorkerThread();/Acceptthenextincomingconnectionfromtheserversocket.Socketsocket=acceptSocket();workerThread.assign(socket);.,沒原始碼沒真相.XD,採用ThreadPool.XD,從HTTP請求到service(),接下來快轉一下來到了Http11Processor,我應該說過我負責建立Request與Response物件吧這個類別剖析HTTP並設定Request、Response,從HTTP請求到service(),在Http11Processor的process()中,呼叫adapter.service(),adapter.service(request,response);,再來的話這邊的request、response會被org.apache.catalina.connector套件中的Request、Response包裹起來.,WHY?,從HTTP請求到service(),packageorg.apache.catalina.connector;publicclassRequestimplementsHttpServletRequest,packageorg.apache.catalina.connector;publicclassResponseimplementsHttpServletResponse,從HTTP請求到service(),再快轉一下Request與Response送到容器ContainerBase,最後來到StandardWrapper你要注意一下loadServlet()方法回憶Servlet第一次被請求時會被載入建立ServletConfig執行init()呼叫service(),publicclassStandardWrapperextendsContainerBaseimplementsServletConfig,Wrapper,NotificationEmitter,if(classLoader!=null)classClass=classLoader.loadClass(actualClass);elseclassClass=Class.forName(actualClass);./Instantiateandinitializeaninstanceoftheservletclasstryservlet=(Servlet)classClass.newInstance();.tryservlet.init(facade);servlet.service(req,res);,facade參考至實作ServletConfig的實例protectedStandardWrapperFacadefacade=newStandardWrapperFacade(this);,從HTTP請求到service(),SingleThreadModel怎麼實現?你可以自己找找看,喵好複雜Orz,已經省略了很多細節了你可以用這個流程來研究一些更深入的XD,在service()的前後,在service()的前後,你知道在Servlet前可以套用Filter吧!,好像是有這麼一回事XD,實現了InterceptorFilter模式,當我們又來到Servlet,在service()的前後,GenericServlet類別還實作了ServletConfig介面,將容器呼叫init()方法時所傳入的ServletConfig實例封裝起來service()方法直接標示為abstract而沒有任何的實作HTTP相關服務流程定義在HttpServlet的service()方法,在service()的前後,protectedvoidservice(HttpServletRequestreq,HttpServletResponseresp)throwsServletException,IOExceptionStringmethod=req.getMethod();/取得請求的方法if(method.equals(METHOD_GET)/HTTPGET/略.doGet(req,resp);/略.elseif(method.equals(METHOD_HEAD)/HTTPHEAD/略.doHead(req,resp);elseif(method.equals(METHOD_POST)/HTTPPOST/略.doPost(req,resp);elseif(method.equals(METHOD_PUT)/HTTPPUT/略.,protectedvoiddoGet(HttpServletRequestreq,HttpServletResponseresp)throwsServletException,IOExceptionStringprotocol=req.getProtocol();Stringmsg=lStrings.getString(http.method_get_not_supported);if(protocol.endsWith(1.1)resp.sendError(HttpServletResponse.SC_METHOD_NOT_ALLOWED,msg);elseresp.sendError(HttpServletResponse.SC_BAD_REQUEST,msg);,在service()的前後,這實現了TemplateMethod模式。,現在好像談過了幾個模式?WorkerThread、InterceptorFilter、TemplateMethod,在service()的前後,來談一下Session怎麼建好了知道Session預設用Cookie儲存SessionId吧,餅乾我知道,在service()的前後,if(connector.getEmptySessionPath(),publicSessioncreateSession(StringsessionId)Sessionsession=createEmptySession()session.setNew(true);session.setValid(true);session.setCreationTime(System.currentTimeMillis();session.setMaxInactiveInterval(this.maxInactiveInterval);if(sessionId=null)sessionId=generateSessionId();session.setId(sessionId);sessionCounter+;return(session);,在service()的前後,你應該看一下org.apache.catalina.session.StandardSession,了解Session怎麼儲存好吧!接下來換個口味好了,Servlet談好久了要來談一下JSP嗎?XD,從JSP到Servlet,跟你下棋的其實是一隻貓.,從JSP到Servlet,在我的世界中真正服務的只有Servlet沒有JSP,使用JSP不是比較簡單嗎?,從JSP到Servlet,SimpleJSP,從JSP到Servlet,packageorg.apache.jsp;importjavax.servlet.*;importjavax.servlet.http.*;importjavax.servlet.jsp.*;publicfinalclassindex_jspextendsorg.apache.jasper.runtime.HttpJspBaseimplementsorg.apache.jasper.runtime.JspSourceDependent/略.publicvoid_jspInit()/略.publicvoid_jspDestroy()publicvoid_jspService(HttpServletRequestrequest,HttpServletResponseresponse)throwsjava.io.IOException,ServletException/略.,從JSP到Servlet,從JSP到Servlet,publicabstractclassHttpJspBaseextendsHttpServletimplementsHttpJspPage/略.publicfinalvoidinit(ServletConfigconfig)throwsServletExceptionsuper.init(config);jspInit();_jspInit();/略.publicfinalvoiddestroy()jspDestroy();_jspDestroy();publicfinalvoidservice(HttpServletRequestrequest,HttpServletResponseresponse)throwsServletException,IOException_jspService(request,response);/略.,從JSP到Servlet,在之間宣告的程式碼,都將轉譯為Servlet中的類別成員或方法之間所包括的內容,將被轉譯為Servlet原始碼_jspService()方法中的內容運算式元素中的運算式,會直接轉譯為out物件print()輸出時的指定內容,從JSP到Servlet,隱含物件,其實就是_jspService()中的區域參考名稱,application=pageContext.getServletContext();config=pageContext.getServletConfig();session=pageContext.getSession();out=pageContext.getOut();,原則上是因為都是轉成Servlet只不過角色職責不同這是另一個故事了,這麼說Servlet作的到的,JSP都作的到,自訂標籤處理,我討厭義大利麵.=0)handler=handlerscurrent-;returnhandler;tryTaginstance=(Tag)handlerClass.newInstance();publicvoidreuse(Taghandler)synchronized(this)if(current(handlers.length-1)handlers+current=handler;return;,自訂標籤處理,是啦!不過TagFile會被我轉成SimpleTag的實作XD,我記得還有個TagFile的東西,packageorg.apache.jsp.tag.web;importjavax.serv
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 吉林长春市宽城区招聘专职消防员考试真题2024
- 宝鸡高新区招聘幼儿园教职工考试真题2024
- 皇子考试题及答案
- 段考试题及答案
- 中华武术知到智慧树答案
- 广西专业技术人员继续教育公需科目培训试题库(含答案)
- 食品安全管理员考试题库及答案大全
- 中小学音乐教学设计与案例分析知到智慧树答案
- 2025年度农产品销售合同签订与质量追溯流程框图
- 2025版外立面装饰材料研发与采购合同
- 道路施工机械设备安全知识培训
- AI在护理查房中的应用
- 证券行业智能化投资组合管理方案
- 银行员工消保知识培训
- 地理与劳动教育
- 第5课 甲午中日战争与列强瓜分中国狂潮 公开课一等奖创新教学设计
- 初中数学新人教版七年级上册第二章《有理数的运算》教案(2024秋)
- 人教版(2025新版)七年级下册数学第七章 相交线与平行线 单元测试卷(含答案)
- 厂房消防应急预案
- 景区开发政府战略框架协议书(2篇)
- “雄鹰杯”全国小动物医师技能大赛考试题库(660题)
评论
0/150
提交评论