转载地址: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;
}
}

【转载】tomcat原理的更多相关文章

  1. TOMCAT原理详解及请求过程(转载)

    转自https://www.cnblogs.com/hggen/p/6264475.html TOMCAT原理详解及请求过程 Tomcat: Tomcat是一个JSP/Servlet容器.其作为Ser ...

  2. Tomcat 原理篇

    TOMCAT 原理篇一.Tomcat 组成(Tomcat 由以下组件组成) 1.server a) Server是一个Catalina Servlet容器: b) Server 可以包含一个或多个se ...

  3. tomcat原理解析(一):一个简单的实现

    tomcat原理解析(一):一个简单的实现 https://blog.csdn.net/qiangcai/article/details/60583330 2017年03月07日 09:54:27 逆 ...

  4. tomcat原理分析与简单实现

    tomcat原理分析与简单实现 https://blog.csdn.net/u014795347/article/details/52328221 2016年08月26日 14:48:18 卫卫羊习习 ...

  5. [转载]SSD原理与实现

    [转载]SSD原理与实现 这里只mark一下,对原论文讲解的很好的博文 https://zhuanlan.zhihu.com/p/33544892 这里有一个关于SSD的很好的程序实现,readme里 ...

  6. Tomcat原理剖析

    Tomcat原理学习 理解Tomcat工作原理 Tomcat的概念及启动原理浅析 Tomcat系统架构与设计模式

  7. [转载] Thrift原理简析(JAVA)

    转载自http://shift-alt-ctrl.iteye.com/blog/1987416 Apache Thrift是一个跨语言的服务框架,本质上为RPC,同时具有序列化.发序列化机制:当我们开 ...

  8. [转载] ConcurrentHashMap原理分析

    转载自http://blog.csdn.net/liuzhengkang/article/details/2916620 集合是编程中最常用的数据结构.而谈到并发,几乎总是离不开集合这类高级数据结构的 ...

  9. tomcat原理(二)

    一.打包JavaWeb应用 在Java中,使用"jar"命令来对将JavaWeb应用打包成一个War包,jar命令的用法如下:

随机推荐

  1. 使用python移动飞信模块发送短信

    作者:miaoo 1.应用场景 由于自己做的一个系统需要用到发送短信到自己手机的功能,于是搜索了一下,发现了一个通过移动飞信通道发送短信开源库:PyFetion PyFetion 模拟实现了飞信的通信 ...

  2. C ++ 17 技术上已经完成,C ++ 20 也在路上(有路线图)

    在前不久结束的冬季 ISO C ++标准会议(Kona)上,C ++ 17 宣布在技术上已完成,仅剩下一些 ISO 相关的繁文缛节,即将提交至最终的 ISO 投票表决.该会议由 Plum Hall 和 ...

  3. WPF-Button|IsCancel&&IsDefault

    原文:WPF-Button|IsCancel&&IsDefault Button个别属性 <Button ToolTip="ESC" IsDefault=&q ...

  4. Linux crontab 语法和具体的例子

    基本格式 : * * * * * command 分 时 日 月 周 命令 第1列表示分钟1-59 每分钟用*或者 */1表示 第2列表示小时1-23(0表示0点) 第3列表示日期1-31 第4列表示 ...

  5. 从一段简单算法题来谈二叉查找树(BST)的基础算法

    先给出一道很简单,喜闻乐见的二叉树算法题: 给出一个二叉查找树和一个目标值,如果其中有两个元素的和等于目标值则返回真,否则返回假. 例如: Input: 5 / \ 3 6 / \ \ 2 4 7 T ...

  6. WPF判断两个PNG图片是否碰撞

    这个方法有几个前提 1.两个Image必须在一个Canvas中 2.两个Image的Canvas.Top和Canvas.Left必须赋值 上一篇讲了判断一个PNG图片某个点是否透明 这个基本类似的方法 ...

  7. 零元学Expression Blend 4 - Chapter 32 简单轻松的学会如何使用Visual States(上)

    原文:零元学Expression Blend 4 - Chapter 32 简单轻松的学会如何使用Visual States(上) Visual State Manager中文翻译为视觉状态管理器,这 ...

  8. CS224n笔记一:开端

    何为自然语言处理 自然语言处理的目标是让计算机处理或者"理解"自然语言,以完成有意义的任务,如QA等. 自然语言处理涉及的层次 输入有两个来源:语音和文本,所以第一级是语音识别,O ...

  9. MySQL操作详解

    创建并使用数据库 查看服务器上的数据库:SHOW DATABASES; 创建数据库:CREATE DATABASE <数据库名>; 指明使用何数据库:USE <数据库名> 创建 ...

  10. QT5.8 VS2017 编译教程(可以使用VS2017 XP兼容包)

    1.下载QT5.8源码 这个我不做过多解释. 2.安装使用的环境 visual studio 2017  Python Perl  Ruby 安装好,并配置好环境PATH变量. 3.修改错误代码 错误 ...