2011-03-21 4 views
4

Freemarker 및 Restlet의 freemarker 확장에 대한 문서에 나와있는 내용과 다소 혼동 스럽습니다.Java EE 서버에서 Restlet 2.0과 함께 Freemarker 사용

상황 : 재주문 엔진은 리소스 (예 : www.mysite.com/{user}/updates)의 HTML 표현을 제공합니다. 이 URI에 대해 리턴 된 자원은 freemarker 템플리트로 작성된 모든 갱신 사항을 포함하는 HTML 페이지입니다. 이 응용 프로그램은 글래스 피시 v3의 서버에서 호스팅되는

질문 (들) 다음은 FreeMarker 구성 만은 ​​FreeMarker 문서에 따라 한 번로드해야

  • :

    /* You should do this ONLY ONCE in the whole application life-cycle:Create and adjust the configuration */ 
        Configuration cfg = new Configuration(); 
        cfg.setDirectoryForTemplateLoading(
          new File("/where/you/store/templates")); 
        cfg.setObjectWrapper(new DefaultObjectWrapper()); 
    

    최고의 무엇입니까 Java EE 앱에서이 작업을 수행 할 장소는 무엇입니까? 나는 그것을 web.xml에서 context-param으로 생각하고 ServletContextListener를 사용하는 것을 고려하고있다.하지만 그렇게하는 법을 잘 모르겠다.

  • freemarker의 설명서에 따라 freemarkerservlet을 추가하고 .ftl url-patterns을 매핑 할 수 있습니다. 그러나 이것은 Restlet 서블릿 (즉, url-pattern "/")에 의해 이미 매핑되어 있습니다. 그래서 *의 .ftl 또 다른 하나를 가지고하는 것은 의미가 (또는합니까?)하지 않습니다 그것은 단지 한 번 발생하도록

그래서 문제는 기본적으로 프리 마커의 '구성'로 통합하는 최선의 방법에 대한과 그 코드 조각 (누가 그것을 호출하는지)에 대한 '진입 점'은 무엇입니까? 누구든지 Java EE 환경에서 Freemarker + restlet을 성공적으로 사용 했습니까? 어떤 아이디어?

감사합니다.

답변

6

이것은 까다로운 질문이었습니다. 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; 
을 : 여기

은 당신이 당신의 자신의 구성 개체를 만들 필요가

  1. 경우 할 수있는 방법, 사용 후 렌더링을 위해에 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); 
    
  2. 를로드하는 클래스 로더 기반 방법을 사용하려면
  3. 구성 개체 을 한 번으로 초기화하고 구성 개체에서 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가 액세스 프로토콜)

개인 좌절 포인트를 사용할 필요가 - 이 모든 것이 문서 또는 다른 곳에서도 분명하지 않은 이유는 무엇입니까? :)

이 게시물을 우연히 찾은 사람에게 도움이되기를 바랍니다. 휴!

+0

+1 참으로 도움이되었는데, 나는 실제로 넘어졌습니다. : D – el2iot2

+0

옵션 2가 적합합니다. 옵션 1을 사용하고 싶습니다만 템플릿을 찾을 수 없습니다. 이 디렉토리 구조를 설명해 주시겠습니까? – bvamos

+0

@bvamos - 작동해야합니다. 예제 코드는 루트 수준의 WEB-INF 폴더에있는 모든 템플릿에서 작동합니다. 중첩 폴더가있는 경우 경로를 적절히 설정해야합니다. 템플릿은 어디에 있고'ContextTemplateLoader' 생성자를 호출하는 방법은 무엇입니까? – PhD