避免服务器调用不存在的松散资源

时间:2012-12-05 11:47:19

标签: java applet http-status-code-404

我正在开发一个在Java 1.5上编译的applet应用程序(与1.5+兼容)。 它包含一些资源属性文件,这些文件捆绑在同一个jar中,与Java包并行。

每当我通过applet访问该资源文件时,它就会向下载applet的服务器发出请求。之后,它从jar中读取文件并按原样运行,但我不希望它为这些文件发出服务器请求。

这是我的java代码访问资源文件的方式。

ResourceBundle messages = ResourceBundle.getBundle("resources/properties/Messages", locale);

我尝试了两种方式访问​​:

ResourceBundle messages = ResourceBundle.getBundle("resources.properties.Messages", locale);

两者都有相同的行为。

注意:这些资源在我的网络应用中不是可用的松散资源。

2 个答案:

答案 0 :(得分:5)

  

我从服务器日志中获取了这些详细信息。我正在分析我的服务器日志中的404和500个响应..

404(未找到)&可能会出现500(服务器错误)消息,因为插件正在尝试检查缓存的资源是否是最新的。为此,它需要检查上次更新资源的服务器版本的时间。

复杂因素是资源可能位于applet archive属性中提到的Jar中,它可以是'松散文件'与指定的codebase在同一路径上。因此,如果资源位于Jar的以下路径中:

/resources/properties/Messages_en_US.properties 

JVM也将检查

${codebase}/resources/properties/Messages_en_US.properties 

以及每个Jar。

要修复它们,请参阅codebase_lookup参数。这个用例需要:

<param name='codebase_lookup' value='false' >

告诉JVM在类路径中存储了 no 资源作为松散文件,并且只搜索Jars。它应该停止经常报告的404 / 500消息(对于了解该参数的新JRE)。

答案 1 :(得分:0)

我不太了解Java Plug-in缓存applet的内部细节,但如果你的applet使用.jnlp描述符,我会尝试将download="eager"添加到描述符的{{1} } element。

您也可以尝试将ResourceBundles定义为类而不是.properties文件。例如:

<jar>

就像属性文件一样,您可以根据需要为多个语言环境定义它们:

package resources.properties;

import java.util.ListResourceBundle;

public class Messages
extends ListResourceBundle  {
    protected Object[][] getContents() {
        return new Object[][] {
            {"entry1", "Some message text"},
            {"entry2", "A different message"},
            // etc.
        };
    }
}

如果您定义ResourceBundle子类,最好删除相应的.properties文件。