.这里先考虑get请求
*/
public class MyRequest {
private String method;
private String uri;
//存放参数列表 参数名-参数值=>HashMap
private HashMap<String, String> parametersMapping = new HashMap<>();
private InputStream inputStream = null;
//构造器==>对http请求进行封装
//在构造 MyRequest对象的时候,将关联的socket的InputStream传进来
// 这样就可以拿到该http请求的数据
public MyRequest(InputStream inputStream) {
this.inputStream = inputStream;
packageHttp();
}
/**
* 将http请求的相关参数进行封装,然后提供相关的方法,进行获取
*/
public void packageHttp() {
System.out.println("MyRequest packageHttp()被调用...");
try {
//将字节流转成字符流
BufferedReader bufferedReader =
new BufferedReader(new InputStreamReader(inputStream, "utf-8"));
/**
* GET /myCalServlet?num1=11&num2=12 HTTP/1.1
* Host: localhost:8080
* User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:106.0) Gecko/20100101 Firefox/106.0
* ......
*/
//1.先读取第一行(请求行)
String requestLine = bufferedReader.readLine();
//第0组:GET 第1组:/myCalServlet?num1=11&num2=12 第2组:HTTP/1.1
String[] requestLineArr = requestLine.split(" ");
//2.得到method
method = requestLineArr[0];
//3.解析得到uri=/myCalServlet
//先看看uri有没有参数列表
int index = requestLineArr[1].indexOf("?");//找到?号的索引
if (index == -1) {//没有问号,说明uri没有参数列表
uri = requestLineArr[1];
} else {
//截取到?号的前一位,即为uri
uri = requestLineArr[1].substring(0, index);
//获取参数列表
String parameters = requestLineArr[1].substring(index + 1);//parameters => num1=11&num2=12
String[] parametersPair = parameters.split("&");//parametersPair=["num1=11","num2=12",...]
//防止浏览器的提交的地址为 /myCalServlet?
if (null != parametersPair && !"".equals(parametersPair)) {
//再分割
for (String parameterPair : parametersPair) {
//parameterVal=["num1","10"]
String[] parameterVal = parameterPair.split("=");
if (parameterVal.length == 2) {
//放入到parametersMapping中
parametersMapping.put(parameterVal[0], parameterVal[1]);
}
}
}
}
//这里不能关闭流inputStream,因为inputStream和socket关联,
// 如果关闭了inputStream则socket也会一起关闭
} catch (Exception e) {
e.printStackTrace();
}
}
//request有一个特别重要的方法-getParameter()
public String getParameter(String name) {
if (parametersMapping.containsKey(name)) {
return parametersMapping.get(name);
} else {
return "";
}
}
public String getMethod() {
return method;
}
public void setMethod(String method) {
this.method = method;
}
public String getUri() {
return uri;
}
public void setUri(String uri) {
this.uri = uri;
}
@Override
public String toString() {
return "MyRequest{" +
"method='" + method + '\'' +
", uri='" + uri + '\'' +
", parametersMapping=\n" + parametersMapping +
'}';
}
}
3.2.2MyResponse
package com.li.MyTomcat.http;
import java.io.OutputStream;
/**
* @author 李
* @version 1.0
* 1.MyResponse可以封装OutputStream(和socket关联)
* 2.即可以通过 MyResponse对象返回http响应给浏览器或客户端
* 3.MyResponse的作用等价于原生的Servlet的HttpServletResponse
*/
public class MyResponse {
private OutputStream outputStream = null;
//写一个http的响应头
public static final String respHeader = "HTTP/1.1 200 OK\r\n" +
"Content-Type: text/html;charset=utf-8\r\n\r\n";
//在构造 MyResponse 对象的时候,将关联的socket的OutputStream传进来
pub
|