【转载】tomcat原理

转载地址:https://blog.csdn.net/u014795347/article/details/52328221?locationNum=2&fps=1

以下代码纯属本人复制,而且没复制全,并且没有进行手打,实在是不走心,在此贴上原文链接:

https://blog.csdn.net/u014795347/article/details/52328221?locationNum=2&fps=1

并再次对原作者表示感谢,其中url切割的正则有些许问题,以后会重新书写补充:

说下思路:

什么是容器?:我理解的就是对象实例化的载体,对象在容器中进行类加载与实例化,我们就能够访问内存中的对象啦~

实现方式?

简单来说就是:socket监听+xml读取标签+反射实例化对象

代码如下:

package com.test.catalina.run;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.net.ServerSocket;
import java.net.Socket;
/**
 * 这里只实现简单的参数获取与servlet类加载
 * 更深层次可以添加多线程,封装renquest,reponse,解析配置文件等等
 * @author Administrator这个地方原先是原作者的名字
 *
 */
public class CatalinaContainer {
	
	private int port=8090;
	private String address="localhost";
	
	private ServerSocket  serverSocket;
	public static void main(String[] args) {
		try {
			new CatalinaContainer ().start();
		} catch (IOException | InstantiationException e) {
			e.printStackTrace();
		}
	}
	
	//开启
	public void start() throws IOException, InstantiationException{
		serverSocket = new ServerSocket(port);
		while(true){
			Socket socket = serverSocket.accept();
			BufferedReader bReader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
			String line = bReader.readLine();
			 if (!(null==line)) {  
                 ClintRequestBean requestBean = new ClintRequestBean(line);  
                 System.out.println("客户端请求:"+requestBean.toReadString());  
                 System.out.println("请求参数[路径]:"+requestBean.getRequestParm().get("path"));  
                 System.out.println("请求参数[参数表]:"+requestBean.getRequestParm().get("attrs"));  
                 ClassLoader classLoader = ClassLoader.getSystemClassLoader();  
                 try {  
                     classLoader.loadClass("cn.wwyxxmiemie.littletomcat.exclass.ExClass");  
                     System.out.println("动态加载ExClass类--成功");  
                 } catch (ClassNotFoundException e) {  
                     e.printStackTrace();  
                     System.out.println("动态加载ExClass类--失败");  
                 }  
                 Class<?> exClass = null;  
                 try {  
                     exClass = Class.forName("cn.wwyxxmiemie.littletomcat.exclass.ExClass");  
                     System.out.println("动态初始化ExClass类--成功");  
                 } catch (ClassNotFoundException e) {  
                     e.printStackTrace();  
                     System.out.println("动态初始化ExClass类--失败");  
                 }  
                 Method method;  
                 try {  
                     method = exClass.getMethod("test", null);  
                     System.out.println("得到ExClass对象的"+method.getName()+"方法");  
                     try {  
                         System.out.println("执行ExClass对象的"+method.getName()+"方法");  
                         method.invoke(exClass.newInstance(), null);  
                     } catch (IllegalAccessException e) {  
                         e.printStackTrace();  
                     } catch (IllegalArgumentException e) {  
                         e.printStackTrace();  
                     } catch (InvocationTargetException e) {  
                         e.printStackTrace();  
                     }  
                 } catch (NoSuchMethodException e) {  
                     e.printStackTrace();  
                 } catch (SecurityException e) {  
                     e.printStackTrace();  
                 }  
             }  
             bReader.close();  
             socket.close();  
			
		}
		
	}
	
	
	
	
	
}

 

 

 

package com.test.catalina.run;

import java.util.HashMap;
import java.util.Map;

public class ClintRequestBean {
	//以一个请求举例:http://127.0.0.1/www/qqq/eee  
    private String protocol;//协议类型(eg:http)  
    private String protocolVersion;//协议版本(eg:1.1)  
    private String data;//请求数据(eg:/www/qqq/eee)  
    private String method;//请求方法:(eg:GET)  
      
    /** 
     * 客户端请求实体构造方法 
     * @param protocol 协议类型 (eg:http) 
     * @param protocolVersion 协议版本 (eg:1.1) 
     * @param data 请求数据 (eg:/www/qqq/eee)【必须以‘/’分隔】 
     * @param method 请求方法 (eg:GET) 
     */  
    public ClintRequestBean(String protocol, String protocolVersion, String data, String method) {  
        super();  
        this.protocol = protocol;  
        this.protocolVersion = protocolVersion;  
        this.data = data;  
        this.method = method;  
    }  
    /** 
     * 客户端请求实体构造方法 
     * @param request 请求链接,一般针对一条完整的http链接 
     */  
    public ClintRequestBean(String request){  
        super();  
        String [] requestString = request.split(" ");  
        this.method = requestString[0];  
        this.data = requestString[1];  
        String [] proAndVer = requestString[2].split("/");  
        this.protocol = proAndVer[0];  
        this.protocolVersion = proAndVer[1];  
    }  
      
    /** 
     * 转化为可读String用于分析请求 
     * @return 
     */  
    public String toReadString(){  
        return "ClintRequestBean [protocol=" + protocol + ", protocolVersion=" + protocolVersion + ", data=" + data  
                + ", method=" + method + "]";  
    }  
      
    /** 
     * 得到请求的参数 
     * @return map[请求路径|参数map] 
     */  
    public Map<String, Object> getRequestParm(){  
        Map<String,Object> map = new HashMap<>();  
        String [] parms =null;
        if(data.contains("\\?")){
        	parms = data.split("\\?");  
            map.put("path", parms[0]);
        }
          
        Map<String, String> attrs = new HashMap<>();
        String[] kvs =null;
        if(data.contains("&")){
        	kvs =parms[1].split("&");  
            for (String string : kvs) {  
                String [] kv = string.split("=");  
                attrs.put(kv[0], kv[1]);  
            }  
            map.put("attrs", attrs);  
        }
        
        return map;  
    }  
      
    public String getProtocol() {  
        return protocol;  
    }  
    public void setProtocol(String protocol) {  
        this.protocol = protocol;  
    }  
    public String getProtocolVersion() {  
        return protocolVersion;  
    }  
    public void setProtocolVersion(String protocolVersion) {  
        this.protocolVersion = protocolVersion;  
    }  
    public String getData() {  
        return data;  
    }  
    public void setData(String data) {  
        this.data = data;  
    }  
    public String getMethod() {  
        return method;  
    }  
    public void setMethod(String method) {  
        this.method = method;  
    }  
    @Override  
    public String toString() {  
        return this.method+" "+this.data+" "+this.protocol+"/"+this.protocolVersion;  
    }  
}


posted @ 2018-03-23 15:09  黑猫先生  阅读(109)  评论(0编辑  收藏  举报