0

我使用 Apache Wicket 作为我的 webapp 框架,我有以下结构: 在此处输入图像描述

我需要的:

1) 应该为我的自定义 Java 类 Process.java 加载和读取 javascript 文件 Rules.js。因为在我的 Process.java 我有这样的东西:

private String readFile(String filename) throws IOException {

    File file = new File("PATH");
    //reads the file and returns a string
    ...
}

所以第一个问题是:当我的资源 Rules.js 在资源文件夹或任何其他包文件夹中时,我应该使用什么路径而不是“PATH”?

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

var object = {JSON STRING};

我已经知道该怎么做了。

3) 处理 Rules.js 文件后,它当然应该自动更新。 所以第二个问题是:我还应该添加什么以及我的应用程序在哪里,所以 Rules.js 是一个文件,它适用于我的应用程序中所有需要的类,并且在会话期间始终是最新的。

我已经尝试了很多东西,但我在这里错过了一些我无法弄清楚的东西......

4

1 回答 1

4

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

在您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);
        }

    }

在您的HomePage课堂上或您需要的任何地方更新rules.js

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

        add(new Link("changerules") {
            @Override
            public void onClick() {
                WicketApplication.changeRules();
            }
        });
    }

在您Form添加的页面上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>

并且不要忘记rules.js在您的webapp文件夹中创建初始版本。

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

于 2012-11-18T20:40:39.527 回答