模拟tomcat运行
tomcat主启动类
注册一个Socket服务来监听是否有访问此端口(tomcat默认8080)
java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
public class MYtomcat {
private static String URL = "";
public static ServerSocket serverSocket=null;
private static Map<String, String> map =new HashMap<String, String>();
private static ServletReAxi reAxi = new ServletReAxi();
private static ServletRsAxi rsAxi = new ServletRsAxi();
//预先加载的资源
static {
//设置默认访问静态资源
map.put("index", "index.html");
Properties properties = new Properties();
try {
properties.load(new FileInputStream(ServletRsAxi.WEB_ROOT+"\\se.properties"));
Set set = properties.keySet();
System.out.println(set);
Iterator iterator =set.iterator();
for (Object object : set) {
String value = (String) properties.get(object);
map.put((String)object, value);
}
} catch (Exception e) {
e.printStackTrace();
}
}
//创建端口
public ServerSocket getSersock() {
if(serverSocket == null) {
try {
serverSocket = new ServerSocket(8081);
} catch (IOException e) {
e.printStackTrace();
}
}
return serverSocket;
}
public static void main(String[] args) throws Exception {
Thread thread1 = new Thread() {
@Override
public void run() {
try {
MYtomcat.load(new MYtomcat().getSersock());
} catch (Exception e) {
e.printStackTrace();
}
}
};
thread1.start();
}
public static void load(ServerSocket serverSocket) throws Exception {
System.out.println(map);
Socket socket = null;
OutputStream os =null;
InputStream is = null;
OutputStreamWriter osw = null;
System.out.println(ServletRsAxi.WEB_ROOT);
while(true) {
socket = serverSocket.accept();
os =socket.getOutputStream();
osw = new OutputStreamWriter(os,"UTF-8");
is = socket.getInputStream();
reAxi.input =is;
rsAxi.os = osw;
parse(is);//获取http协议,截取客户端要访问的资源名称,并将名称赋值给url
if((URL.length() == 1 && URL.contains("/"))||URL.length() < 2) {
URL ="/"+map.get("index");
System.out.println(URL);
}
if(URL.contains(".")) {
System.out.println("静态资源");
senddStaticResoure(osw);//发送资源
}else {
System.out.println("动态资源");
sendreRoure(osw,is);
}
osw.close();
is.close();
os.close();
socket.close();
}
}
//发送动态资源
private static void sendreRoure(OutputStreamWriter os,InputStream is) throws Exception {
System.out.println("动态资源截断/前:"+URL);
String indexOf = URL.substring(1, URL.length());
System.out.println("动态资源截断/后:"+indexOf);
if(map.containsKey(indexOf)) {
rsAxi.head();
String value = map.get(indexOf);
Class clazz = Class.forName(value.trim());
Object newInstance = clazz.newInstance();
Method init = clazz.getMethod("init");
Method destry = clazz.getMethod("destry");
Method service = clazz.getDeclaredMethod("service",ServletRsAxi.class,ServletReAxi.class);
init.invoke(newInstance);
service.invoke(newInstance, rsAxi,reAxi);
destry.invoke(newInstance);
}else {
rsAxi.oror();
}
}
//发送静态资源
private static void senddStaticResoure(OutputStreamWriter os) throws IOException {
rsAxi.senddStaticResoure(URL);
}
private static void parse(InputStream osw) throws IOException {
URL = reAxi.parseURl();
System.out.println(reAxi.getMap().size());
}
}
ServletReAxi类 (Request)
java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
public class ServletReAxi {
public static InputStream input;
public static String Encoder="UTF-8";
public static Map<String, String[]> map =new HashMap<String, String[]>();
public static String method;
public static String Htmlall;
/**
* 获取浏览器发送的全部数据
* @return
* @throws IOException
*/
public StringBuffer getAll() throws IOException {
StringBuffer contextBuffer =new StringBuffer(2048);
byte[] buffer = new byte[2048];
int i = -1;
i = input.read(buffer);
for (int j = 0; j < i; j++) {
contextBuffer.append((char)buffer[j]);
}
String string = contextBuffer.toString();
if(string.length()>4) {
method =string.substring(0,4).trim();
}
Htmlall = contextBuffer.toString();
return contextBuffer;
}
public String gethtmlall() {
return Htmlall;
}
public void SetURLEncoder(String str) {
Encoder = str;
}
public String getMethod() {
return method;
}
//获取带参完整的url
public String parseURl(StringBuffer string) {
String url = "";
for (int i = 0; i < string.length(); i++) {
if(string.charAt(i) == ' ') {
System.out.println(string.charAt(i));
for (int j = i+1; j < string.length(); j++) {
if(string.charAt(j) == ' ') {
break;
}
url+=string.charAt(j);
}
break;
}
}
return url;
}
//获取不带参数的url
public String parseURl() throws IOException {
StringBuffer all = getAll();
String parseURl = parseURl(all);
int indexOf = parseURl.indexOf("?");
String[] split2 = parseURl.split("=");
System.out.println("方法:"+method);
if(indexOf!=-1&&split2.length>1)
{
String substring = parseURl.substring(0,indexOf);
String pString=null;
try {
pString = parseURl.substring(indexOf+1,parseURl.length());
} catch (Exception e) {
System.out.println("get请求参数不正确");
}
setMap(pString);
return substring;
}
if("POST".equals(method)) {
String[] split = all.toString().split("\r\n");
String string;
try {
string = split[split.length-1];
} catch (Exception e) {
string=null;
System.out.println("post请求参数不正确");
}
System.out.println("post参数:"+string);
setMap(string);
}
return parseURl;
}
public Map<String, String[]> getMap() {
return map;
}
//将参数存入map
private void setMap(String str) {
if(str!=null) {
String[] split = str.split("&");
for (int i = 0; i < split.length; i++) {
String[] sp = split[i].split("=");
String a= sp[1];
for (int j = i+1; j < split.length; j++) {
String[] split3 = split[i].split("=");
String[] split4 = split[j].split("=");
String string2 = split3[0];
String string3 = split4[0];
if(string2.equals(string3)){
String[] split2 = split[j].split("=");
a+=","+split2[1];
i=j;
}
}
String[] split2 = split[i].split("=");
map.put(split2[0], a.split(","));
}
}
}
public String getName(String str) {
String[] strings = map.get(str);
if(strings != null) {
try {
//解码并返回
return URLDecoder.decode(strings[0], Encoder);
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
return null;
}
public String[] getNames(String str) {
String[] strings = map.get(str);
if(strings != null) {
return strings;
}
return null;
}
}
ServletRsAxi 类 (Response)
java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
public class ServletRsAxi {
public static OutputStreamWriter os;
public static String contentType="text/html;charset=UTF-8";
public static String WEB_ROOT = System.getProperty("user.dir")+"\\"+"WebContent";//项目的绝对路径
private static String URL = "";
public void SetContentType(String str) {
contentType =str;
}
public void head() throws IOException {
os.write("HTTP/1.1 200 OK\n");//状态码
os.write("Content-Type:"+contentType+"\n");//编码格式,文件类型
os.write("Server:Axidetomcat/1.1\n");//服务器
os.write("\n\n");//空行
}
public void oror() throws IOException {
os.write("HTTP/1.1 404 not found\n");//状态码
os.write("Content-Type:text/html;charset=UTF-8\n");//编码格式,文件类型
os.write("Server:Axidetomcat/1.1\n");//服务器
os.write("\n\n");//空行
os.write("<html>");
os.write("<head>");
os.write("<style>");
os.write("h1{color:red;}");
os.write("</style>");
os.write("<title> 小王八犊子</title>");
os.write("</head>");
os.write("<body>");
os.write("<h1>小王八犊子,找不到页面!</h1>");
os.write("</body>");
os.write("</html>");
os.flush();
os.close();
}
//发送静态资源
public void senddStaticResoure(String URL) throws IOException {
char[] buffer = new char[2048];
FileInputStream fis =null;
File file = new File(WEB_ROOT,URL);
InputStreamReader is = null;
if(file.exists()) {
head();
fis =new FileInputStream(file);
is =new InputStreamReader(fis,"UTF-8");
int ch =is.read(buffer);
while(ch != -1) {
os.write(buffer,0,ch);
ch =is.read(buffer);
}
os.flush();
os.close();
}else {
oror();
}
}
public OutputStreamWriter getwriter() {
return os;
}
public String getpath() {
return WEB_ROOT;
}
}
Servlet 接口
java
1
2
3
4
5
6
7
8
9
10
package com.axi.servlet;
import java.io.InputStream;
import java.io.OutputStreamWriter;
public interface Servlet {
public void init();
public void service(ServletRsAxi rsAxi,ServletReAxi reAxi);
public void destry();
}
测试类
java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
package com.axi.servlet;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
public class Bservlet implements Servlet {
@Override
public void init() {
System.out.println("init...................");
}
@Override
public void service(ServletRsAxi rsAxi,ServletReAxi reAxi) {
System.out.println("service...................");
String name = reAxi.getName("user");
System.out.println(name);
try {
String all = reAxi.gethtmlall();
System.out.println(all);
rsAxi.getwriter().write("b========user"+name+"=========service");
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
@Override
public void destry() {
System.out.println("destry...................");
}
}





评论
登录后即可评论
分享你的想法,与作者互动
暂无评论