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


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Tomcat是一个Java Servlet容器,用于处理HTTP请求。它通过一系列的组件和功能来实现对请求的处理。其中,连接器和映射器是实现Tomcat请求路径与虚拟站点及Servlet之间的映射的关键组件。 连接器是Tomcat的一个组件,用于接收来自客户端的HTTP请求,并将请求传递给Tomcat服务器。当接收到一个HTTP请求后,连接器会解析请求中的路径信息,并将请求路径传递给映射器。 映射器是另一个重要的组件,用于将请求路径映射到对应的虚拟站点或Servlet。它通过解析请求路径,并与配置文件中的映射规则进行匹配,来确定请求应该由哪个虚拟站点或Servlet处理。映射规则通常是通过配置文件(如web.xml和Tomcat的server.xml)进行定义的。 在Tomcat启动时,它会加载并解析这些配置文件,并根据配置中的规则建立请求路径与虚拟站点或Servlet的映射关系。当一个请求到达时,映射器就会根据这些映射关系将请求转发到相应的处理组件(如Servlet)。 总结起来,Tomcat实现请求路径的查找和处理是通过连接器接收请求,映射器根据配置文件中的映射规则确定请求应该由哪个虚拟站点或Servlet处理。这样,Tomcat能够根据请求路径找到对应的虚拟站点,并将请求传递给相应的Servlet进行处理。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [tomcat的工作原理](https://blog.csdn.net/dongcheng_2015/article/details/117091790)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值