手写简易版Tomcat第四天

本文介绍了如何在Servlet框架中实现MyHttpResponse接口,包括设置内容类型、状态码、写入内容、设置响应头和重定向功能。通过测试展示了重定向方法的应用。

目录

前言

代码实现

测试


前言

我们之前搭建了Servlet架子也实现了MyHttpRequest的部分方法。接下来我们去实现MyHttpResponse的部分方法。

代码实现

我们本次实现的方法有

  • setContentType(String type):设置返回内容类型
  • setStatus(int status):设置响应状态码
  • write(String mess):返回浏览器内容
  • setHeader(String s, String s1):设置响应头参数
  • sendRedirect(String s):重定向

 在MyResponse接口中添加如下方法。

public interface MyResponse {
    void setContentType(String type);
    void setStatus(int status);
    void write(String mess);
    void setHeader(String s, String s1);
    void sendRedirect(String s);
}

在MyHttpResponse实现类中实现如下方法

public class MyHttpResponse implements MyResponse {
    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 MyHttpResponse(OutputStream outputStream) {
        this.outputStream = outputStream;
    }

    @Override
    public void setContentType(String type) {
        this.contentType = "Content-Type: " + type + "\r\n";
    }

    @Override
    public void setStatus(int status) {
        this.status = status;
    }

    @Override
    public void write(String mess) {
        mess = responseRow + status + "\r\n" + responseHead + contentType + mess;
        try {
            outputStream.write(mess.getBytes());
        } catch (IOException e) {
            System.out.println("响应浏览器失败");
        }
    }

    @Override
    public void setHeader(String s, String s1) {
        String head = s + ": " + s1 + "\r\n";
        responseHead = responseHead + head;
    }

    @Override
    public void sendRedirect(String s) {
        //重定向状态码
        setStatus(302);
        setHeader("location",s);
        //如果不执行write方法,不会向客户端发送任何数据
        write("");
    }
}

测试

修改线程池的代码如下

public void execute(Socket socket) {
        executor.execute(()->{
            System.out.println(Thread.currentThread().getName()+"开始处理请求");
            InputStream inputStream = null;
            try {
                inputStream = socket.getInputStream();
                MyHttpRequest myHttpRequest = new MyHttpRequest(inputStream);
                System.out.println("请求方式为:"+myHttpRequest.getMethod());
                System.out.println("请求Uri为:"+myHttpRequest.getUri());
                //读取完毕后,进行一个简单响应
                OutputStream outputStream = socket.getOutputStream();

                String responseBody = "这是一个简单的展示页面";

                MyHttpResponse myHttpResponse = new MyHttpResponse(outputStream);
                myHttpResponse.write(responseBody);
//                myHttpResponse.sendRedirect("https://www.baidu.com");
                outputStream.close();
                inputStream.close();
                socket.close();
                System.out.println("断开连接...");
            } catch (IOException e) {
                e.printStackTrace();
            }
        });
    }

运行后访问localhost:8080地址

接下来测试重定向方法

将线程池代码中的write方法注释掉,将下行代码注释取消。访问localhost:8080地址

 

 至此。MyHttpResponse代码实现完毕

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

zmbwcx2003

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值