freemarker页面如何获取绝对路径basePath

传统用相对路径方式

1. freemarker获取系统相对路径方式

spring-mvc.xml 中配置



    
    
    
    
    
    
    
    
    

其中是关键。

ftl页面中设置

<#assign base=request.contextPath />



    
    首页
    
    
    

js文件中获取path

var base = document.getElementById("base").href;
// 与后台交互
_send = function(async, url, value, success, error) {
    $.ajax({
        async : async,
        url : base + '/' + url,
        contentType : "application/x-www-form-urlencoded; charset=utf-8",
        data : value,
        dataType : 'json',
        type : 'post',
        success : function(data) {
            success(data);
        },
        error : function(data) {
            error(data);
        }
    });
};

即可获取带项目名的路径,但这路径是相对路径,浏览器输入http://localhost:8080/test-web/index.html访问,一切OK。

使用绝对路径方式

1. 问题来源

用域名直接访问系统,修改tomcat7配置文件使用http://localhost/index.html方式,即配置默认80端口和虚拟项目名称为空。

server.xml配置



    

    

  

修改后var base = document.getElementById("base").href;获取的base值是http://localhost/index.html但这里的href=""所以导致ajax的请求url : base + '/' + url,出现了问题。

2. 解决方案

增加spring拦截器,获取HttpServletRequest,拼装绝对路径放在request的attribute属性中,ftl文件中直接${basePath}取值就可以了,静态文件 body中的隐藏表单,js获取path也可以通过隐藏表单获取var base = $('#base').val();

拦截器代码

public class BasePathInterceptor extends HandlerInterceptorAdapter {

private static Logger logger = Logger.getLogger(BasePathInterceptor.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;
    }

}

spring-mvc.xml中配置拦截器,拦截顺序至上而下


    
        
        
    
    
        
        
        
        
    

用上绝对路径之后,就会避免很多因为引用路径上带来的问题。

以上思路参考http://www.oschina.net/question/860595_140510的解决方案,通过继承freemarker视图解析类org.springframework.web.servlet.view.freemarker.FreeMarkerView,重写exposeHelpers方法,在spring里配置自己的freemarker的视图解析器,在模板中就可以通过${base}获取。

MyFreeMarkerView 代码

public class MyFreeMarkerView extends FreeMarkerView {
    private static final String CONTEXT_PATH = "base"; 
    @Override
    protected void exposeHelpers(Map model,
        HttpServletRequest request) throws Exception {
        model.put(CONTEXT_PATH, request.getContextPath());
        super.exposeHelpers(model, request);
    }

}

spring-mvc.xml配置


    
    

一直在索取,却从未付出,此处略微敬上

你可能感兴趣的:(spring-mvc,url,request,freemarker)