2013-06-16 2 views
0

freemarker를 뷰 템플릿으로 사용하여 Jsp 태그 라이브러리를 작성했습니다.Freemarker에서 중첩 된 JSP 태그에 액세스 할 수 없습니다.

custom.tld은 META-INF/tags /에 있습니다.

내 태그 Lib은 Jar로 번들로 제공됩니다. customTag.jar. 그것은 템플릿

다음 한 것은
AlertTag.ftl 
ButtonTag.ftl 

AlertTag.ftlButtonTag.ftl에 따라 달라집니다.

AlertTag.ftl : -

<#assign custom = JspTaglibs["http://www.abc.com/taglibs/custom"]> 

<h5>${this.title}</h5> 
<div class="alert ${this.typeClass} ${this.classes!}"> 
    <@custom.button btnType="close" <span class="alt">close</span></@custom.button> 
</div> 

이 customTag.jar 다른 웹 응용 프로그램의 일부입니다.

web.xml : - 웹 응용 프로그램에서 index.ftl 그것이

Expression JspTaglibs is undefined on line 1, column 17 in freemarker/AlertTag.ftl. 
The problematic instruction: 
---------- 
==> assignment: custom=JspTaglibs["http://www.abc.com/taglibs/custom"] [on line 1, column 1 in freemarker/AlertTag.ftl] 
---------- 

Java backtrace for programmers: 
---------- 
freemarker.core.InvalidReferenceException: Expression JspTaglibs is undefined on line 1, column 17 in freemarker/AlertTag.ftl. 

내가 JSP로 중첩 된 태그를 사용할 수 없습니다 나는 다음과 같은 예외를 throw 태그 <@custom.Alert id="abc">을 사용하려고 지금

<taglib> 
    <taglib-uri>http://www.abc.com/taglibs/custom</taglib-uri> 
    <taglib-location>/WEB-INF/custom.tld</taglib-location> 
</taglib> 

freemarker.

AlertTag.java

Configuration cfg = new Configuration(); 
    cfg.setClassForTemplateLoading(this.getClass(), "/"); 

    Template ftlTemplate = cfg.getTemplate(view); 
    JspWriter writer = pageContext.getOut(); 
    data.put("id", id) 

    Map<String, Object> rootMap = new HashMap<String,Object>(); 
    rootMap.put("this", data); 
    Environment environment = ftlTemplate.createProcessingEnvironment(rootMap, writer); 
    environment.process(); 
    //ftlTemplate.process(rootMap, writer); 

@Daniel


, 나는 위와 같이 환경을 사용하고 있지만, 어느 일을하지 않았다. 올바르게 사용하고 있습니까?

+0

어떻게 'AlertTag.ftl'자체를 호출합니까? – ddekany

+0

web-app의 index.ftl에서 호출하고 있습니다. <@ custom.Alert id = "abc">' – Mady

+0

나는 plain @ FreeMarker 매크로/지시어와는 달리'@customer.Alert'는 사용자 정의 JSP 태그입니다. 그래서 제가 의미하는 것은 기술적으로 AlertTag.ftl을 호출하는 방법입니다. 왜냐하면 JSP 태그는'index.ftl'에 사용 된 것과 아무런 관계가없는 자체 FreeMarker 엔진 인스턴스를 생성 할 것이고 따라서 JSP taglib 지원이 전혀 존재하지 않을 것으로 생각됩니다. – ddekany

답변

0

이 문제를 마침내 해결할 수있었습니다. 방법을 보여주는 @ddekanny와 동료들 덕분입니다.

FreemarkerServlet에서 만든 현재 환경에 내 템플릿을 추가하면 내 문제가 해결되었습니다.

Environment currentEnvironment = Environment.getCurrentEnvironment(); 
Configuration cfg = currentEnvironment.getTemplate().getConfiguration(); 

cfg.setClassForTemplateLoading(this.getClass(), "/"); 

Template ftlTemplate = cfg.getTemplate(view); 
JspWriter writer = pageContext.getOut(); 

currentEnvironment.setVariable("this", new SimpleHash(data)); 
currentEnvironment.setOut(writer); 
currentEnvironment.include(ftlTemplate); 
1

사용자 정의 JSP 태그 지원은 이에 특화된 FreeMarker 데이터 모델을 통해 구현 된 FreeMarker 확장 일뿐입니다. (freemarker.jar의 일부일 수도 있지만 기술적으로 제 3 자 확장이 될 수도 있습니다.)이 데이터 모델은 JspTaglibs 변수를 정의합니다. (Map이나 JavaBean 대신에, 데이터 모델 루트는 서블릿 스코프에서 서로 겹쳐 있습니다.)이 데이터 모델은 FreemarkerSerlvet으로 설정됩니다.

그래서 자신의 FreeMarker 엔진을 만들고 자신의 데이터 모델을 AlterTag.java에 만들면 모든 것을 잘라 버릴 수 있습니다. 어느 누구도 유사한 데이터 모델을 설정하려고 시도합니다. 누구도 FreemarkerServlet과 분리하지 못했거나 freemarker.core.Environmentindex.ftl 템플릿을 실행해야합니다. Environment.getCurrentEnvironment()으로 TLS에서 현재 환경을 가져온 다음 Environment 메서드를 사용하여 템플릿 로더가 액세스 할 수 있다고 가정하고 템플릿을 포함 할 수 있습니다. 그래서 당신은 당신 자신의 데이터 모델을 가지고 있지 않습니다 ... 다소 혼란 스럽습니다.

사실, FreeMarker는 자체 매크로/지시문/라이브러리 기능을 사용할 수 있도록 설계되었습니다. 개발자 중 일부는 사용자 정의 JSP 태그가 FreeMarker 지시어 인 것처럼 노출 될 수 있다는 생각을 가지고 있습니다 ... FTL 뷰로 마이그레이션하려고하지만 많은 JSP taglib가있는 경우 유용한 해킹 인 FreemarkerSerlvet이 있습니다. 자체가 "JSP Model 2"프레임 워크 (JSP에서 MVC를 강제 실행하는 데있어 상당히 어색한 모델) 내부로 마이그레이션하는 데 도움이되도록 추가되었습니다. 저쪽에 JSP 지원을 늘리면 ... 지금 당장 당신이 파고 들어야 할 가능성이 높습니다.

+0

내가 말한대로 질문에 대한 편집을하고 환경 변수를 사용했습니다. 위의 편집을 참조하십시오. 그러나 ID는 작동하지 않았습니다. 내가 올바르게 사용하고 있는지 확실하지 않습니다. – Mady

+0

태깅 .. @ ddekanny – Mady

+1

'index.ftl'이 새로운 환경이 아닌'Environment.getCurrentEnvironment()'를 사용하는 * 환경 * 환경을 사용해야했습니다. 주로 동일한 데이터 모델을 얻습니다. 그리고 각 템플릿 처리를 위해'Configuration'을 다시 만들어서는 안됩니다 ... 매번 템플릿 캐시를 잃어 버리게됩니다. 다시 말하지만,이 문제를 해결하는 것은 심해요. FM을 이해하고, 아마도 뷰 서블릿을 패치해야 할 것입니다. 그것은 해결 된 문제가 아닙니다. – ddekany

관련 문제