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