在web应用程序框架(wicket)中正确加载资源(javascript)?

在web应用程序框架(wicket)中正确加载资源(javascript)?,javascript,reference,resources,load,wicket,Javascript,Reference,Resources,Load,Wicket,我使用Apache Wicket作为我的webapp框架,我有以下结构: 我需要的是: 1) javascript文件Rules.js应该为我的自定义Java类Process.Java加载并可读。因为在我的Process.java中,我有如下内容: private String readFile(String filename) throws IOException { File file = new File("PATH"); //reads the file and re

我使用Apache Wicket作为我的webapp框架,我有以下结构:

我需要的是:

1) javascript文件Rules.js应该为我的自定义Java类Process.Java加载并可读。因为在我的Process.java中,我有如下内容:

private String readFile(String filename) throws IOException {

    File file = new File("PATH");
    //reads the file and returns a string
    ...
}
因此,第一个问题是:当我的resource Rules.js位于资源文件夹或任何其他包文件夹中时,我应该使用什么路径而不是“路径”?

2) java不仅读取文件,它还处理我的Rules.js文件,例如使用json。因此,应在Rules.js文件中添加以下行:

var object = {JSON STRING};
我已经知道怎么做了

3) 在操作Rules.js文件之后,当然应该自动更新它。 因此,第二个问题是:我还应该添加什么以及在我的应用程序中添加到哪里,这样Rules.js文件就可以保存在我的应用程序中所有需要的类中,并且在会话期间总是最新的。


我已经尝试了很多东西,但是我在这里遗漏了一些我无法理解的东西…

如果您想在webapp根目录上保留
rules.js
文件,您可以创建自己的
IResource
,甚至使用
ContextRelativeResource

WebApplication
上,您必须将资源注册为共享资源:

    @Override
    public void init() {
        super.init();
        getSharedResources().add(RULES_RESOURCE_KEY, new ContextRelativeResource(RULES_CONTEXT_FILE));
    }

    public static ResourceReference getRulesResourceReference() {
        return Application.get().getSharedResources().get(Application.class, RULES_RESOURCE_KEY, null, null, null, true);
    }
下面是一个修改
rules.js
文件的示例方法

    public static void changeRules() {    
        try {
            // Get a context URL
            URL rules = WebApplication.get()
                     .getServletContext()
                     .getResource(RULES_CONTEXT_FILE);

            // Update the file
            OutputStreamWriter out = new OutputStreamWriter(new FileOutputStream(new File(rules.toURI())));
            out.write("var rules=\"" + Long.toHexString(System.currentTimeMillis()) + "\" ");
            out.close();

        } catch (Exception e) {
            throw new WicketRuntimeException(e);
        }

    }
在你的
主页
课堂上,或任何你需要更新
rules.js
的地方:

    public HomePage(final PageParameters parameters) {
        super(parameters);

        add(new Link("changerules") {
            @Override
            public void onClick() {
                WicketApplication.changeRules();
            }
        });
    }
在您拥有
表单的页面
添加
JavaScriptHeaderItem

    @Override
    public void renderHead(IHeaderResponse response) {
        response.render(
                JavaScriptHeaderItem.forReference(WicketApplication.getRulesResourceReference())
        );
    }
如果要测试此示例,请选择要运行此示例的HTML:

    <html>
        <body onload="alert(rules);">
            <a wicket:id="changerules" href="#">Change rules files</a>
        </body>
    </html>

别忘了在
webapp
文件夹中创建
rules.js的初始版本


我认为更新
webapp
文件夹中的文件不是一个好主意,因为容器可以在重新部署时将其替换为初始版本。因此,最好使用自己的IResource并将文件放在外部文件夹中。如果您需要更多详细信息,请选中此项。

您可以创建自己的
IResource
,甚至可以使用
ContextRelativeResource
rules.js
文件保存在webapp根目录上

WebApplication
上,您必须将资源注册为共享资源:

    @Override
    public void init() {
        super.init();
        getSharedResources().add(RULES_RESOURCE_KEY, new ContextRelativeResource(RULES_CONTEXT_FILE));
    }

    public static ResourceReference getRulesResourceReference() {
        return Application.get().getSharedResources().get(Application.class, RULES_RESOURCE_KEY, null, null, null, true);
    }
下面是一个修改
rules.js
文件的示例方法

    public static void changeRules() {    
        try {
            // Get a context URL
            URL rules = WebApplication.get()
                     .getServletContext()
                     .getResource(RULES_CONTEXT_FILE);

            // Update the file
            OutputStreamWriter out = new OutputStreamWriter(new FileOutputStream(new File(rules.toURI())));
            out.write("var rules=\"" + Long.toHexString(System.currentTimeMillis()) + "\" ");
            out.close();

        } catch (Exception e) {
            throw new WicketRuntimeException(e);
        }

    }
在你的
主页
课堂上,或任何你需要更新
rules.js
的地方:

    public HomePage(final PageParameters parameters) {
        super(parameters);

        add(new Link("changerules") {
            @Override
            public void onClick() {
                WicketApplication.changeRules();
            }
        });
    }
在您拥有
表单的页面
添加
JavaScriptHeaderItem

    @Override
    public void renderHead(IHeaderResponse response) {
        response.render(
                JavaScriptHeaderItem.forReference(WicketApplication.getRulesResourceReference())
        );
    }
如果要测试此示例,请选择要运行此示例的HTML:

    <html>
        <body onload="alert(rules);">
            <a wicket:id="changerules" href="#">Change rules files</a>
        </body>
    </html>

别忘了在
webapp
文件夹中创建
rules.js的初始版本



我认为更新
webapp
文件夹中的文件不是一个好主意,因为容器可以在重新部署时将其替换为初始版本。因此,最好使用自己的IResource并将文件放在外部文件夹中。如果您需要更多详细信息,请勾选此项。

Ey,首先,出于同样的原因,您要提出许多问题。。。因此,请关闭其他问题。正如我在其他问题中对您的评论,您可能需要动态生成rules.js文件,而不是尝试修改任何文件。不,rules.js不能只是动态生成。用户需要它来在此文件中定义他们的规则。赞成。是的,一旦我知道怎么做,我将关闭另一个问题…这样每个用户都会有自己的rules.js?你可以在任何地方创建你的rules.js,并使用你自己的指向这个/那些文件的抽象资源加载它。嗯,首先你出于同样的原因打开了许多问题。。。因此,请关闭其他问题。正如我在其他问题中对您的评论,您可能需要动态生成rules.js文件,而不是尝试修改任何文件。不,rules.js不能只是动态生成。用户需要它来在此文件中定义他们的规则。赞成。是的,一旦我知道怎么做,我将关闭另一个问题…这样每个用户都会有自己的rules.js?你可以在任何地方创建你的rules.js,并使用你自己的指向这个/那些文件的抽象资源加载它。谢谢!我现在正在努力解决它。但是规则资源密钥和规则上下文文件之间有什么区别呢。我使用“Rules.js”作为键,使用“Rules”作为文件。Rules.js文件与我的InvoiceForm在同一个包文件夹中。这里我遇到了一个问题:URL Rules=MyWebApplication.get().getServletContext().getResource(“Rules.js”);它说“Path Rules.js不以“/”开头”。但当我放置“/Rules.js”时,它会给我一个NullPointException。如果需要,您可以使用Rules\u CONTEXT\u文件作为键。RULES_CONTEXT_文件是指向webapp文件夹中文件的相对路径(以/开头)。你必须在webapp中创建文件。是的,它让我找到了正确的方向;)但是我没有100%地尝试,因为助手告诉我这不是真的需要,我应该只在运行时修改javascript文件,所以我像以前一样使用Rhino,使用Rhino调用了我需要的函数。还有JSON的eval函数,谢谢!我现在正在努力解决它。但是规则资源密钥和规则上下文文件之间有什么区别呢。我使用“Rules.js”作为键,使用“Rules”作为文件。Rules.js文件与我的InvoiceForm在同一个包文件夹中。这里我遇到了一个问题:URL Rules=MyWebApplication.get().getServletContext().getResource(“Rules.js”);它说“Path Rules.js不以“/”开头”。但当我放置“/Rules.js”时,它会给我一个NullPointException。如果需要,您可以使用Rules\u CONTEXT\u文件作为键。RULES_CONTEXT_文件是webapp中文件的相对路径