tomcat的简单实现

前言

“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测试类

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值