1、相对路径
1. 方式一:经过宏实现
(1)步骤一,在spring的Freemarker配置属性添加spring支持
css
<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:
html
<#macro basePath><#if springMacroRequestContext.getContextPath()=="/"> <#else>${springMacroRequestContext.getContextPath()} </#if></#macro> <#global ctx><@basePath/></#global>
(3)步骤三,直接调用
<link rel="stylesheet" href="${ctx}/static/css/docs.css">java
2. 方式二:经过assign实现
(1)步骤一,在spring的Freemarker配置属性添加spring支持
web
<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)步骤二,直接调用
spring
<#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)步骤一,新增拦截器:
bootstrap
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)步骤二,配置拦截器:
segmentfault
<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)步骤三,直接调用
mvc
<!DOCTYPE html> <html> <head> <title>11</title> ${basePath}
2. 方式二:经过自定义Freemarker的View来实现(推荐)
(1)步骤一,新增自定义Freemarker的view实现器
app
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配置:
ide
<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是最优的方式。
参考: