你如何从JavaScript获得contextPath,正确的方法?

使用基于Java的后端(即servlet和JSP),如果我需要JavaScript的contextPath,那么为什么要这样做? 我可以想到一些可能性。 我错过了吗?

1.将一个SCRIPT标签烧写到设置在某个JavaScriptvariables中的页面中

<script>var ctx = "<%=request.getContextPath()%>"</script> 

这是正确的,但在加载页面时需要执行脚本。

2.在一些隐藏的DOM元素中设置contextPath

 <span id="ctx" style="display:none;"><%=request.getContextPath()%></span> 

这是准确的,并且在加载页面时不需要任何脚本执行。 但是当你需要访问contextPath的时候你需要一个DOM查询。 DOM查询的结果可以caching,如果你关心性能。

3.尝试通过检查document.URL或BASE标签来解决JavaScript问题

 function() { var base = document.getElementsByTagName('base')[0]; if (base && base.href && (base.href.length > 0)) { base = base.href; } else { base = document.URL; } return base.substr(0, base.indexOf("/", base.indexOf("/", base.indexOf("//") + 2) + 1)); }; 

加载页面时不需要执行任何脚本,并且如果需要,还可以caching结果。 但是,只有当你知道你的上下文path是一个单一的目录时,这个方法才有效,而不是根目录( / )或者多个目录( /mypath/iscomplicated/ )。

我靠哪个方向

我喜欢隐藏的DOM元素,因为它不需要在页面加载时执行JavaScript代码。 只有当我需要contextPath,我需要执行任何事情(在这种情况下,运行一个DOM查询)。

根据评论(特别是BalusC)的讨论,可能不值得做比这更复杂的事情:

 <script>var ctx = "${pageContext.request.contextPath}"</script> 

明白了:D

 function getContextPath() { return window.location.pathname.substring(0, window.location.pathname.indexOf("/",2)); } alert(getContextPath()); 

重要说明:只能用于“根”上下文path。 不适用于“子文件夹”,或者上下文path中有斜线(“/”)。

我认为你可以通过结合数字1和像3号一样的function来实现你所期望的。

您不希望在页面加载时执行脚本,而更喜欢稍后调用某个function? 好的,只需创build一个函数,返回你将在variables中设置的值:

 function getContextPath() { return "<%=request.getContextPath()%>"; } 

这是一个函数,所以直到实际调用它才会被执行,但它直接返回值,而不需要进行DOM遍历或修改URL。

在这一点上,我同意@BalusC使用EL:

 function getContextPath() { return "${pageContext.request.contextPath}"; } 

或者取决于JSP回退到JSTL的版本:

 function getContextPath() { return "<c:out value="${pageContext.request.contextPath}" />"; } 

我使用id =“contextPahtHolder”呈现链接标记的属性的上下文path,然后在JS代码中获取它。 例如:

 <html> <head> <link id="contextPathHolder" data-contextPath="${pageContext.request.contextPath}"/> <body> <script src="main.js" type="text/javascript"></script> </body> </html> 

main.js

 var CONTEXT_PATH = $('#contextPathHolder').attr('data-contextPath'); $.get(CONTEXT_PATH + '/action_url', function() {}); 

如果上下文path是空的(就像在embedded式servlet容器中一样),它将是空string。 否则它包含contextPathstring