Freemarker URL模板加载器

时间:2014-05-26 13:50:44

标签: freemarker restlet

我想从一个或多个URL加载Freemarker模板,因此我将URLTemplate加载器类子类化,并覆盖getURL(..)方法以返回目标URL(参见下文)。然后我将这个类的几个实例添加到多模板加载器并将其添加到Freemarker配置中。当第一个URL返回模板但是没有调用其他模板加载器时,这种方法很有效。我做错了什么?我通过Restlet框架使用Freemarker的v2.3。

:    :     :    :     :    :     :    :     :    :     
TemplateLoader[] loaders = new TemplateLoader[] {
    new MyTemplateLoader(new URL(request.getRootRef() + app.getRoot())),
    new MyTemplateLoader(new URL(request.getRootRef() + "/"))
};

freemarkerConfig.setTemplateLoader(new MultiTemplateLoader(loaders));  

:    :     :    :     :    :     :    :     :    :     

public class MyTemplateLoader extends URLTemplateLoader {
    private URL root;

    public MyTemplateLoader(URL root) {
        super();
        this.root = root;
    }

    @Override
    protected URL getURL(String template) {
        try {
            URL tu = new URL(root,  "./" + template);
            return tu;
        } catch (MalformedURLException e) {
            e.printStackTrace();
        }
        return null;
    }
}

1 个答案:

答案 0 :(得分:1)

如果TemplateLoader.findTemplateSource为其返回null,则认为模板丢失。如果它返回非null对象,则MultiTemplateLoader会假定它已找到模板。对于URLTemplateLoaderfindTemplateSource只返回getURL所做的事情。因此,您必须检查目标是否存在,然后将null作为URL返回(如果它没有)。这适用于ClassTemplateLoader,因为getResource会返回遗失资源的null网址。但总的来说(如果您不知道自己拥有什么类型的网址),则需要打开URLConnection然后connect()以查看目标是否存在。或者至少我猜大多数URLSrteamHandler - s将检查目标是否存在。