HowTomcatWorks第三章第一部分就是StringManager工具类.Tomcat使用属性文件管理错误信息.并且把属性文件分散到各个包内,避免单个属性文件过于庞大.为了实现国际化,Tomcat为每个包配置多个不同语言版本的属性文件,它们都以LocalString开头,后面为相应语言的简写.(例如中文为LocalString_zh.properties)StringManager则可以根据传递进来的包名和locale,通过内置的ResourceBundle来加载特定包下的属性文件.
然而继第二章之后,我再次遇到了类加载的问题.下面是Tomcat7中StringManager的构造方法.
private StringManager(String packageName, Locale locale) {
String bundleName = packageName + ".LocalString";
ResourceBundle bnd = null;
try {
bnd = ResourceBundle.getBundle(bundleName, locale);
} catch (MissingResourceException mre) {
ClassLoader cl = Thread.currentThread().getContextClassLoader();
if (cl != null) {
try {
bnd = ResourceBundle.getBundle(packageName, locale, cl);
} catch (MissingResourceException mre2) {
// ignore;
}
}
}
bundle = bnd;
if (bundle != null) {
this.locale = bundle.getLocale();
} else {
this.locale = null;
}
}
getBundle加载失败后为什么要用线程上下文加载器再加载一遍?
为了解决这个疑惑,我首先在网上找到这么一段.
引用
为什么要引入线程的上下文类加载器?将它引入J2SE并不是纯粹的噱头,由于Sun没有提供充分的文档解释说明这一点,这使许多开发者很糊涂。实际上,上下文类加载器为同样在J2SE中引入的类加载代理机制提供了后门。通常JVM中的类加载器是按照层次结构组织的,目的是每个类加载器(除了启动整个JVM的原初类加载器)都有一个父类加载器。当类加载请求到来时,类加载器通常首先将请求代理给父类加载器。只有当父类加载器失败后,它才试图按照自己的算法查找并定义当前类。
有时这种模式并不能总是奏效。这通常发生在JVM核心代码必须动态加载由应用程序动态提供的资源时。拿JNDI为例,它的核心是由JRE核心类(rt.jar)实现的。但这些核心JNDI类必须能加载由第三方厂商提供的JNDI实现。这种情况下调用父类加载器(原初类加载器)来加载只有其子类加载器可见的类,这种代理机制就会失效。解决办法就是让核心JNDI类使用线程上下文类加载器,从而有效的打通类加载器层次结构,逆着代理机制的方向使用类加载器。
通常在默认的情况下工程中src下的所有.java文件经过编译后都存放到bin/classes下,由类路径加载器加载.属性文件也是由类加载器加载到内存中.于是如果直接调用ResourceBundle.getBundle(packageName,locale).ResourceBundle会将调用者的classloader作为默认的classloader,也就是说这个属性文件也将由类路径加载器加载.然而我们可能面临的情况是,属性文件并不在classpath中,这样的话即使给出文件的全限定名,加载器也看不到这个文件.这样就导致了加载失败.
相对的,线程上下文加载器正可以在此时发挥作用.正如引用所说,如果线程上下文加载器默认为系统类加载器,但线程上下文加载器是可以手动指定的.于是我们就可以创建一个自定义类加载器,将属性文件所在的目录设置成参数.然后将这个加载器对象传递到getBundle(packageName, locale, cl)方法中.这时getBundle方法会
顺利加载属性文件,随后进行相应的处理.
这就是目前我对类上下文加载器应用的解读
分享到:
相关推荐
- 配置Tomcat涉及修改 `conf/server.xml` 文件,以设置端口、应用上下文路径和连接器等参数。 - 启动和停止Tomcat可以使用 `bin/startup.sh` 和 `bin/shutdown.sh` 脚本。 5. **安全管理**: - Tomcat的安全管理...
- 调整`conf/server.xml`配置文件,设置端口、上下文路径以及服务器行为。 - 配置启动脚本,如`bin/startup.sh`和`bin/shutdown.sh`,使其适应Linux环境。 3. **安全管理**: - 修改默认的管理员账号密码,防止...
- **配置server.xml**:修改conf/server.xml文件,可以设置端口、应用上下文路径等。 **4. 应用部署** - **WAR文件部署**:将Web应用的WAR文件放入webapps目录下,Tomcat会自动解压并部署。 - **目录结构部署**:也...
- **配置服务器**:修改`conf/server.xml`文件配置端口、应用上下文路径、连接器等。 4. **应用部署**: - **Web应用程序目录结构**:将WAR文件或已解压的目录放在`webapps`目录下,Tomcat会自动检测并部署。 - ...
在这里,你可以设置端口号(默认为8080)、设置应用上下文路径、调整最大线程数等。 4. **部署Web应用**:将WAR文件或已解压的Web应用文件夹放入`webapps`目录下,Tomcat会自动检测并部署这些应用。或者,可以通过...
例如,你可以修改`<Host>`标签来设置默认的应用上下文根,或者通过添加`<Context>`标签来指定特定的Web应用路径。 - **端口配置**: 默认情况下,Tomcat使用8080端口监听HTTP请求,你可以根据需要更改`Connector`...
此外,Tomcat可以通过修改`conf/server.xml`中的`Connector`元素配置来调整其HTTP服务器的行为,例如设置端口号、连接器类型(HTTP/1.1或HTTP/2)等。还可以通过调整`maxThreads`和`minSpareThreads`等参数来优化...
- 配置文件如`server.xml`位于`conf`目录下,其中定义了服务器的端口号、连接器、上下文等信息,可以根据需求进行修改。 5. **应用部署**: - 将Java Web应用程序(WAR文件)放入`webapps`目录下,Tomcat会自动将...
`context.xml`则用于配置特定Web应用的上下文。 在Java开发中,Tomcat与Eclipse、IntelliJ IDEA等IDE集成使用方便,通过插件可以实现快速部署和调试。同时,Tomcat支持热部署,开发者修改完代码后无需重启服务器...
- 引入了多线程上下文类加载器,提高了应用程序的隔离性。 - 提供了更丰富的管理和监控工具,如JMX(Java Management Extensions)支持。 - 改进了安全性,支持最新的SSL/TLS协议。 - 性能优化,提升了并发处理...
- **conf**:包含其他配置文件,如logging.properties(日志配置)和context.xml(全局上下文配置)。 4. **管理工具**: - **Manager App**:通过访问http://localhost:8080/manager/html,可以管理部署的应用。...
这些文件分别控制Tomcat的整体配置、全局Web应用设置和特定应用的上下文。 对于开发和调试,Tomcat提供了一些实用工具,如JMX(Java Management Extensions)接口,可以用来远程监控和管理服务器状态。此外,通过...
2. **conf目录**:存放所有配置文件,如`server.xml`定义了整个服务器的配置,`webapps.xml`和`context.xml`用于管理应用程序上下文,`logging.properties`配置日志系统。 3. **lib目录**:包含Tomcat运行所需的JAR...
- `context.xml`:定义了应用程序的上下文,如数据源、会话超时等。 - `web.xml`:每个Web应用程序的部署描述符,设置Servlet和过滤器。 **部署与管理** 部署Web应用到Tomcat,通常只需将`.war`文件复制到`webapps`...
4. **Context**:每个Web应用程序对应一个Context,它定义了应用的上下文根路径。 5. **GlobalNamingResources**:全局命名资源,可以被所有Context共享,用于配置数据源、邮件会话等。 6. **Webapps**目录:这是...
3. **配置文件**:Tomcat的配置主要通过几个核心的XML文件进行,如`server.xml`定义了服务器配置,`tomcat-users.xml`管理用户和角色,`context.xml`定义了上下文特定的配置,而`web.xml`则是Web应用程序的部署描述...
- **conf**:包含Tomcat的主要配置文件,如`server.xml`(定义服务器配置)、`context.xml`(应用上下文配置)、`web.xml`(全局Servlet和过滤器配置)等。 - **bin**:存放Tomcat的可执行脚本,如启动和停止服务器...
配置server.xml文件可以调整端口号、应用上下文路径、JVM内存大小等参数。 4. **部署应用**: 将打包好的WAR文件放入webapps目录下,Tomcat会自动解压并部署应用。或者通过管理界面(如manager应用)进行远程部署...
4. **配置服务器**:修改conf/server.xml和conf/web.xml文件,配置端口号、连接器、虚拟主机、应用程序上下文等。 5. **部署应用**:将你的Web应用程序打包成WAR文件,放入webapps目录下,Tomcat会自动解压并部署。...
- **conf**:存放Tomcat的配置文件,如`server.xml`定义服务器配置,`context.xml`管理应用上下文,`web.xml`是全局的Servlet和JSP配置。 - **lib**:存放Tomcat运行所需的JAR库。 - **logs**:记录Tomcat运行...