tomcat实现
2024-09-01 02:14:29
转载地址: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;
}
}
最新文章
- web安全——代理(nginx)
- python 的特殊方法 __str__和__repr__
- 网络存储技术介绍(2) ( based on zt)
- Orchard 候补神器说明
- 4日6日--Math的常用方法
- 14. leetcode 383. Ransom Note
- Ubuntu16.04安装RealSense SR300驱动
- OI暑假集训游记
- 【English】20190415
- nc(NetCat)命令
- 使用echart 做出数据折线图
- 使用npm安装appium时的坑
- HDU 5297
- hdu6273 线性差分
- linux系统--磁盘管理命令(二)
- PAT 1026 程序运行时间(15)(C++&Java&Python)
- springboot-32-使用mvc测试
- bzoj2817[ZJOI2012]波浪
- 使用css实现特殊标志或图形
- 001-Bitcoin比特币与BlockChain区块链技术
热门文章
- DDD实战2 创建领域基础类库项目
- python 教程 第一章、 简介
- 常见信号的模拟仿真(matlab)(spike signal)
- (记录)mysql分页查询,参数化过程的坑
- WinForm和WPF颜色对象的转换
- MVC linq执行顺序
- WPF 简单打印
- Debug权限提升
- SQLSTATE[HY000]: General error: 1205 Lock wait timeout exceeded; try restarting transaction 解决方法
- Tinyhttpd for Windows(学习型的项目,才500多行代码)