Tomcat源码学习一
这段时间工作不太忙,所以抽时间学习了TOMCAT,
TOMCAT实际就是负责保持TCP连接传递到部署的项目中。浏览器实质就是TCP发送器。将用户的请求封装成TCP发送请求。当然格式是双方协定的。使用的socket连接。请求内容为空格和换行符分割。看了下源码解析请求头,觉得写得好精致啊。讲请求转换为byte数组。然后转化为char值直接比较他们的值大小。如果和换行符或者空格char相同则提出。
int ix = 0; int ox = 0; String key = null; String value = null; while (ix < data.length) { byte c = data[ix++]; switch ((char) c) { case '&': value = new String(data, 0, ox, encoding); if (key != null) { key = null; } ox = 0; break; case '=': key = new String(data, 0, ox, encoding); ox = 0; break; case '+': data[ox++] = (byte)' '; break; case '%': data[ox++] = (byte)((convertHexDigit(data[ix++]) << 4) + convertHexDigit(data[ix++])); break; default: data[ox++] = c; } } //The last value does not end in '&'. So save it now. if (key != null) { value = new String(data, 0, ox, encoding);
解析请求资源。根据资源名获取类名。然后导入class文件URLLoader。然后执行方法。提起要继承HttpServlet 执行service()方法。
还有一个好东西就是它的一场信息管理ResourceBundle读取一场信息配置文件根据每个包构成一个单例 放入一个静态HashMap中使用的使用通过包名获取。非常灵活。而ResourceBundle可以自动的获取服务器运行环境获取相应的配置文件。比如获取LocalStrings文件,如果在中国地区,包下面还有一个LocalStrings_zh_CN的配置文件,将会优先读取。
/** 异常信息如何使用 * The string manager for this package. */ private StringManager sm = StringManager.getManager(Constants.Package); /** * 用于加载 properties 文件 国际化文件 * 当在中文操作系统下,如果myres_zh_CN.properties、myres.properties两个文件都存在 * ,则优先会使用myres_zh_CN * .properties,当myres_zh_CN.properties不存在时候,会使用默认的myres.properties。 * * 没有提供语言和地区的资源文件是系统默认的资源文件。 * 资源文件都必须是ISO-8859-1编码,因此,对于所有非西方语系的处理,都必须先将之转换为Java Unicode * Escape格式。转换方法是通过JDK自带的工具native2ascii. */ private ResourceBundle bundle; private Demo1(String packageName) { String bundleName = packageName + ".LocalStrings"; bundle = ResourceBundle.getBundle(bundleName); } public static void main(String[] args) { Demo1 c = new Demo1("com.util"); System.out.println(c.bundle.getString("Hello")); }
看的比较马虎。有新的在记录吧。
Stay Hungry,Stay Foolish!