2011-11-02 3 views
2

나는 HTML 요청에 Freemarker를 사용하여 프로그래밍 방식으로 템플릿에서 HTML을 생성하는 저지 기반 응용 프로그램을 가지고 있습니다.저지 (Jersey) 리소스가있는 Sitemesh 및 Freemarker

@GET 
@Produces("text/html") 
public Response getResources(@PathParam("name") String name) { 
    LOG.info("got a request for " + name); 
    Map<String, Object> model = new HashMap<String, Object>(); 
    model.put("name", name); 
    //lookup some data for name; 
    model.put("somedata", somedata); 
    StringWriter out = new StringWriter(); 
    configuration.getTemplate("template.ftl").process(model, out); 
    return Response.ok().entity(out.toString()).build(); 
} 

따라서 구성 인스턴스는 Spring에서 초기화되는 freemarker.template.Configuration입니다.

<bean id="configuration" class="org.springframework.ui.freemarker.FreeMarkerConfigurationFactoryBean"> 
    <property name="templateLoaderPath" value="/WEB-INF/template/path"/> 
</bean> 

이제 web.xml에 Jersey 컨트롤러, Sitemesh 필터 및 Sitemesh-Freemarker 서블릿 설정을했습니다.

<servlet> 
    <servlet-name>JerseySpringNode</servlet-name> 
    <servlet-class>com.sun.jersey.spi.spring.container.servlet.SpringServlet</servlet-class> 
</servlet> 
<servlet-mapping> 
    <servlet-name>JerseySpringNode</servlet-name> 
    <url-pattern>/mypath/*</url-pattern> 
</servlet-mapping> 

이 SiteMesh 필터 :

<filter> 
    <filter-name>sitemesh</filter-name> 
    <filter-class>com.opensymphony.sitemesh.webapp.SiteMeshFilter</filter-class> 
</filter> 
<filter-mapping> 
    <filter-name>sitemesh</filter-name> 
    <url-pattern>/mypath/*</url-pattern> 
    <dispatcher>REQUEST</dispatcher> 
    <dispatcher>FORWARD</dispatcher> 
</filter-mapping> 

그리고 서블릿 :

<servlet> 
    <servlet-name>sitemesh-freemarker</servlet-name> 
    <servlet-class>com.opensymphony.module.sitemesh.freemarker.FreemarkerDecoratorServlet</servlet-class> 
    <init-param> 
    <param-name>TemplatePath</param-name> 
    <param-value>/</param-value> 
    </init-param> 
    <init-param> 
    <param-name>default_encoding</param-name> 
    <param-value>ISO-8859-1</param-value> 
    </init-param> 
    <load-on-startup>3</load-on-startup> 
</servlet> 
<servlet-mapping> 
    <servlet-name>sitemesh-freemarker</servlet-name> 
    <url-pattern>*.dec</url-pattern> 
</servlet-mapping> 

(우리가 장식 서식 파일을 표시하기 위해 ".dec"를 사용). Decorator.xml

<?xml version="1.0" encoding="UTF-8"?> 
    <decorators defaultdir="/decorators"> 
    <decorator name="main" page="header_and_footer.dec"> 
     <pattern>/*</pattern> 
    </decorator> 
</decorators> 

이제는 정상적으로 작동합니다. HTML 페이지는 sitemesh로 꾸며져 있습니다.

우리가 현재 가지고있는 유일한 문제는 Spring에서 결정된 데코레이터 매개 변수 (사용자 원칙, 요청 컨텍스트 외부 또는 데이터베이스의 항목 등)에 삽입해야한다는 것입니다. 예를 들어 "somedata"속성의 일부 정보).

우리는이 애플리케이션에서 Spring WebMVC를 사용하지 않기 때문에이 정보에 액세스 할 수있는 freemarker 서블릿을 어떻게 연결해야합니까? 의존성이있는 별도의 Spring 빈이라 할지라도 괜찮습니다. 아니면 원래의 Jersey 리소스 메소드 내에서 프로그래밍 방식으로 sitemesh를 호출 할 수있는 방법이 있습니까?

웹상의 "Ted Young"에 의한 해결책을 찾았지만 부분적으로 겉으로보기에 나에게 적합하지 않습니다. (또한 현재로서는 나에게 적합하지 않은 SpringWebMVC를 사용해야합니다.)

답변

1

아마도 가장 쉬운 방법은 Jersey와 Spring을 통합하는 것입니다. 이로 인해 Spring은 모든 종속성 주입 작업을 수행합니다.

다음은 web.xml의 항목입니다 :

<!-- Configure Jersey in this application. --> 
    <servlet> 
    <servlet-name>jersey</servlet-name> 
    <servlet-class>com.sun.jersey.spi.spring.container.servlet.SpringServlet</servlet-class> 
<!-- want a custom Jersey application class? do that here. 
    <init-param> 
     <param-name>javax.ws.rs.Application</param-name> 
     <param-value>org.example.jersey.MyJerseyApp</param-value> 
    </init-param> 
--> 
    <!-- Spring managed resources do not need to be listed here. Leave out if empty --> 
    <init-param> 
     <param-name>com.sun.jersey.config.property.packages</param-name> 
     <!-- 
     <param-value>org.example.jersey.package;org.example.jersey.otherpackage</param-value> 
    </init-param> 
    </servlet> 
+0

Ahh robert, Jersey, Spring은 잘 지내고 있습니다. 문제는 Sitemesh와 Freemarker 서블릿으로 Spring 컨테이너에 다시 액세스 할 수 없다는 것입니다. – scot

+0

중요한 부분은 버렸습니다.그런 다음 freemarker 템플릿에 대한 요청 컨텍스트에 필요한 리소스를 주입하는 응용 프로그램 컨텍스트에 바인딩 된 Spring 구성을 가져 오는 간단한 필터를 사용할 수 있습니다. –

+0

이 필터를 전혀 설명하지 않아도됩니까? – scot

1

당신은 명시 적으로 프리 마커에 전달하는 "모델"에 필요한 데이터를 추가해야합니다.

"모델"에 없으면 볼 수 없습니다.

"getresouces"를 put으로 수정하여 모델에 필요한 클래스를 지정하십시오.