手动实现tomcat服务器的流程:
分析具体的实现步骤:
1,浏览器和后端服务如何实现通信,首先传输的数据要遵循http协议,通过tcp也就是我们常说的套接字编程来实现,具体的底层数据传输肯定就是我们的输入输出流来实现了。
2,我们再来看后台服务器的实现逻辑,首先我们要定义两个对象,一个request,一个response分别用来存放请求的参数以及返回的参数。
3,创建一个ServerSocket,等待浏览器的连接和数据传输,当通过输入流读取到数据,放入到request对象。
4,浏览器的请求类型一般分为get和post两种,所以我们需要一个mpper映射类来根据浏览器的访问路径来分发具体处理的类或者方法。
5,处理之后获取处理的结果,并放到response对象,通过输出流返回给浏览器。
下面是具体的代码实现:
1,reques类
package com.liuyi; import java.io.InputStream; public class MyRequest { //请求方法 GET/POST private String requestMethod; 请求地址 String requestUrl; public MyRequest(InputStream inputStream) throws Exception{ 缓冲区域 byte[] buffer = new byte[1024]; 读取数据的长度 int len = 0; 定义请求的变量 String str = null; if((len = inputStream.read(buffer))>0){ str = new String(buffer,0,len); } GET / HTTP/1.1 String data = str.split("\n")[0]; String[] params = data.split(" "); this.requestMethod = params[0this.requestUrl = params[1]; } public String getRequestMethod() { return requestMethod; } void setRequestMethod(String requestMethod) { this.requestMethod = String getRequestUrl() { requestUrl; } setRequestUrl(String requestUrl) { this.requestUrl = requestUrl; } }
2,response类
java.io.OutputStream; MyResponse { OutputStream outputStream; MyResponse(OutputStream outputStream) { this.outputStream = outputStream; } void write(String str) Exception{ StringBuilder builder = new StringBuilder(); builder.append("HTTP/1.1 200 OK\n") .append("Content-Type:text/html\n") .append("\r\n") .append("<html>") .append("<body>") .append("<h1>"+str+"</h1>") .append("</body>") .append("</html>"this.outputStream.write(builder.toString().getBytes()); .outputStream.flush(); .outputStream.close(); } }
3,Mapping类,定义请求路径和请求处理类的关系
java.util.HashMap; MyMapping { static HashMap<String,String> mapping = new HashMap<String,String>(); static {
//这里请改成自己servlet实现类的完全限定名 mapping.put("/mytomcat","com.liuyi.MyServlet"); } public HashMap<String,1)"> getMapping(){ mapping; } }
4,定义HpptServlet抽象类,实现get和post的分发(根据不同的请求方式调用不同的方法进行处理)
com.mashibing; abstract MyHttpServlet { 定义常量 static final String METHOD_GET = "GET"; final String METHOD_POST = "POST"; void doGet(MyRequest request,MyResponse response) Exception; void doPost(MyRequest request,1)"> Exception; /** * 根据请求方式来判断调用哪种处理方法 * @param request * response */ void service(MyRequest request,1)">if(METHOD_GET.equals(request.getRequestMethod())){ doGet(request,response); }else (METHOD_POST.equals(request.getRequestMethod())){ doPost(request,response); } } }
5,定义自己的servlet
class MyServlet extends MyHttpServlet{ @Override Exception { response.write("mytomcat get"); } @Override Exception { response.write("post tomcat"); } }
6,定义服务端的接受程序,接受socket请求
java.io.InputStream; java.io.OutputStream; java.net.ServerSocket; java.net.Socket; MyServer { * 定义服务端的接受程序,接受socket请求 * port void startServer(int port) Exception{ 定义服务端套接字 ServerSocket serverSocket = ServerSocket(port); 定义客户端套接字 Socket socket = while (true){ socket = serverSocket.accept(); 获取输入流和输出流 InputStream inputStream = socket.getInputStream(); OutputStream outputStream = socket.getOutputStream(); 定义请求对象 MyRequest request = MyRequest(inputStream); 定义响应对象 MyResponse response = MyResponse(outputStream); String clazz = MyMapping().getMapping().get(request.getRequestUrl()); if(clazz!=){ Class<MyServlet> myServletClass = (Class<MyServlet>)Class.forName(clazz); 根据myServletClass创建对象 MyServlet myServlet = myServletClass.newInstance(); myServlet.service(request,response); } } } 运行启动 main(String[] args) { try { startServer(10086); } catch (Exception e) { e.printStackTrace(); } } }
总结:
本案例只是实现了简单的tomcat和servlet,仅仅只是为了让我们学习servlet和tomcat没有那么多的疑惑,学起来会更容易。实际工作中当然也不会这样去写,
但是如果你认值把这个代码敲一遍,并理解为什么这样写,那么对你学习java web肯定会有很大的帮助。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。