【手写Tomcat】6.实现自己定义的MyHttpResponse

导读:本篇文章讲解 【手写Tomcat】6.实现自己定义的MyHttpResponse,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com

        在上一篇文章,我们已经实现了MyHttpResponse,这次,我们来实现MyHttpResponse,这个类就相对于tomcat里面的HttpServletResponse。

        我们还是只实现几个常见功能,分别是

  •   setContentType(String type)
  •   setStatus(int status)
  •   write(String mess)
  •   setHeader(String s, String s1)
  •   sendRedirect(String s)

代码编写

        我们还是首先在MyHttpResponse接口中定义上面的几个接口

【手写Tomcat】6.实现自己定义的MyHttpResponse

         然后我们在具体的实现类里面对这些方法进行编写,我们先在实现类里面定义几个成员变量,方便于管理,并且给出一些默认值。

【手写Tomcat】6.实现自己定义的MyHttpResponse

         编写一个构造器,在创建这个类时就初始化OutputStream

【手写Tomcat】6.实现自己定义的MyHttpResponse

         然后我们对接口中定义的方法进行实现,首先是setContentType方法

【手写Tomcat】6.实现自己定义的MyHttpResponse

         然后是setStatus方法

【手写Tomcat】6.实现自己定义的MyHttpResponse

         setHeader方法

【手写Tomcat】6.实现自己定义的MyHttpResponse

         write方法

【手写Tomcat】6.实现自己定义的MyHttpResponse

         sendRedirect方法

【手写Tomcat】6.实现自己定义的MyHttpResponse

        完整代码如下

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,游览器成功输出,没有问题

【手写Tomcat】6.实现自己定义的MyHttpResponse


         然后我们测试重定向,核心代码如下

myHttpResponse.sendRedirect("https://www.baidu.com");

         访问前面的网址 ,http://localhost:8080/books,发现跳转到了百度,测试成功

【手写Tomcat】6.实现自己定义的MyHttpResponse


         测试状态码,核心代码如下,我们将状态码设置为404

myHttpResponse.setStatus(404);
myHttpResponse.write("");

          访问前面的网址 ,http://localhost:8080/books,查看游览器状况以及抓包查看状态码,发现网页不能正常显示,并且抓包显示状态码为404,测试成功

【手写Tomcat】6.实现自己定义的MyHttpResponse

【手写Tomcat】6.实现自己定义的MyHttpResponse


        我们最后再来测试一些setContenType,setHeader我在这里就不测了。我们在setContentType中写入MIME类型,application/x-tar,表示是一张图片,核心代码如下

myHttpResponse.setContentType("application/x-tar");
myHttpResponse.write("123");

         我们还是在游览器中访问 http://localhost:8080/books,发现一访问就下载了一个文件,我们也测试成功了

【手写Tomcat】6.实现自己定义的MyHttpResponse


        到此,我们自己定义的MyHttpResponse也实现了,虽然功能不多,但是对于理解tomcat还是很有帮助,我们在后面的文章中将会慢慢实现其他的Servlet,最终实现一个相对完善的迷你tomcat,在这过程中更加深入的理解tomcat的运行机制。 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/74880.html

(0)
小半的头像小半

相关推荐

极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!