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;  
        }  
    }
    


  • 相关阅读:
    NC6开发配置流程
    触发器
    U8采购订单联查采购入库单
    sqlserver 游标
    windows服务 定时任务
    ORACLE 导入导出
    laravel 在模板中使select保存的值下单选中
    laravel 中request
    laravel中 url() route() URL::asset()
    laravel 中 后台管理的 路由设计
  • 原文地址:https://www.cnblogs.com/the-fool/p/11054174.html
Copyright © 2011-2022 走看看