这是一个棘手的问题——确实如此。要求我执行 org.restlet.ext.Freemarker 包中的源文件 - 唷!
这是你可以做到的
如果您需要创建自己的配置对象,请将“templateLoader”设置为使用,然后在其上使用 TemplateRepresentation 进行渲染:
Configuration cfg = new Configuration();
ContextTemplateLoader loader = new ContextTemplateLoader(getContext(),"war:///WEB-INF");
cfg.setTemplateLoader(loader);
TemplateRepresentation rep = null;
Mail mail = new Mail(); //The data object you wish to populate - example from Restlet itself
mail.setStatus("received");
mail.setSubject("Message to self");
mail.setContent("Doh!");
mail.setAccountRef(new Reference(getReference(), "..").getTargetRef()
.toString());
Map<String, Object> data = new HashMap<String, Object>();
data.put("status", mail.getStatus());
data.put("subject", mail.getSubject());
data.put("content", mail.getContent());
data.put("accountRef", mail.getAccountRef());
rep = new TemplateRepresentation("Mail.ftl", cfg, data, MediaType.TEXT_HTML);
return rep;
如果您对默认设置感到满意并希望使用基于类加载器的方式来加载模板
//Load the FreeMarker template
Representation mailFtl = new ClientResource(
LocalReference.createClapReference(getClass().getPackage())
+ "/Mail.ftl").get();
//Wraps the bean with a FreeMarker representation
return new TemplateRepresentation(mailFtl, mail, MediaType.TEXT_HTML);
如果您想初始化一次配置对象并通过调用配置对象上的 setServletContextForTemplateLoading(...) 方法来设置模板。您总是可以在 ServletContextListener 中执行此操作
public class Config implements ServletContextListener {
private static Configuration cfg = new Configuration();
@Override
public void contextInitialized(ServletContextEvent sce) {
ServletContext sc = sce.getServletContext();
cfg.setServletContextForTemplateLoading(sc, "/WEB-INF");
}
public static Configuration getFMConfig()
{
return cfg;
}
}
然后调用静态 getFMConfig() 并将其传递给 TemplateRepresentation,如 1
注意事项:
- 如果您确实获得了协议不受支持的异常,则会出现在案例 2 中。这意味着 ServerResource 不知道使用什么协议来访问文件 - 这将是 Restlet 的 CLAP 协议。您可能必须在 web.xml 文件中为 RestletServlet 设置 init-params 并将 CLAP 作为参数值之一
- TemplateRepresentation 有很多构造函数——如果你在实例化过程中不传入配置对象(使用另一个重载的构造函数),它将为你创建一个新的 Configuration()。因此,您不必像 2 中那样进行任何配置设置(这可能会让您觉得很明显,但我认为您仍然需要设置配置,否则它会“从某处获取”)
- 如果您确实希望设置自己的配置,则必须将其传递给构造函数之一
- 看看 1 中 ContextTemplateLoader 的构造函数中的“war:///”字符串。这很重要没有提到这个baseUri引用应该是什么,甚至在文档中也没有。我试了好久才发现它应该是“war:///”,后跟存储模板的文件夹名称。
- 对于案例 2,您可能必须将模板存储在与访问此代码的类文件相同的包中。如果您仔细观察,您会注意到 LocalReference 参数作为 ClientResource 的参数,表示资源应该在本地存在,因此您需要使用自定义 CLAP 协议(类加载器访问协议)
个人挫折点-为什么在文档或任何地方都没有澄清这一切:)
希望它对偶然发现这篇文章的人有所帮助!呸!