前言
“tomcat根据request可以获取到所有和请求有关的信息,根据这个路径就去访问到了这个项目,然后通过你访问处理角色也就是indexServlet,这时候强大的反射就派上用场了,tomcat通过反射和工厂模式根据indexServlet这个名字,去创建servlet处理类
一、tomcat是什么?
当在一台机器上配置好Apache 服务器,可利用它响应HTML(标准通用标记语言下的一个应用)页面的访问请求。实际上Tomcat是Apache 服务器的扩展,但运行时它是独立运行的,所以当你运行tomcat 时,它实际上作为一个与Apache 独立的进程单独运行的。。
二、使用步骤
1.引入库
代码如下(示例):
import java.io.BufferedInputStream;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.DataInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.net.Socket;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
2.读入数据
代码如下(示例):
public class WorkThread implements Runnable {
private Socket socket;
public WorkThread(Socket socket) {
// TODO Auto-generated constructor stub
this.socket = socket;
}
@Override
public void run() {
// TODO Auto-generated method stub
try {
InputStream in = this.socket.getInputStream();
OutputStream out = this.socket.getOutputStream();
/**
* 访问数据
*/
String requestHeader = "";
BufferedReader br = new BufferedReader(new InputStreamReader(in));
String line = null;
while ((line = br.readLine()) != null && line.length() > 0) {
requestHeader += line + "\r\n";
}
/**
* 解析请求头
*
*/
String[] header = requestHeader.split("\r\n");
String url = header[0].split(" ")[1];
if (url.equals("/index.html")) {
File f = new File("index.html");
String fpath = f.getAbsolutePath();
System.out.println(fpath);
StringBuilder sb = new StringBuilder();
sb.append("HTTP/1.0 200 OK\r\n");
sb.append("Content-Type: text/html;charset=utf-8\r\n");
sb.append("X-Ua-Compatible: IE=Edge,chrome=1\r\n");
System.out.println(fpath);
BufferedReader reader = null;
StringBuffer sbf = new StringBuffer();// 创建字符串
reader = new BufferedReader(new FileReader(f));
String tempStr;
while ((tempStr = reader.readLine()) != null) {
sbf.append(tempStr);
}
reader.close();
sb.append("Content-length: ").append(sbf.toString().getBytes().length).append("\r\n");
sb.append("\r\n");
System.out.println(sb.append(sbf.toString()));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(out));
bw.write(sb.toString());
bw.flush();
} else if (url.equals("/tomcat.png")) {
StringBuilder sb = new StringBuilder();
sb.append("HTTP/1.0 200 OK\r\n");
sb.append("Content-Type: image/png\r\n");
sb.append("X-Ua-Compatible: IE=Edge,chrome=1\r\n");
File f1 = new File("tomcat.png");
String img1path = f1.getAbsolutePath();
// 字符流输出图片
DataInputStream fis = new DataInputStream(
new BufferedInputStream(new FileInputStream(new File(img1path))));
byte[] theData = new byte[(int) f1.length()];
fis.readFully(theData);// 从所包含的输入流中读取此操作的字节数。
fis.close();
sb.append("Content-length: ").append(theData.length).append("\r\n");
sb.append("\r\n");
System.out.println(sb.toString());
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(out));
bw.write(sb.toString());
bw.flush();
out.write(theData);
out.flush();
} else {
// 打印请求信息
// System.out.println(requestHeader);
/**
* 回应数据,每行加一个换行,长度为字节的长度
*/
String responseHeader = ""; // 封装应答头
String responseContent = "<html><head></head>" + " <body>我是中国人" + "</body></html>"; // 封装应答的内容
responseHeader += "HTTP/1.1 200 OK\r\n";
responseHeader += "Content-Type: text/html;charset=GBK1213\r\n";
responseHeader += "Content-length: " + responseContent.getBytes().length + "\r\n";
responseHeader += "\r\n"; // 响应头结束
String content = responseHeader + responseContent;
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(out));
bw.write(content);
bw.flush();
bw.close();
in.close();
out.close();
socket.close();
System.out.println(requestHeader);
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
总结
搭建一个小型服务器需要如下几步
1.定义Tomcat入口类,监听请求
2.自定义WebServlet注解,实现urlPattern属性
3.定义HttpRequestServlet,请求输入流
4.定义HttpResponceServlet,响应输入流
5.定义Servlet接口,提供service静态方法
6.定义HttpServlet,实现Servlet接口,通过url判断实现请求转发 get|post
7.定义TestServlet&Test02Servlet测试类