上一个版本中为了让服务端支持根据浏览器请求的资源的实际类型发送响应头Content-Type可以有对应正确的值,我们在Clienthandler中添加了一个Map。 随之而来的问题:由于每次请求都会创建一个ClientHandler,那么这个Map也会随之每次创建,但是其内容则是固定不变的,因此没有必要每次都创建,所有要将其定义为静态的,全局一份即可。
在com.webserver.http包中新建一个类:HttpContext使这个类保存所有和HTTP协议相关固定不变的内容。
在这里新建一个静态属性,是一个Map。保存所有Content-Type的值和资源后缀名的对应关系。
提供初始化操作和一个公开的静态方法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); } }在ClientHandler中原有的操作改为通过这个方式获取响应头Content-Type。
上述功能实现后,带来了另一个问题: 无论ClientHandler处理请求时,用户请求的资源是否存在,我们在设置response的正文文件后还要设置两个说明正文的响应头: Content-Type和Content-Length因此要知道,只要响应正文中有正文,就应当包含这两个响应头。那么我们完全可以将设置两个头的工作放到设置响应正文的方法中。
将ClientHandler中原有的根据正文文件设置两个响应头的工作移动到HttpResponse的设置正文方法setEntity中。然后再将ClientHandler中设置在这两个工作的代码删除即可。
此版本结束,下个版本我们将使用xml文件来保存资源后缀与对应的Content-Type的值。
