发表时间:2010-05-31  
今天看sun的HttpMessages.java文件,虽然文件很小,但是对我的启发很大。 
前面定义了大量的HTTP常量: 
Java代码   收藏代码
  1. ...  
  2. ...  
  3. private static final String STATUS_305 = "Use Proxy";  
  4. private static final String STATUS_307 = "Temporary Redirect";  
  5. private static final String STATUS_400 = "Bad Request";  
  6. private static final String STATUS_401 = "Unauthorized";  
  7. private static final String STATUS_402 = "Payment Required";  
  8. private static final String STATUS_403 = "Forbidden";  
  9. private static final String STATUS_404 = "Not Found";  
  10. private static final String STATUS_405 = "Method Not Allowed";  
  11. private static final String STATUS_406 = "Not Acceptable";  
  12. private static final String STATUS_407 = "Proxy Authentication Required";  
  13. private static final String STATUS_408 = "Request Timeout";  
  14. ...  
  15. ...  

也可以趁机从这里查看HTTP返回值的意义^_^。然后定义了一个java.util.concurrent.ConcurrentHashMap的变量httpStatusCodeMappings,再往里面添加刚才定义的常量(这个操作放在了一个静态块里),如: 
Java代码   收藏代码
  1. static {  
  2.         httpStatusCodeMappings.put("sc.100", STATUS_100);  
  3.         httpStatusCodeMappings.put("sc.101", STATUS_101);  
  4.         httpStatusCodeMappings.put("sc.200", STATUS_200);  
  5.         httpStatusCodeMappings.put("sc.201", STATUS_201);  
  6.         httpStatusCodeMappings.put("sc.202", STATUS_202);  
  7.         httpStatusCodeMappings.put("sc.203", STATUS_203);  
  8.   ...  
  9.   ...  

最重要的就是这个方法了,先看代码: 
Java代码   收藏代码
  1. public static String getMessage(int status) {  
  2.   
  3.         // Return the status message for the most frequently used status  
  4.         // codes directly, without any lookup  
  5.         switch (status) {  
  6.             case 200return STATUS_200;  
  7.             case 302return STATUS_302;  
  8.             case 400return STATUS_400;  
  9.             case 404return STATUS_404;  
  10.     }  
  11.   
  12.         return httpStatusCodeMappings.get("sc."+ status);  
  13.     }  

这段代码的用途很简单,就是要返回状态码对应的Message,而这些这些消息都已经存放在httpStatusCodeMappings变量里了,为了提高访问常用的几个返回码的Message,它直接用了一个静态块,而不去lookup那个map了,这就是高手!