FreemarkerとSpring開発:相対的な力と絶対的な経路を得るための最適な方法


一、相対パス1.方式一:マクロによって(1)ステップを実現し、springのFreemaker配置属性にspringサポートを追加する.
                <bean class="org.springframework.web.servlet.view.freemarker.FreeMarkerViewResolver">
                    <property name="order" value="2"/>
                    <property name="viewClass" value="com.myetak.basic.MyFreeMarkerView" />
                    <property name="viewNames" value="*.ftl"/>
                    <property name="cache" value="false"/>
                    <property name="prefix" value=""/>
                    <property name="suffix" value=""/>
                    <property name="exposeSpringMacroHelpers" value="true"/>
                    <property name="contentType" value="text/html; charset=utf-8"/>
                </bean>
(2)ステップ2、マクロの追加:taglibs.ftl:
<#macro basePath><#if springMacroRequestContext.getContextPath()=="/">
<#else>${springMacroRequestContext.getContextPath()}
</#if></#macro> 
<#global ctx><@basePath/></#global>
(3)ステップ3で、直接に<link rel=“styless heet”href=“$cctx]/static/css/docs.css”を呼び出します.
2.方式2:assignにより(1)ステップ1を実現し、springのFreemaker配置属性にspringサポートを追加する.
    <bean id="viewResolverFtl" class="org.springframework.web.servlet.view.freemarker.FreeMarkerViewResolver">
         <property name="viewClass" value="com.myetak.basic.MyFreeMarkerView" />
        <property name="suffix" value=".ftl" />
        <property name="contentType" value="text/html;charset=UTF-8" />
        <property name="exposeRequestAttributes" value="true" />
        <property name="exposeSessionAttributes" value="true" />
        <property name="exposeSpringMacroHelpers" value="true" />
        <property name="requestContextAttribute" value="request" />
        <property name="cache" value="true" />
        <property name="order" value="0" />
    </bean>
(2)ステップ2、直接呼び出し
<#assign base=request.contextPath />
<!DOCTYPE html>
<html>
<head>
    <base id="base" href="${base}">
    <title>  </title>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <link href="${base}/static/bootstrap-3.3.4/css/bootstrap.min.css" rel="stylesheet">
    <script src="${base}/static/bootstrap-3.3.4/js/bootstrap.min.js"></script>
 
二、絶対パス1.方式1:スプリングのブロックを構成することにより(1)ステップ1を実現し、スクリーンセーバーを追加する:
public class BaseInterceptor extends HandlerInterceptorAdapter {
 private static Logger logger = LoggerFactory.getLogger(BaseInterceptor.class);
 public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
  String scheme = request.getScheme();
  String serverName = request.getServerName();
  int port = request.getServerPort();
  String path = request.getContextPath();
  String basePath = scheme + "://" + serverName + ":" + port + path;
  logger.info(basePath);
  request.setAttribute("basePath", basePath);
  return true;
 }
}
(2)ステップ2で、スクリーンセーバーを設定します.
    <mvc:interceptors>
        <mvc:interceptor>
            <mvc:mapping path="/**"/>
            <bean class="com.myetak.interceptor.BaseInterceptor"></bean>
        </mvc:interceptor>
        <mvc:interceptor>
            <mvc:mapping path="/**"/>
            <mvc:exclude-mapping path="/*/login.html"/>
            <mvc:exclude-mapping path="/*/static/**"/>
            <mvc:exclude-mapping path="/*/webjars/**"/>
            <bean class="com.myetak.interceptor.LoginInterceptor"></bean>
        </mvc:interceptor>
    </mvc:interceptors>
 
(3)ステップ3、直接呼び出し
<!DOCTYPE html>
<html>
    <head>
        <title>11</title>
     ${basePath}
 
2.方式2:FreemarkerのViewをカスタマイズすることにより、(1)手順1、Freemarkerをカスタマイズしたview実現器を追加する.
public class MyFreeMarkerView extends FreeMarkerView { private static Logger logger = LoggerFactory.getLogger(MyFreeMarkerView.class);
 private static final String CONTEXT_PATH = "base";
 @Override
 protected void exposeHelpers(Map<String, Object> model,
         HttpServletRequest request) throws Exception {
  String scheme = request.getScheme();
  String serverName = request.getServerName();
  int port = request.getServerPort();
  String path = request.getContextPath();
  String basePath = scheme + "://" + serverName + ":" + port + path;
  model.put(CONTEXT_PATH, basePath);
  logger.info("===========" + basePath);
  super.exposeHelpers(model, request);
 }
}
(2)ステップ2で、Spring構成を実現する:
    <bean id="viewResolverFtl" class="org.springframework.web.servlet.view.freemarker.FreeMarkerViewResolver">
         <property name="viewClass" value="com.myetak.basic.MyFreeMarkerView" />
        <property name="suffix" value=".ftl" />
        <property name="contentType" value="text/html;charset=UTF-8" />
        <property name="exposeRequestAttributes" value="true" />
        <property name="exposeSessionAttributes" value="true" />
        <property name="exposeSpringMacroHelpers" value="true" />
        <property name="requestContextAttribute" value="request" />
        <property name="cache" value="true" />
        <property name="order" value="0" />
    </bean>
元々は<base id="base" href="${base}"> <meta http-equiv="content-type" content="text/html; charset=utf-8"> <link rel="stylesheet" href="${base}/webjars/bootstrap/3.1.1/css/bootstrap.min.css"> <link rel="stylesheet" href="${base}/webjars/bootstrap/3.1.1/css/bootstrap-theme.min.css"> <link rel="stylesheet" href="${base}/static/css/docs.css"> 
まとめて、springに配置されたスクリーンセーバーは絶対パスを取得する機能を実現することができますが、スクリーンセーバーの実行はFreemakerのView実現器の中で実行する数量より多いので、FreemakerのViewをカスタマイズするのが最適な方式です.
 
参考:
  • http://segmentfault.com/a/1190000002967105
  • http://blog.csdn.net/sinlff/article/details/5755033
  • http://blog.csdn.net/marry20091208/article/details/6043191