




已阅读5页,还剩24页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
连接器,贝毅君浙江大学软件学院,连接器,引入连接器优化Servlet容器HttpRequest优化套接字输入流优化请求行解析请求头解析Cookie获取参数HttpResponse,错误消息日志能够帮助管理员或程序员快速的定位错误点。Tomcat处理消息的方法是将错误消息存储在一个properties文件中。每个包下面包含一个properties文件,该文件包含该包中任何类可能抛出来的异常。每个StringManager对象被包内所有对象重用,StringManager错误消息定位,单例模式是设计模式当中最常用的模式。它只有一个私有的构造函数,只能在建立的时候实例化,调用者只能通过公共静态方法来获取实例。具体实例见src/org/apache/naming/StringManager.java,StringManager单例模式,privatestaticHashtablemanagers=newHashtable();publicsynchronizedstaticStringManagergetManager(StringpackageName)StringManagermgr=(StringManager)managers.get(packageName);if(mgr=null)mgr=newStringManager(packageName);managers.put(packageName,mgr);returnmgr;,声明,StringManager使用案例,调用,protectedStringManagersm=StringManager.getManager(ex03.pyrmont.connector.http);,thrownewServletException(sm.getString(httpConnector.alreadyInitalized=);,httpConnector.alreadyInitalized=HTTPconnectorhasalreadybeeninitialized,文件,引入连接器的Servlet容器,HttpServer类分成HttpConnector和HttpProcessor两个类HttpConnector负责等待HTTP请求,HttpProcessor负责创建Request和Response对象Request类和Response类分别被HttpRequest类和HttpResponse类代替HttpProcessor使用其parse()方法填充HttpRequest对象。连接器只解析service用到的HTTP信息HttpRequest自己负责解析请求体或查询字符串的参数。,引入连接器的Servlet容器,本Servlet容器通过BootStrap类负责启动。,Bootstrap,publicfinalclassBootstrappublicstaticvoidmain(Stringargs)HttpConnectorconnector=newHttpConnector();connector.start();/HttpConnector是个Runnable对象,内部封装线程启动,核心未捕获异常代码:,HttpConnector,publicvoidrun()ServerSocketserverSocket=null;While(!stopped)serverSocket=newServerSocket(8080,1,InetAddress.getByName(“”);Socketsocket=serverSocket.accept();HttpProcessorprocessor=newHttpProcessor(this);cessor(socket);,转化处理功能由HttpProcessor完成,HttpConnector和HttpProcessor功能分离,简单servlet容器实现:,HttpProcessorprocess(),input=socket.getInputStream();request=newHttpRequest(input);reponse.setRequest(request);,改造后实现,input=newSocketInputStream(sock.getInputStream(),2048);request=newHttpRequest(input);reponse.setRequest(request);/新增部分response.setHeader(“Server”,“PyrmontServletContainer”);parseRequest(input,output);parseHeaders(input);/TODO尾部去处shutdown参数赋值,SocketInputStream实例是java.io.InputStream实例的包装类,可以通过getInputStream()方法获得实例提供了2个重要方法readRequestLine()和readHeader()readRequestLine()会返回一个HTTP请求第一行的内容(包含URL、请求方法和协议版本信息)readHeader()会返回头信息的键值对。每次调用只会返回一对,所以该方法会被重复调用。readRequestLine()方法必须在readHead()方法之前调用。,SocketInputStream,HttpRequest类实现了javax.servlet.http.HttpServeltRequest接口使用RequestStream实例作为输入流对象RequestSream类是java.io.InputStream类的直接子类HttpRequest自身负责解析Http请求HttpRequest已经引入了Http请求头、Cookie和请求参数等信息,HttpRequest,前面搭建简单web服务器和简单servlet容器的时候调用java.io.InputStream的read()方法来读取字节流。字节流解析交给SocketInputStream来完成了,该类内部封装了read()方法来解析流信息。引入SocketInputStream的目的是为了能够调用其readRequestLine()方法和readHeader()方法,解析Http请求-读取套接字的输入流,解析Http请求解析请求行,解析请求行在HttpProcessor中的parseRequest()中实现parseRequest()实现7部分功能利用input.readRequestLine(requestionLine)获取请求行信息并分别存储在变量中验证请求行信息有效性根据?读取请求参数并通过HttpRequest的setQueryString方法存储到parameterMap类中检查URI是否是绝对路径并作相应转换转化请求中会话标示符并调用HttpRequest的setRequestedSessionid方法存储到HttpRequest对象中对非正常的URI行进修正最后设置HttpRequest对象的属性,请求头被封装在HttpHeader类里面解析请求头在HttpProcessor里的parseHeader()方法中调用,解析Http请求解析请求头,While(true)HttpHeaderheader=newHttpHeader();input.readHeader(header);if(End=0)if(header.valueEnd=0)return;elsethrownewServletException(sm.getString(httpProcessor.parseHeaders.colon);,读取下一个Header信息,检查是否已经读取到尾部,是则返回,nameEnd和valueEnd代表当前name和value参数的长度值,Stringname=newString(,0,End);Stringvalue=newString(header.value,0,header.valueEnd);request.addHeader(name,value);if(name.equals(“cookies”)/TODO解析cookieelseif(name.equals(“content-length”)intn=-1;tryn=Integer.parseInt(value);catch(Exceptione)thrownewServletException(sm.getString(httpProcessor.parseHeaders.contentLength);request.setContentLength(n);elseif(name.equals(“content-type”)request.setContentType(value);,Cookie解析是通过RequestUtil.parseCookieHeader()方法实现的。parseCookieHeader()方法接受Cookie请求头转化后返回一个Cookie类型的数组。,解析Http请求解析Cookie,if(name.equals(cookie)/通过RequetUtil转化CookieCookiecookies=RequestUtil.parseCookieHeader(value);for(inti=0;i=0)contentType=contentType.substring(0,semicolon).trim();elsecontentType=contentType.trim();if(POST.equals(getMethod(),下述代码负责解析请求体,while(lenmax)intnext=is.read(buf,len,max-len);if(next0)break;len+=next;is.close();if(lenmax)thrownewRuntimeException(Contentlengthmismatch);RequestUtil.parseParameters(results,buf,encoding);catch(UnsupportedEncodingExceptionue);catch(IOExceptione)thrownewRuntimeException(Contentreadfail);,HttpResponse类实现了javax.servlet.http.HttpServletResponse接口HttpResponse返回自实现的ResponseWriter,该Writer重写了所有的print()方法和println()方法,自动刷新信息到客户端。使用自实现ResponseStream替换Java.io.OutputStream对象利用java.io.OutPutStreamWriter对象作为ResponseWriter对象和ResponseStream对象之间的桥梁。通过OutPutStream类传入的字符会被转化成使用指定字符集的字节数组。,HttpResponse,Servlet中,可以使用PrintWriter对象向输出流中写字符,但是向浏览器发送字符的时候,实际上都是字节流。这里使用ResponseWriter类来替代PrintWriter类向客户端发送信息。ResponseWriter重写了所有的print()和println()方法,实现自动将信息发送到客户端。使用OutputStreamWriter作为ResponseWriter和ResponseStream对象之间的桥梁。OutputStreamWriter可以将传入的字符转换成指定字符集的字节数组。字节数组缓冲区大小固定。,HttpResponseWriter,publicPrintWritergetWriter()throwsIOExceptionResponseStreamnewStream=newResponseStream(this);OutputStreamWriterosr=newOutputStreamWriter(newStream,getCharacterEncoding();writer=newResponseWriter(osr);returnwriter;,HttpResponsegetWriter(),ServletProcessor中process()方法接受的实例替换成HttpRequest和HttpResponseServletProcessor中process()方法中对应外观类发生变化ServletProcessor中process()方法调用servlet.service()方法后,还会调用HttpResponse类的finishResponse方法,ServletProcessor,servlet=(Servlet)myClass.newInstance();HttpRequestFacaderequestFacade=newHttpRequestFacade(request);HttpResponseFacaderesponseFacade=newHttpResponseFacade(response);servlet.service(requestFacade,responseFacade);(HttpResponse)response).finishResponse();,测试Servlet-ModernServlet,publicclassModernServletextendsHttpServletpublicvoidinit(ServletConfigconfig)System.out.println(ModernServle
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 小学冬季安全培训记录课件
- 2025年黄山黄山区消防救援大队招聘2人考前自测高频考点模拟试题及答案详解(网校专用)
- 安全培训效果考评方案模板课件
- 安全培训效果汇报课件
- 互联网合作协议书模板
- 2025年《中国烟草》杂志社有限公司(中国烟草总公司传媒中心)招聘考前自测高频考点模拟试题有答案详解
- 民宿行业市场分析与发展策略报告
- 广州莱拓的课件助手
- 2025湖南长沙市金海高级中学教师招聘34人考前自测高频考点模拟试题及答案详解(全优)
- 成本控制与预算管理标准化表
- 人工智能算力中心项目环境影响报告书
- 无人机飞防应急处置预案
- 四川蜀道养护集团有限公司招聘笔试题库2025
- 高一历史第一次月考卷02(考试版)(新高考适用)
- 中国石化加油站视觉形象(VI)标准手册-课件
- 眼视光技术专业技能考核题库-眼镜定配技术模块
- 体育测量与评价-第二章-体育测量与评价的基础理论课件
- 超清地质年代表
- 铺轨工程监理规划及工作内容
- 女生青春期生理卫生知识讲座(课堂PPT)
- 14S501-1 球墨铸铁单层井盖及踏步施工
评论
0/150
提交评论