Tomcat服务器是一个servlet服务器,他http协议与客户段进行通讯。通常这个客户端是浏览器,但也可以是自定义的输出。Http协议是基于可靠的tcp协议来通讯的。在Java 的编程中,tcp协议的基本通讯对象是socket和serversocket,当然还有基于加密的通讯机制,为sslsocket和sslserversocket。本次的一个模拟客户段服务器机制使用ssl系列对象实现。应用层协议Http虽说是基于传输层的tcp,但是http是一种请求响应协议。它有自己的请求和响应规范。本系列主要说明tomcat的源码组织结构,并不深入讨论客户端,对浏览器等客户端不做说明。
1、请求格式:
⑴POST/GET(等method) URI HTTP/1.1(或其他版本号)
⑵请求头部
⑶请求主体
注意:请求头部和请求主题之间有一个空行
2、响应格式:
⑴HTTP/1.1(版本号) 200(等返回码) OK(返回码描述)
⑵响应头部
⑶响应主体
注意:响应头部和响应主体之间同样存在一个空行
3、servlet.作为servlet容器,当然跑不了servlet了。先看看Java 标准规范中的servlet所提供的服务。
Servlet的全路径名为javax.servlet.Servlet.Servlet类总共有5个方法,其中有3个生命周期方法,另2个是一些config信息等,如下:
void init(ServletConfig config):初始化时被容器所调用,只会调用一次
void service(ServletRequest req, ServletResponse res):每次请求调用一次
void destroy():容器被关闭时,或servlet对象被销毁时
String getServletInfo():获取servlet信息
ServletConfig getServletConfig():获取config信息
4、servlet容器工作
⑴加载servlet,并调用init方法实例化servlet
⑵对每个请求构造service方法需要的req和res参数,并在请求是调用service方法
⑶调用destroy方法,卸载servlet
5、实例。实例的基本类图如下:
⑴先看最简单的HelloWorldServlet类,这个类是最基础的servlet,也是我们经常用的servlet:这里只实现了service方法
public void service(ServletRequest req, ServletResponse res){ System.out.println(“#####execute helloworld servlet#####”); PrintWriter writer = res.getPrintWriter(); writer.println(“hello world”); }
⑵看看request和response类
先看httpresponse类,httpresponse的主要接收输出流,然后构造response返回需要的一系列参数对象,主要实现了他的getwriter方法。
⑶ServletProxy代理,他负责对servlet和静态页面做转换并回应,以下是execute体:
String uri = req.getURI(); if (uri.indexOf("Servlet") != -1) { ClassLoader loader = ServletProxy.class.getClassLoader(); String className = uri.replaceAll("/", ""); Servlet servlet = (Servlet) loader.loadClass(className).newInstance(); servlet.service(request, response); } else { PrintWriter writer = response.getWriter(); File file = new File(HttpServer.WEB_ROOT, uri); fis = new FileInputStream(file); int ch = fis.read(buffer)); writer.println(new String(buffer, 0, ch)); }
⑷然后最重要的是我们的httpserver了,httpserver的main的主要做的事情就是如下的代码了:
ServerSocket serverSocket = null; int port = 8080; serverSocket = new ServerSocket(port, 1, InetAddress.getByName("127.0.0.1")); while (!shutdown) { try { Socket socket = serverSocket.accept(); InputStream input = socket.getInputStream(); OutputStream output = socket.getOutputStream(); HttpRequest httpRequest = new HttpRequest(input); HttpResponse httpResponse = new HttpResponse(output); new ServletProxy().execute(httpRequest, httpResponse); socket.close(); } catch (Exception ex) { } }
⑸至次一个简易的tomcat就制作完成了,下面写个测试的html和servlet测试下
Html代码,放在工程目录的webroot目录下:
<body> <form action="/eg02.HelloWorldServlet" method="post"> name:<input type="text" name="name" value="" /><br> <input type="submit" value="submit" /> </form> </body>
Servlet代码也更简单,继承自servlet类,只实现service方法。
public void service(ServletRequest req, ServletResponse res) throws Exception{ String name = req.getParameter("name"); PrintWriter writer = res.getWriter(); writer.println("Hello " + name + ",First example helloworld"); }
最后我们来看下测试的结果吧:打开浏览器,输入http:127.0.0.1:8080/index.html
在输入框输入smurfs,点击提交后
测试完成,至此,大功告成。