你如何从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