Freemarker和Spring开发:获取相对路劲和绝对路径的最优方式

一、相对路径
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是最优的方式。

 

参考:

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

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

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

转载于:https://my.oschina.net/pagecorrect/blog/610037

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值