实现一个简易版的Tomcat(十一)

本文介绍了一种优化HTTP响应头Content-Type的方案,通过在HTTP上下文中使用静态Map存储资源后缀与Content-Type的映射,避免了每次请求都重新创建Map的开销。此外,还讨论了如何在HttpResponse中自动设置Content-Type和Content-Length。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言

上一个版本中为了让服务端支持根据浏览器请求的资源的实际类型发送响应头Content-Type可以有对应正确的值,我们在Clienthandler中添加了一个Map。
随之而来的问题:由于每次请求都会创建一个ClientHandler,那么这个Map也会随之每次创建,但是其内容则是固定不变的,因此没有必要每次都创建,所有要将其定义为静态的,全局一份即可。


实现:

1.创建HttpContext:

在com.webserver.http包中新建一个类:HttpContext使这个类保存所有和HTTP协议相关固定不变的内容。

2.创建Map:

在这里新建一个静态属性,是一个Map。保存所有Content-Type的值和资源后缀名的对应关系。

3.初始化操作:

提供初始化操作和一个公开的静态方法getMimeType方法,可以根据资源后缀名获取到对应的Content-Type值。

public class HttpContext {
    /*
    Content-Type与资源后缀的对应关系
    key:资源的后缀名,如:png,jpg,css等等
    value:对应的Content-Type的值,如:image/png等
     */
    private static Map<String,String> mimeMapping = new HashMap<>();

    static {
        //静态块适合初始化静态资源
        initMimeMapping();
    }

    public static void initMimeMapping() {
        mimeMapping.put("html","text/html");
        mimeMapping.put("css","text/css");
        mimeMapping.put("js","application/javascript");
        mimeMapping.put("png","image/png");
        mimeMapping.put("gif","image/gif");
        mimeMapping.put("jpg","image/jpeg");
    }

    /**
     * 根据给定的资源后缀名获取对应的Content-Type的值
     * @param ext
     * @return
     */
    public static String getMimeType(String ext) {
        return mimeMapping.get(ext);
    }


}

4.修改ClientHandler:

在ClientHandler中原有的操作改为通过这个方式获取响应头Content-Type。

上述功能实现后,带来了另一个问题:
无论ClientHandler处理请求时,用户请求的资源是否存在,我们在设置response的正文文件后还要设置两个说明正文的响应头:
Content-Type和Content-Length因此要知道,只要响应正文中有正文,就应当包含这两个响应头。那么我们完全可以将设置两个头的工作放到设置响应正文的方法中。

实现:

将ClientHandler中原有的根据正文文件设置两个响应头的工作移动到HttpResponse的设置正文方法setEntity中。然后再将ClientHandler中设置在这两个工作的代码删除即可。

 


此版本结束,下个版本我们将使用xml文件来保存资源后缀与对应的Content-Type的值。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值