转载地址: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一个BUG造成CLOSE_WAIT

    之前应该提过,我们线上架构整体重新架设了,应用层面使用的是Spring Boot,前段日子因为一些第三方的原因,略有些匆忙的提前开始线上的内测了.然后运维发现了个问题,服务器的HTTPS端口有大量的C ...

  2. docker——容器安装tomcat

    写在前面: 继续docker的学习,学习了docker的基本常用命令之后,我在docker上安装jdk,tomcat两个基本的java web工具,这里对操作流程记录一下. 软件准备: 1.jdk-7 ...

  3. Tomcat shutdown执行后无法退出进程问题排查及解决

    问题定位及排查 上周无意中调试程序在Linux上ps -ef|grep tomcat发现有许多tomcat的进程,当时因为没有影响系统运行就没当回事.而且我内心总觉得这可能是tomcat像nginx一 ...

  4. 记一次tomcat线程创建异常调优:unable to create new native thread

    测试在进行一次性能测试的时候发现并发300个请求时出现了下面的异常: HTTP Status 500 - Handler processing failed; nested exception is ...

  5. Linux CentOS 配置Tomcat环境

    一.下载Tomcat 下载Tomcat方式也有两种,可以参考我的前一篇博文Linux CentOS配置JDK环境,这边就不再赘述. 二.在Linux处理Tomcat包 1.创建tomcat文件夹 mk ...

  6. 在Linux虚拟机下配置tomcat

    1.到Apache官网下载tomcat http://tomcat.apache.org/download-80.cgi 博主我下载的是tomcat8 博主的jdk是1.8 如果你们的jdk是1.7或 ...

  7. tomcat开发远程调试端口以及利用eclipse进行远程调试

    一.tomcat开发远程调试端口 方法1 WIN系统 在catalina.bat里:  SET CATALINA_OPTS=-server -Xdebug -Xnoagent -Djava.compi ...

  8. Eclipse中启动tomcat报错java.lang.OutOfMemoryError: PermGen space的解决方法

    有的项目引用了太多的jar包,或者反射生成了太多的类,异或有太多的常量池,就有可能会报java.lang.OutOfMemoryError: PermGen space的错误, 我们知道可以通过jvm ...

  9. mac下安装及配置tomcat

    mac下的软件不像windows下的程序那样写注册表,对于tomcat的安装来说,在mac下是名符其实的绿色软件,具体操作如下: 1.到 apache官方主页 下载完整 tar.gz文件包.(没有专门 ...

  10. 设置tomcat远程debug

    查看端口占用情况命令: netstat -tunlp |grep 8000 tomcat 启动远程debug: startup.sh 中的最后一行 exec "$PRGDIR"/& ...

随机推荐

  1. iOS 5.1.1 设备不能安装AdHoc问题版本号

    之前苹果更新了审计规范,要求必须支持64通过苹果的审核权限位架构的应用.     但运营商表示反馈.使用iOS5.1.1该系统无法安装我们的包Adhoc版本号.     认为非常莫名.由于我们在Dep ...

  2. hadoop2.4.1的ftpserver建立

    对于公司框架hadoop+hive,hive通过建立外部表(EXTERNAL TABLE)可以直接识别hdfs档,直接那假说本地文件hdfs文件系统.hive. 这期间须要一个ftp软件,能够沟通本地 ...

  3. 简明Python3教程 17.更多

    简介 迄今为止我们已经学习了python中的大多数常用知识.本章中我们会接触到更多的知识,使得我们更全面的掌握python. 传递元组 你是否希望过从函数返回两个不同的值?做到这点使用元组即可. &g ...

  4. 去除WPF中3D图形的锯齿

    原文:去除WPF中3D图形的锯齿 理论上讲PC在计算3D图形的时候是无法避免不出现锯齿的,因为3D图形都是又若干个三角形组成,如果3D图形想平滑就必须建立多个三角形,你可以想象一下正5边形和正100边 ...

  5. Qt on Android 资源文件系统qrc与assets

    使用 Qt 为 Android 开发应用时,有时我们的应用会携带一些资源文件,如 png . jpg 等,也可能有一些配置文件,如 xml 等,这些文件放在哪里呢?有两种方式:qrc和assets,咱 ...

  6. 算法(algorithm)、模型(model)与框架(framework)

    模型对应的数学公式,公式中往往有待学习得到的参数,因此在进行训练或者学习时,首先初始化这部分参数(0 或标准正太分布): 学习之前的初始化:initial model: 学习完成之后的模型:final ...

  7. 好玩的WPF第四弹:用Viewport2DVisual3D实现3D旋转效果

    原文:好玩的WPF第四弹:用Viewport2DVisual3D实现3D旋转效果 版权声明:转载请联系本人,感谢配合!本站地址:http://blog.csdn.net/nomasp https:// ...

  8. 专访Jeffrey Richter:Windows 8是微软的重中之重

    Jeffrey Richter 以其多本 Windows 核心技术的经典著作而闻名,同时,他深入掌握微软的 .NET 等一系列核心技术,他所创办的 Wintellect 公司与微软有密切的合作关系,他 ...

  9. byte[] 左移和右移

    public static class ex { public static byte[] RightShift(this byte[] ba, int n) { ) { return ba.Left ...

  10. C#最简单的文本加密

    #region AES加密 public static byte[] TextEncrypt(string content, string secretKey) { byte[] data = Enc ...