JavaWeb项目获取绝对路径basePath

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

spring-mvc.xml 中配置

<!-- FreeMarker视图解析 如返回userinfo。。在这里配置后缀名ftl和视图解析器。。 -->
<bean id="viewResolverFtl"
    class="org.springframework.web.servlet.view.freemarker.FreeMarkerViewResolver">
    <property name="viewClass"
        value="org.springframework.web.servlet.view.freemarker.FreeMarkerView" />
    <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="requestContextAttribute"
value="request" />是关键。

ftl页面中设置

<#assign base=request.contextPath />
<!DOCTYPE html>
<html lang="zh">
<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>

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配置

<Connector port="80" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" />
<Host name="localhost"  appBase="webapps"
        unpackWARs="true" autoDeploy="true">
    <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
           prefix="localhost_access_log." suffix=".txt"
           pattern="%h %l %u %t &quot;%r&quot; %s %b" />

<Context path="" docBase="test-web" reloadable="true"/>

</Host>

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

2. 解决方案

(1)增加spring拦截器,获取HttpServletRequest,拼装绝对路径放在request的attribute属性中,ftl文件中直接${basePath}取值就可以了,静态文件<link
href="${basePath}/static/bower_components/bootstrap/dist/css/bootstrap.min.css"
rel="stylesheet">body中的隐藏表单<input type="hidden"
id="base" value="${basePath}" />,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中配置拦截器,拦截顺序至上而下

<mvc:interceptors>
    <mvc:interceptor>
        <mvc:mapping path="/**"/>
        <bean class="com.test.interceptor.BasePathInterceptor"></bean>
    </mvc:interceptor>
    <mvc:interceptor>
        <mvc:mapping path="/**"/>
        <mvc:exclude-mapping path="/login.html"/>
        <!-- <mvc:exclude-mapping path="/*/ajax/**"/> -->
        <bean class="com.test.interceptor.LoginInterceptor"></bean>
    </mvc:interceptor>
</mvc:interceptors>

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

(2)通过继承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<String, Object> model,
        HttpServletRequest request) throws Exception {
        model.put(CONTEXT_PATH, request.getContextPath());
        super.exposeHelpers(model, request);
    }

}

spring-mvc.xml配置

<bean class="org.springframework.web.servlet.view.freemarker.FreeMarkerViewResolver">
    <!-- 自定义FreeMarkerView,用来定义项目的全局路径 -->
    <property name="viewClass" value="com.kyt.utils.MyFreeMarkerView" />
</bean>

原文地址:https://www.cnblogs.com/guodong-wang/p/10105247.html

时间: 2024-10-04 21:47:30

JavaWeb项目获取绝对路径basePath的相关文章

JavaWeb项目里面的路径获取方法总结

仅为资源搬运,个人还未充分理解... request.getRealPath不推荐使用request.getRealPath("") 这个方法已经不推荐使用了 request.getRealPath不推荐使用request.getRealPath("") 这个方法已经不推荐使用了,那代替它的是什么方法 Deprecated. As of Version 2.1 of the Java Servlet API, use ServletContext.getRealPa

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

传统用相对路径方式 1. freemarker获取系统相对路径方式 spring-mvc.xml 中配置 <!-- FreeMarker视图解析 如返回userinfo..在这里配置后缀名ftl和视图解析器.. --> <bean id="viewResolverFtl" class="org.springframework.web.servlet.view.freemarker.FreeMarkerViewResolver"> <pr

java项目获取文件路径总结

版权声明:本文为博主原创文章,未经博主允许不得转载. 目录(?)[+] java获取文件路径的方式比较多,总结可能有疏漏. 1.java.lang.System.getProperty(String key) System.getProperty("user.dir")这个方法的作用可以获取当前工程的根目录. ![我的一个项目](http://img.blog.csdn.net/20160322141415562) 比如获取上图中项目的根目录:C:\Users\Administrato

java web项目获取各种路径

1.可以在servlet的init方法里 String path = getServletContext().getRealPath("/"); 这将获取web项目的全路径 例如 :E:\eclipseM9\workspace\tree\ tree是我web项目的根目录 2.你也可以随时在任意的class里调用 this.getClass().getClassLoader().getResource("/").getPath(); 这将获取 到classes目录的全

JavaWeb项目获取路径各种方法。

在jsp和class文件中调用的相对路径不同. 在jsp里,根目录是WebRoot 在class文件中,根目录是WebRoot/WEB-INF/classes 当然你也可以用System.getProperty("user.dir")获取你工程的绝对路径. 另:在Jsp,Servlet,Java中详细获得路径的方法! 1.jsp中取得路径: 以工程名为TEST为例: (1)得到包含工程名的当前页面全路径:request.getRequestURI() 结果:/TEST/test.jsp

获取资源路径

一.web项目获取资源路径很简单 1.例如jsp中获取路径的写法如下: 1 <% 2 String path = request.getContextPath(); 3 String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; 4 %> 2.bean中获取路径的写法如下: 1 Str

JAVA获取服务器路径的方法

1.在JSF环境中获取到ServletContext: ServletContext sc = (ServletContext)FacesContext. getCurrentInstance().getExternalContext().getContext(); 2.servlet中获得项目绝对路径 String filePath=this.getServletConfig(). getServletContext().getRealPath("/"); 根目录所对应的绝对路径 r

JavaScript中获取当前项目的绝对路径

最近在做JavaWeb项目相关的东西,几乎每天都遇到很多问题,主要是因为自己对JavaWeb方面的知识不是很清楚,尽量把自己在项目中遇到的问题都记录下来,方便以后查阅. 在我们的项目中有这样的需要,当在页面停留时间过长时,自动调回主页面first.jsp,所以我就写了个load.js代码文件,然后在每个jsp页面上都引用它,这样就出现了问题,因为每个页面不都是在WebRoot的根目录下的,有可能是在其子目录下,如下图所示: 所以对于每个jsp页面所跳转回主页面first.jsp的路径就不相同,所

获取web项目的绝对路径的方法总结

一.用Jsp获取 1.获取文件的绝对路径 String file="文件";(例如:data.mdb) String path=application.getRealPath(file); 结果: E:\java_web\workspace\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\wtpwebapps\myWebsite\文件 2.获取文件的绝对路径 String p2=request.getRequestURI(); 结