在上一篇文章,我们已经实现了MyHttpResponse,这次,我们来实现MyHttpResponse,这个类就相对于tomcat里面的HttpServletResponse。
我们还是只实现几个常见功能,分别是
- setContentType(String type)
- setStatus(int status)
- write(String mess)
- setHeader(String s, String s1)
- sendRedirect(String s)
代码编写
我们还是首先在MyHttpResponse接口中定义上面的几个接口
然后我们在具体的实现类里面对这些方法进行编写,我们先在实现类里面定义几个成员变量,方便于管理,并且给出一些默认值。
编写一个构造器,在创建这个类时就初始化OutputStream
然后我们对接口中定义的方法进行实现,首先是setContentType方法
然后是setStatus方法
setHeader方法
write方法
sendRedirect方法
完整代码如下
import java.io.IOException;
import java.io.OutputStream;
public class MyHttpResponseImpl implements MyHttpResponse{
private String responseRow = "HTTP/1.1 ";
private String contentType = "Content-Type: text/html;charset=utf-8\r\n\r\n";
private String responseHead = "";
private OutputStream outputStream;
private int status = 200;
public MyHttpResponseImpl(OutputStream outputStream) {
this.outputStream = outputStream;
}
@Override
public void setContentType(String type) {
contentType = "Content-Type:"+type+"\r\n\r\n";
}
@Override
public void write(String mess){
mess = responseRow+status+"\r\n"+responseHead+contentType+mess;
try {
outputStream.write(mess.getBytes());
} catch (IOException e) {
e.printStackTrace();
}
}
@Override
public void setStatus(int status) {
this.status = status;
}
@Override
public void setHeader(String s, String s1) {
String head = s+":"+s1+"\r\n";
responseHead += head;
}
@Override
public void sendRedirect(String s){
setStatus(302);
setHeader("location",s);
write("");
}
}
代码测试
我们创建一个简单的测试类来进行测试,具体就不说了,代码如下
import com.clucky.myTomcat.myHttp.MyHttpResponse;
import com.clucky.myTomcat.myHttp.MyHttpResponseImpl;
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
public class Test {
public static void main(String[] args) {
try {
//得到ServerSocket,在8080端口进行监听
ServerSocket serverSocket = new ServerSocket(8080);
System.out.println("---------服务器启动成功----------");
while (!serverSocket.isClosed()) {
//等待连接
Socket socket = serverSocket.accept();
System.out.println("连接成功.....");
OutputStream outputStream = socket.getOutputStream();
MyHttpResponse myHttpResponse = new MyHttpResponseImpl(outputStream);
myHttpResponse.write("测试成功.....");
System.out.println("断开连接.....");
//关闭流
socket.close();
}
} catch (IOException e) {
System.out.println("服务器启动失败");
}
}
}
我们首先测试是否能往游览器写数据,核心代码如下
myHttpResponse.write("测试成功.....");
启动程序,游览器进行访问,http://localhost:8080/books,游览器成功输出,没有问题
然后我们测试重定向,核心代码如下
myHttpResponse.sendRedirect("https://www.baidu.com");
访问前面的网址 ,http://localhost:8080/books,发现跳转到了百度,测试成功
测试状态码,核心代码如下,我们将状态码设置为404
myHttpResponse.setStatus(404);
myHttpResponse.write("");
访问前面的网址 ,http://localhost:8080/books,查看游览器状况以及抓包查看状态码,发现网页不能正常显示,并且抓包显示状态码为404,测试成功
我们最后再来测试一些setContenType,setHeader我在这里就不测了。我们在setContentType中写入MIME类型,application/x-tar,表示是一张图片,核心代码如下
myHttpResponse.setContentType("application/x-tar");
myHttpResponse.write("123");
我们还是在游览器中访问 http://localhost:8080/books,发现一访问就下载了一个文件,我们也测试成功了
到此,我们自己定义的MyHttpResponse也实现了,虽然功能不多,但是对于理解tomcat还是很有帮助,我们在后面的文章中将会慢慢实现其他的Servlet,最终实现一个相对完善的迷你tomcat,在这过程中更加深入的理解tomcat的运行机制。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/74880.html