이것은 까다로운 질문이었습니다. org.restlet.ext.Freemarker 패키지에서 소스 파일을 구현해야합니다. - Phew!
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;
을 : 여기
은 당신이 당신의 자신의 구성 개체를 만들 필요가
경우 할 수있는 방법, 사용 후 렌더링을 위해에 TemplateRepresentation '작업'을해야하는 'templateLoader를'설정 기본에 만족하고 템플릿
//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 (...) 메서드를 호출하여 템플릿을 설정하려는 경우 당신은 항상
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;
}
}
ServletContextListener에서이 작업을 수행 그리고 정적 getFMConfig()를 호출하고주의하는 1 개
것 같이 TemplateRepresentation에 전달할 수 :
- 당신이 만약 지원되지 않는 프로토콜을 얻으십시오 예외 2의 경우에있을 것입니다.ServerResource가 파일 액세스에 사용할 프로토콜을 알지 못함을 의미합니다. Restlet의 CLAP 프로토콜입니다. web.xml 파일에서 RestletServlet 용 init-params를 설정하고 CLAP을 매개 변수 값 중 하나로 설정해야 할 수도 있습니다.
- TemplateRepresentation에는 구성 자의 수가 매우 많습니다. - 구성을 전달하지 않으면 (다른 오버로드 된 생성자를 사용하여) 인스턴스화하는 동안 새로운 Configuration()이 생성됩니다. 따라서 2와 같이 설정을 할 필요가 없습니다. (명백한 점이 있을지 모르지만 설정을해야하거나 다른 곳에서 가져올 수 있다고 가정합니다.)
- OWN 구성 설정을 원한다면 생성자 중 하나에 전달해야합니다.
- ContextTemplateLoader의 생성자에서 "war : ///"문자열을 1로 지정하십시오. 중요 함 아니요 이 baseUri 참조는 문서에 포함되지 않아야합니다. 나는 그것이 "war : ///"다음에 템플리트가 저장된 폴더 이름 다음에 있어야한다는 것을 알아 내기 전에 꽤 오랫동안 노력했습니다.
- 사례 2의 경우이 코드가 액세스되는 곳의 클래스 파일과 동일한 패키지에 템플릿을 저장해야 할 것입니다. 주의 깊게 볼 경우 리소스가 로컬에 있어야하는데 말하는 ClientResource에 대한 인수로 LocalReference 매개 변수를 알 수 있습니다 따라서 당신은 사용자 정의 박수 프로토콜 (classLoader가 액세스 프로토콜)
개인 좌절 포인트를 사용할 필요가 - 이 모든 것이 문서 또는 다른 곳에서도 분명하지 않은 이유는 무엇입니까? :)
이 게시물을 우연히 찾은 사람에게 도움이되기를 바랍니다. 휴!
출처
2011-03-22 21:34:58
PhD
+1 참으로 도움이되었는데, 나는 실제로 넘어졌습니다. : D – el2iot2
옵션 2가 적합합니다. 옵션 1을 사용하고 싶습니다만 템플릿을 찾을 수 없습니다. 이 디렉토리 구조를 설명해 주시겠습니까? – bvamos
@bvamos - 작동해야합니다. 예제 코드는 루트 수준의 WEB-INF 폴더에있는 모든 템플릿에서 작동합니다. 중첩 폴더가있는 경우 경로를 적절히 설정해야합니다. 템플릿은 어디에 있고'ContextTemplateLoader' 생성자를 호출하는 방법은 무엇입니까? – PhD