一、相对路径
1. 方式一:通过宏实现
(1)步骤一,在spring的Freemarker配置属性添加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)步骤二,新增宏:
taglibs.ftl:
<#macro basePath><#if springMacroRequestContext.getContextPath()=="/">
<#else>${springMacroRequestContext.getContextPath()}
</#if></#macro>
<#global ctx><@basePath/></#global>
(3)步骤三,直接调用
<link rel="stylesheet" href="${ctx}/static/css/docs.css">
2. 方式二:通过assign实现
(1)步骤一,在spring的Freemarker配置属性添加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)步骤二,直接调用
<#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. 方式一:通过配置spring的拦截器实现
(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)步骤二,配置拦截器:
<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)步骤三,直接调用
<!DOCTYPE html>
<html>
<head>
<title>11</title>
${basePath}
2. 方式二:通过自定义Freemarker的View来实现(推荐)
(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)步骤二,实现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>
原本是使用<property name="viewClass" value="org.springframework.web.servlet.view.freemarker.FreeMarkerView" />的
(3)步骤三,直接调用
<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的拦截器固然可以实现获取绝对路径的功能,但很明显拦截器的执行比在Freemarker的View实现器里执行的数量多的多,所以自定义Freemarker的View是最优的方式。
参考: