zoukankan      html  css  js  c++  java
  • 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;  
        }  
    }
    
  • 相关阅读:
    Network (poj1144)
    C. Hongcow Builds A Nation
    ZYB loves Xor I(hud5269)
    D. Chloe and pleasant prizes
    Game(hdu5218)
    约瑟夫环的递推方法
    Misaki's Kiss again(hdu5175)
    Exploration(hdu5222)
    B. Arpa's weak amphitheater and Mehrdad's valuable Hoses
    C. Arpa's loud Owf and Mehrdad's evil plan
  • 原文地址:https://www.cnblogs.com/the-fool/p/11054189.html
Copyright © 2011-2022 走看看