lic MyResponse(OutputStream outputStream) {
this.outputStream = outputStream;
}
//当我们需要给浏览器返回数据时,可以通过MyResponse的属性获得输出流
public OutputStream getOutputStream() {
return outputStream;
}
}
3.2.3修改RequestHandler
package com.li.MyTomcat.hander;
import com.li.MyTomcat.http.MyRequest;
import com.li.MyTomcat.http.MyResponse;
import java.io.*;
import java.net.Socket;
/**
* @author 李
* @version 1.0
* RequestHandler是一个线程对象
* 用来处理一个http请求
*/
public class RequestHandler implements Runnable {
//定义一个Socket
private Socket socket = null;
//在创建RequestHandler对象的时候,将主线程的socket传给线程对象来使用
public RequestHandler(Socket socket) {
this.socket = socket;
}
@Override
public void run() {
//对客户端进行交互
try {
System.out.println("当前线程=" + Thread.currentThread().getName());
InputStream inputStream = socket.getInputStream();
MyRequest myRequest = new MyRequest(inputStream);
String num1 = myRequest.getParameter("num1");
String num2 = myRequest.getParameter("num2");
String name = myRequest.getParameter("name");
String email = myRequest.getParameter("email");
System.out.println("请求的参数num1= " + num1);
System.out.println("请求的参数num2= " + num2);
System.out.println("请求的参数name= " + name);
System.out.println("请求的参数email= " + email);
System.out.println(myRequest);
//这里我们可以通过myResponse对象返回数据给客户端
MyResponse myResponse = new MyResponse(socket.getOutputStream());
String resp = MyResponse.respHeader + "<h1>Hello,我是myResponse返回的信息</h1>";
//这里的应用场景是:为了将来在Servlet中使用response对象,可以获取到输出流
OutputStream outputStream = myResponse.getOutputStream();
outputStream.write(resp.getBytes());
outputStream.flush();
outputStream.close();
inputStream.close();
socket.close();
} catch (IOException e) {
e.printStackTrace();
} finally {
//一定要确保socket关闭
if (socket != null) {
try {
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
MyTomcatV2类保持不变。
3.2.4测试
运行MyTomcatV2,在浏览器中输入如下请求:
http://localhost:8080/myCalServlet?num1=100&num2=200&name=jack&email=jack@qq.com
浏览器输出:
后台输出: