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是最優的方式。
參考: