• 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!
  • 相关阅读:
    [AGC030F] Permutation and Minimum
    [GYM102904B]Dispatch Money
    [ZOJ3989]Triangulation
    [HDU6094]Rikka with KMatch
    CF739E Gosha is hunting
    [国家集训队]Tree I
    [BZOJ3864]Hero meet devil
    编程是一门实践性的科学
    IE下的flash加载中文URL文件 问题
    多线程1号
  • 原文地址:https://www.cnblogs.com/stay-9527/p/3989189.html
Copyright © 2020-2023  润新知