第一章 一个简单的http服务器
- http与socket的关系
1.http只是一个应用层协议,所有应用层协议都是基于socket编程,http也不例外
2.所以自己编写的http服务器是通过socket获取数据,然后将数据按照http协议解析,从而得到需要的数据 - javax.net.Socket和javax.net.ServerSocket
1.在java中,前者是客户端套接字,后者是服务端套接字
2.ServerSocket.accept()方法会阻塞线程,直到建立连接!!! - Request、Response
1.前者用于包装请求数据(主要是ServerSocket对象中的输入流);
2.后者用于包装响应数据(主要是ServerSocket对象中的输出流);
3.对于tomcat,有相应的类实现javax.servlet.ServletRequest即ServletResponse接口,只是不一定叫Request/Response
第二章 一个简单的servlet容器
-
javax.servlet.Sevlet接口
public interface Servlet { public void init(ServletConfig config) throws ServletException; public ServletConfig getServletConfig(); public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException; public String getServletInfo(); public void destroy(); }
其中:
1.init()、service()、destroy()方法与servlet的生命周期相关;init()方法只会调用一次
2.请求到达后,容器调用servlet的service()方法处理请求(会将ServletRequest、ServletResponse对象作为参数传入service方法)
3.在将servlet实例从服务中移除前,容器会调用destroy()方法 -
javax.servlet.ServletRequest/ServletResponse
servlet规范中关于请求、响应的接口,主要起到对请求/响应的包装作用; 传入service(…)方法的对象实现了这个接口
第三章 连接器
- StringManager类
在org.apache.catalina.util下
单例
用于管理某个包下的错误信息 - 本章容器程序的几个主要模块
启动模块:Bootstrap类,连接模块的连接器在其中另起一个线程从而启动容器
连接器模块:由连接器部分(负责等待http请求,然后将socket传递给处理器部分处理) 和 处理器部分(负责创建Request、Response对象;解析请求并填充Request;交给相应的核心模块处理静态/动态资源请求)组成
核心模块:处理静态资源的类 和 处理动态请求的类(后者负责调用servlet) - javax.servlet.http.HttpServlet
HttpServlet继承了GenericServlet,而GenericServlet实现Servlet接口;
可见HttpServlet包含了Servlet的方法,但是HttpServlet更适用于http协议;
=> servlet的相关规范,都有一个对应的http版本;从第二章到第三章的类,基本就是由servlet规范上升到其http版本 - javax.servlet.http.HttpServletRequest、HttpServletResponse
位于javax.servlet.http包下;
与ServletRequest的区别在于:HttpServletRequest符合http协议(ch02中实现的前一个接口,ch03中实现的后一个接口)
杂七杂八
- Servlet与jdk的关系
1.servlet只是http和后端java应用程序交互的一套接口规范。看做一个特殊的java类即可,可以在jdk下编译运行;
2. jdk1.8以后没有javax.servlet包,不过在tomcat下可以找到;