Java 上下文路径是否可以在每个请求上更改?

Java 上下文路径是否可以在每个请求上更改?,java,tomcat,heroku,openshift,contextpath,Java,Tomcat,Heroku,Openshift,Contextpath,我正在开发一个web应用程序,发生了一些非常奇怪的事情。我在本地的tomcat上运行我的JEE应用程序,一切都很顺利。当我在Heroku或Openshift上在线部署应用程序时,两者都会在每次请求时更改上下文路径。例如,如果我点击一个链接,应用程序会正确地显示我期望的内容,但从现在开始,我会在JSP中使用上下文路径生成链接,并更改当前url。如果我将浏览器中的url修改为网站主页,它将再次更改。可能是配置问题?我头痛。 我正在使用URLRewite来创建漂亮的URL,因此,如果我的网站的主页是,

我正在开发一个web应用程序,发生了一些非常奇怪的事情。我在本地的tomcat上运行我的JEE应用程序,一切都很顺利。当我在Heroku或Openshift上在线部署应用程序时,两者都会在每次请求时更改上下文路径。例如,如果我点击一个链接,应用程序会正确地显示我期望的内容,但从现在开始,我会在JSP中使用上下文路径生成链接,并更改当前url。如果我将浏览器中的url修改为网站主页,它将再次更改。可能是配置问题?我头痛。 我正在使用URLRewite来创建漂亮的URL,因此,如果我的网站的主页是,那么就会有一篇文章。当我在主页上点击一个链接查看一篇文章时,页面会相应地发生变化。在页面更改后,如果我在使用${pageContext.request.contextPath}生成的菜单中单击主页链接,它将转到我已经看到的同一页面。 在站点的每个页面中,我都添加了如下javascript变量:

<script type="text/javascript">
    context = "<%=request.getContextPath()%>";
</script>
<li class="active"><a href="">Home</a></li>
<li class="active"><a href="${pageContext.request.contextPath}/">Home</a></li>
我相信,这里的contextpath总是空的,它必须是空的。 这是生成我的站点主菜单的JSP的内容:

<nav class="red accent-4">
    <div id="uc-nav-menu-container" class="nav-wrapper">
        <!--<a href="#" class="brand-logo right">Unical Coin</a>-->
        <a href="#" data-activates="mobile-demo" class="button-collapse left"><i class="material-icons">menu</i></a>
        <ul id="nav-mobile" class="left hide-on-med-and-down">
            <li class="active"><a href="${pageContext.request.contextPath}">Home</a></li>
            <li><a href="#">Mission</a></li>
            <li><a href="#">Tecnologia</a></li>
            <li><a href="#">About</a></li>
            <li><a href="#">Links</a></li>
        </ul>
        <ul class="red accent-4 side-nav" id="mobile-demo">
            <li class="active"><a href="${pageContext.request.contextPath}">Home</a></li>
            <li><a class="white-text" href="#">Mission</a></li>
            <li><a class="white-text" href="#">Tecnologia</a></li>
            <li><a class="white-text" href="#">About</a></li>
            <li><a class="white-text" href="#">Links</a></li>
        </ul>
        <div id="uc-user-menu-container" class="right"></div>
    </div>
</nav>
这是生成文章页面的JSP:

<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
         pageEncoding="ISO-8859-1"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
    <head>
        <jsp:include page="/WEB-INF/components/imports/default-head-imports.jsp"></jsp:include>
    </head>
    <body class="blue-grey lighten-5">
        <jsp:include page="/WEB-INF/components/nav-menu.jsp"></jsp:include>
        <div class="container">
            <jsp:include page="/WEB-INF/components/single-article-content.jsp"></jsp:include>
        </div>
        <jsp:include page="/WEB-INF/components/footer.jsp"></jsp:include>
        <jsp:include page="/WEB-INF/components/imports/default-foot-imports.jsp"></jsp:include>
    </body>
</html>

每个页面中的javascript变量仅在包含的/WEB-INF/components/imports/default-head-imports.jsp中生成。

这里的问题是根应用程序的上下文路径实际上是空字符串,而不是/正如您所期望的那样。如果以ROOT用户身份部署应用程序,您将获得如下主链接:

<script type="text/javascript">
    context = "<%=request.getContextPath()%>";
</script>
<li class="active"><a href="">Home</a></li>
<li class="active"><a href="${pageContext.request.contextPath}/">Home</a></li>
这可能是无效的。。。我不是EL专家,但你知道


哦,虽然/可能是一个法律背景路径,但它不太可能给你预期的结果。永远不要在元素中放置路径,也不要在server.xml中放置元素,除非您必须这样做。相反,使用WAR文件的名称或部署描述符XML的文件名将上下文部署到所需的路径上,包括根(如果希望它是根web应用程序)。

您必须将WAR文件名称更改为ROOT.WAR并将其上载到webapps文件夹中,这样上下文路径将为“/”。在您的本地计算机上,它可以正常工作,因为上下文路径是在IDE上设置的:请看这里:我这样做了,但在IDE中更改上下文路径也没有任何作用。使用/作为上下文路径是否合法?是否合法?我确信没有人会因为你使用“/”作为上下文路径而起诉你。或者这是一个新的推特帖子,我渐渐老去理解它了-上下文路径是如何变化的?你能给我们举个例子吗?你的解决方案让我的代码可以运行,但请告诉我这是一个Tomcat配置问题,因为在我的本地安装上一切都正常。谢谢你的回答,我也会研究你的建议。