HTTP请求(请求方法,请求头,实体(传给服务端的数据))
请求方法:url,协议/版本
HTTP响应(1.协议-状态码-描述2:响应头3:响应实体段(服务端返回的数据))
创建 public Socket(String host,int port);
端对端的发送和接收数据
Socket.getOutputStream Socket.getInputStream
ServerSocket 服务器套接字,因为不知道客户端何时发出请求,所以ServerSocket 随时待命,一旦发现客户端请求,就建立一个socket来进行通信。
HttpServer,Request,Response
HttpServer 由静态资源的路径 final String WEB_ROOT
Final String SHUTDOWN_COMMAND=”/SHUTDOWN”
Await 方法:ServerSocket .accept()方法获取请求,发送的信息,在根据url发送资源,然后判断url是不是SHUTDOWN,如果是就终止这个servlet;
Request:
根据传入的InputStream 获取parseUrl解析HTTP请求的url
Response:
sendStaticResource()方法,根据request解析的url,判断服务器是否有这个资源,如果有这个资源,就返回资源,如果没有就返回“File Not Found”;
Javax.servlet.Servlet 接口
Init,service,destory,getservletConfig,getServletInfo;5个方法,看见名字顾名思义相信大家都会懂吧。
HTttpserver1
加了一个处理servlet的判定如果是servlet就调用ServletProcessorl方法否则调用StaticResponseProcessor方法
Request
实现servletRequese接口
多了很多实现的方法
Response
实现servletResponse接口
StaticResponseProcessor
调用response.staticResponseProcessor()返回静态资源的路径
ServletProcessorl
根据获得request的url 获取servlet的名字采用类加载器,根据URLClassLoader加载servlet类,返回servlet的处理过程,返回数据给view,进行渲染。
Constants
连接器的功能负责创建HttpservletResponse,HttpservletResquest的实例,就是把从socket到Request之间需要有个转换过程
连接器模块
连接器及其支持类(HttpConnector,HttpProcessor)
表示HTTP的请求,响应(HttpResponse,HttpResquest)及其支持类
外观类(HttpResponseFacade,HttpResquestFacade)
常量类
HttpConnector负责请求工作,HttpProcessor负责创建HttpResponse,HttpResquest对象,HttpConnector和server的await()实现的功能差不多,负责分配请求。
HttpConnector:
是一个线程 implement Runnable run方法实现的功能
等待HTTP请求HttpProcessor
调用HttpProcessor的process方法
为每个请求创建HttpProcessor的实例
HttpProcessor:
创建HttpResponse,HttpResquest对象
解析第一行内容和请求头信息你,填充HttpResquest对象。ReadLine,ReadHeader方法,
还会查看jsessionid的状态,解析请求头
process方法获取request根据url判断是否是servlet分别派发给servletProcessor,和staticResponseProcessor
HttpResquest:
SocketInputStream readRequestLine readHeader
parseRequest 寻找url和传递的参数
查找jsessionid根据jsessionid 设置setRequestedSessionId();
启动模块
Bootstarp(启动类加载器)----->extension(扩展类加载器)------>application(应用类加载器)
核心模块
过程:1. 等待应入HTTP请求
Connection:keep-alive
重要方法:getContainer:得到与连接器相互连接的servlet
setContainer:设置与连接器相互连接的servlet
CreateReuqest,CreateResponse
HttpConnector 实现了connector接口
HttpProcessors对象池用来处理多个HTTP请求,和线程池大同小异
createProcessor方法不会创建一个新的HttpProcessor实例,重HttpProcessors对象池获取HttpProcessor实例,如果没有可以获取的就关闭套接字,不对引入的HTTP请求做出反应。
HttpProcessors对接收的HTTP请求进行分类处理(静态资源,servlet,controller)
HttpProcessor的run方法
获取套接字,进行HTTP处理,调用连接器的recycle()方法将当前的HttpProcessor实例压入栈中。
先要等HttpConnector类获取到套接字
HttpProcessor才能顺利往下执行,不然会一直等待的。
使用process方法来处理请求
Process方法三个步骤:解析连接,解析请求,解析请求头,调用invoke(request,response)创建servlet实例
Container最重要的就是invoke()方法,反射生成servlet实例。
Catalina容器分为4类
Engine:整个引擎,Host:包含一个或多个Context容器的虚拟主机,Context:一个web应用程序包含多个Wrapper,Wrapper:就是一个servlet
管道包含了servlet容器将要调用的容器,一个管道包含很多个阀,阀就像过滤器一样
当调用完管道阀就会调用基础阀,最后调用的是基础阀,一层层的阀的调用完成servlet该完成的任务
Pipeline接口
加入,移除阀
Value接口
阀实现了value接口的主要方法就是invoke()
Wrapper接口
表示一个独立servlet定义
添加wrapper实例
还有实现Wrapper实例的请求映射,作为servlet请求路径
包含一个Pipeline实例,Loader实例,Pipeline包含一个基础阀
Bootstrap类加载器
父组件启动自动启动子组件,父组件关闭自动关闭子组件,
监听器一样,或者是拦截器就是一个组件开始,关闭。Lifecycle就是在start,stop前后做一些处理.
Lifecycle最重要的方法是start,stop
包含一个Lifecycle实例
当监听事件,发生时候会调用LifecycLeSuppor事件.
父组件管理子组件的过程.
Logge接口
LoggeBase实现Logge接口
FileLogger(写到文件,还有就是包括定时清理文件,文件多大就分文件存储),SystemEroorLogger,SystemOutLogger(打印到控制台)继承LoggeBase。
Java虚拟机使用类载入器来载入需要的类,首先在java核心库,以及CLASSPATH中指明的目录相关类,如果找不到就抛出java.lang.ClassNotFoundException异常
Bootstarp---->extension----->aplication----->user 双亲委派模型,加载类
BootStarp用于引导启动Java虚拟机,当调用javax.exe程序的时候以及核心类包括java.lang,java.io
Extension 负责载入标准扩展目录中的类/jdk/jre/lib/ext下面的类
aplication就是自己写的类
代理模型,双亲委派模型
Tomcat 使用自定义的原因:1.为了在载入类中指定某种规则
2为了缓存以及载如的类
3为了首先预载入,方便使用
Servlet类只能载如当前项目的WEB-INF/lib目录下的库。
Reloader 自动重载,就算你在修改代码的时候自动,更新到TOMCAT容器中。
Tomcat的类加载,做了权限限定就是每个application,只能加载本项目下的类,不能加载到别的项目底下去做加载,还有就是,tomcat的修改类的重加载设置,就是不用重新启动tomcat,自动更换tomcat里面的class文件。
相当与一个会话所管理的内存,session对象总是存在与session管理器中,可以使用get/setmanager()方法来进行实例和管理器相关联起来。
Session还有一个过期时间,根据你多久未访问而自动重session容器中移除session
Session管理器继承了Manager接口。
Manager接口
将Manager与Context容器相关联,创建session的实例。
Session的换出和备份
将超过时间的换出内存,把换出内存的做了备份。
存储器
把session对象持久化,两种方案持久化为文件,持久化到jdbc数据库