Freemarker和Spring開發:獲取相對路勁和絕對路徑的最優方式

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

 

參考:

  1. http://segmentfault.com/a/1190000002967105

  2. http://blog.csdn.net/sinlff/article/details/5755033

  3. http://blog.csdn.net/marry20091208/article/details/6043191

相關文章
相關標籤/搜索