模拟带Servlet技术的HTTP服务器的Java实现
来源:互联网 发布:老郎酒淘宝店 编辑:程序博客网 时间:2024/05/02 01:57
上一篇文章说道, Web发展初期, 用户只能查看静态页面. 随着Web发展,只能显示静态页面的web显然已经不能满足大众的需求,所以出现了CGI和用Java编写的Servlet程序.
Servlet可以根据用户的请求动态的生成html页面,然后发给浏览器.
下面模拟一下这个过程:
- HttpServer2类:服务器类,负责启动Http服务.
- Servlet接口: 定义Servlet服务接口.
- HelloServlet类:实现Servlet接口.用户提交请求时,HttpServer2将请求发给HelloServlet处理.处理完后动态生成页面返回给用户.
- ServletRequest类: 封装用户的请求.交给HelloServlet处理.
- ServletResponse类: 封装返回的响应.由HelloServlet返回.
HttpServer2类
服务器类,负责启动Http服务.
import java.io.*;import java.net.*;public class HttpServer2 { private static final int port = 8088; private ServerSocket serverSocket = null; public HttpServer2() throws IOException { serverSocket = new ServerSocket(port); System.out.println("HTTPServer startup OK..."); } public void work() throws IOException { while (true) { try { Socket socket = serverSocket.accept(); ServletRequest request = new ServletRequest( socket.getInputStream()); ServletResponse response = new ServletResponse( socket.getOutputStream()); System.out.println("Receive request:\n" + request.getRequest()); String servletName = request.getServletName(); //动态生成servlet Servlet servlet = (Servlet) Class.forName(servletName) .newInstance(); //调用servlet接口 servlet.init(); servlet.service(request, response); servlet.destroy(); socket.close(); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } } public static void main(String[] args) throws IOException, InterruptedException { HttpServer2 httpServer = new HttpServer2(); httpServer.work(); }}
Servlet接口
定义Servlet服务接口.
public interface Servlet { public void init(); public void service(ServletRequest req, ServletResponse res) throws Exception; public void destroy();}
HelloServlet类
实现Servlet接口.用户提交请求时,HttpServer2将请求发给HelloServlet处理.处理完后动态生成页面返回给用户.
public class HelloServlet implements Servlet { @Override public void init() { // TODO Auto-generated method stub System.out.println("servlet init "); } @Override public void service(ServletRequest req, ServletResponse res) throws Exception { // TODO Auto-generated method stub String contentType = req.getContentType(); String param = req.getParam(); //组装HTTP响应头 String header = res.assembleResponseHeader(contentType); //组装HTTP响应正文 String body = res.assembleResponseBody(param); //返回响应 res.write(header + body); } @Override public void destroy() { // TODO Auto-generated method stub System.out.println("servlet destroy "); }}
ServletRequest类
封装用户的请求.交给HelloServlet处理.
import java.io.IOException;import java.io.InputStream;public class ServletRequest { private String request; private InputStream socketIn; private String URI; private String contentType; private String param; public ServletRequest(InputStream socketIn) throws IOException { // TODO Auto-generated constructor stub this.socketIn = socketIn; this.request = _getRequest(); this.URI = _getURI(); this.contentType = _getContentType(); this.param = _getParam(); } public String getRequest() { return request; } public String getURI() { return URI; } public String getContentType() { return contentType; } public String getParam() { return param; } private String _getRequest() throws IOException { int size = socketIn.available(); byte[] requestBuff = new byte[size]; socketIn.read(requestBuff); return new String(requestBuff); } //获得要调用servlet的类名 public String getServletName(){ return URI.substring(URI.indexOf("/") + 1, URI.indexOf("?")); } private String _getURI() { String firstLine = request.substring(0, request.indexOf("\r\n")); String[] parts = firstLine.split(" "); return parts[1]; } private String _getContentType() { /* 决定HTTP响应正文的类型 */ return "html"; }//获得请求参数 private String _getParam() { String paramString = URI.substring(URI.indexOf("?") + 1); String[] paramPairs = paramString.split("="); return paramPairs[1]; }}
ServletResponse类
封装返回的响应.由HelloServlet返回.
import java.io.IOException;import java.io.OutputStream;public class ServletResponse { private OutputStream outputStream; public ServletResponse(OutputStream outputStream) { // TODO Auto-generated constructor stub this.outputStream = outputStream; } public String assembleResponseHeader(String contentType) { /* 创建HTTP响应结果 */ // HTTP响应的第一行 String responseFirstLine = "HTTP/1.1 200 OK\r\n"; // HTTP响应头 String responseHeader = "Content-Type:" + contentType + "\r\n\r\n"; return responseFirstLine + responseHeader; } public String assembleResponseBody(String param) { String content = "<body><h1>Hello:" + param + "</h1></body>"; String title = "<head><title>HelloWorld</title></head>"; String body = "<html>" + title + content + "</html>"; return body; } public void write(String res) throws IOException { outputStream.write(res.getBytes()); }}
测试
在chrome浏览器输入http://localhost:8088/HelloServlet?username=tom.
即用户请求的参数是tom,要调用HelloServlet. (在实际的servlet实现中,是用一个web.xm配置文件实现URI到servlet的映射.)
servlet解析出来后组装成html返回给浏览器.显示为Hello:tom
1 0
- 模拟带Servlet技术的HTTP服务器的Java实现
- http 服务器的实现(java)
- java servlet----模拟一个简单的tomcat服务器
- java实现一个简单的HTTP服务器,带打开网页和计算功能
- Java实现自己的Servlet服务器
- java nio http服务器(3)简单的Servlet容器
- 一个Java Socket带多线程的http服务器
- 使用Java实现简易的HTTP服务器
- java实现的HTTP简易服务器
- 简单HTTP服务器的Java实现
- JAVA 实现 简单的 HTTP服务器
- HTTP长连接实现“服务器推”的技术
- Apache服务器使用的Java servlet的实现
- 用java的servlet实现http访问mongodb中的文件
- Java Servlet的Filter 技术
- Servlet实现带进度条的文件上传
- JAVA模拟客户机与服务器实现简易的TCP通讯
- 客户/服务器Java的模拟
- Android Studio 常用功能介绍
- 关于 i++和++i 以及for循环
- opencv avi视频播放带进度条
- git服务器在linux搭建在window下提交
- Java基础--多线程4
- 模拟带Servlet技术的HTTP服务器的Java实现
- log4j的用法
- Activity 和 intent FLAG 集合
- 使用API进行发运确认并运行Interface Trip Stop
- DCE打印路由时某种情况下的gdb结果
- android学习笔记四——Service
- 性能均衡实用 Thinkpad E450-2CD热卖
- 技术演绎之 [ java ] 程序解析
- 关于后盾网yii框架的学习小结(9)--修改密码的方法,闪存