【问题标题】:Freemarker URL Template LoaderFreemarker URL 模板加载器
【发布时间】:2014-05-26 13:50:44
【问题描述】:

我想从一个或多个 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;
    }
}

【问题讨论】:

    标签: freemarker restlet


    【解决方案1】:

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

    【讨论】:

    • 太好了,感谢您花时间解释 - Tim。
    • 只是跟进您的回答,这是否意味着每次从 URL 发出对模板的请求时,它首先必须打开与服务器的连接以检查 URL 的有效性和然后再次访问内容(假设它不在缓存中)?有什么办法可以避免这种情况,以便检查一次 URL? TIA
    • 更新延迟到期后,会连接两三次:一次是检查URL,一次是获取修改时间,如果模板被修改了再一次加载模板内容。所以它肯定不是通过网络 URL-s 的。为了防止这种情况,findTemplateSource 返回的模板源应该封装连接的URLConnection(然后注意equals 方法,它仍然应该比较URL-s,也不要忘记closeTemplateSource)。但那当然不是URLTemplateLoader
    猜你喜欢
    • 2019-10-28
    • 2013-03-18
    • 2011-05-11
    • 2015-12-11
    • 1970-01-01
    • 2021-01-26
    • 1970-01-01
    • 1970-01-01
    • 2012-09-07
    相关资源
    最近更新 更多