FreemarkerとSpring開発:相対的な力と絶対的な経路を得るための最適な方法
7116 ワード
一、相対パス1.方式一:マクロによって(1)ステップを実現し、springのFreemaker配置属性にspringサポートを追加する.
2.方式2:assignにより(1)ステップ1を実現し、springのFreemaker配置属性にspringサポートを追加する.
二、絶対パス1.方式1:スプリングのブロックを構成することにより(1)ステップ1を実現し、スクリーンセーバーを追加する:
(3)ステップ3、直接呼び出し
2.方式2:FreemarkerのViewをカスタマイズすることにより、(1)手順1、Freemarkerをカスタマイズしたview実現器を追加する.
まとめて、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
<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をカスタマイズするのが最適な方式です.
参考: