私は今日、Freemarker から Tiles2 + Freemarker に移行するのに苦労していました。
私の freemarker テンプレートは、spring.ftl からのマクロを使用します。
web.xml で fremarker サーブレットを提供すると、私のモデルは freemarker に表示されますが、Spring FreemarkerView がそれを担当するため、特定の Spring 変数は (当然のことながら) モデルに取り込まれません。
特定の URL (「/tpl/*」など) に対して個別の DispatcherServlet を構成し、そのサーブレットのデフォルトのビュー リゾルバーとして freemarker リゾルバーを構成し、UrlFilenameViewController をデフォルトのコントローラーとして提供すると、特別なスプリング変数がモデルに取り込まれますが、私自身のモデルは非表示: リクエスト属性としてバインドされています。${Request.mymodel.myvar} を介してモデルにアクセスできますが、この方法ではすべての freemarker テンプレートを変更する必要があり、アイデアに臭いがします。
私の解決策は、UrlFilenameViewController を拡張し、モデルをリクエストから ModelAndView に追加することでした。
protected ModelAndView handleRequestInternal(HttpServletRequest request, HttpServletResponse response) {
ModelAndView mav = super.handleRequestInternal(request, response);
HashMap<String, Object> map = new HashMap<String, Object>();
Enumeration<String> attributes = request.getAttributeNames();
while(attributes.hasMoreElements()) {
String attribute = attributes.nextElement();
if("model".equals(attribute)) {
logger.debug("FreemarkerViewController.handleRequestInternal: putting attribute to model: " + attribute + "=" + request.getAttribute(attribute));
map.put(attribute, request.getAttribute(attribute));
}
}
logger.debug("FreemarkerViewController.handleRequestInternal: VIEW: " + mav.getViewName());
return new ModelAndView(mav.getViewName(), map);
}
しかし、このソリューションもやや臭いです。ビジネス コントローラーのモデルに何かを追加する場合は、ここに追加する必要があります。
私の問題に対するエレガントな解決策はありますか?