使用基于 Java 的后端(即 servlet 和 JSP),如果我需要来自 JavaScript 的 contextPath,那么推荐的模式是什么,为什么?我能想到几种可能性。我有什么遗漏吗?
1. 将 SCRIPT 标签刻录到页面中,并在一些 JavaScript 变量中设置它
<script>var ctx = "<%=request.getContextPath()%>"</script>
这是准确的,但在加载页面时需要执行脚本。
2.在一些隐藏的DOM元素中设置contextPath
<span id="ctx" style="display:none;"><%=request.getContextPath()%></span>
这是准确的,并且在加载页面时不需要执行任何脚本。但是当需要访问 contextPath 时,您确实需要一个 DOM 查询。如果您非常关心性能,则可以缓存 DOM 查询的结果。
<强> 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));
};
这在加载页面时不需要执行任何脚本,如果需要,您还可以缓存结果。但这仅在您知道上下文路径是单个目录时才有效——而不是根目录 (/
) 或多个目录 (/mypath/iscomplicated/
)。
我向哪个方向倾斜
我更喜欢隐藏的 DOM 元素,因为它不需要在页面加载时执行 JavaScript 代码。只有当我需要 contextPath 时,我才需要执行任何操作(在这种情况下,运行 DOM 查询)。
var ctx = '${pageContext.request.contextPath}';
根据评论中的讨论(特别是来自 BalusC),可能不值得做比这更复杂的事情:
<script>var ctx = "${pageContext.request.contextPath}"</script>
明白了:D
function getContextPath() {
return window.location.pathname.substring(0, window.location.pathname.indexOf("/",2));
}
alert(getContextPath());
重要说明:仅适用于“根”上下文路径。不适用于“子文件夹”,或者上下文路径中有斜杠(“/”)。
/foo/bar
),则此操作失败。
我认为您可以通过将数字 1 与调用数字 3 中的函数相结合来实现您正在寻找的东西。
您不想在页面加载时执行脚本并希望稍后调用函数?很好,只需创建一个函数来返回您在变量中设置的值:
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}" />";
}
function getContextPath() {..}
实际上扩展为 window.getContextPath = function() {..}
。在这一点上,我同意 BalusC 的观点,即 var ctx = '${pageContext.request.contextPath}';
之类的东西没有任何问题。它是尽可能接近无操作。
通过此查看解决方案检查此页面的解决方案,制作以下解决方案我希望它有效:示例:
Javascript:
var context = window.location.pathname.substring(0, window.location.pathname.indexOf("/",2));
var url =window.location.protocol+"//"+ window.location.host +context+"/bla/bla";
我使用 id="contextPahtHolder" 将上下文路径渲染到链接标签的属性,然后在 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() {});
如果上下文路径为空(如在嵌入式 servlet 容器中),它将是空字符串。否则它包含 contextPath 字符串
${request.contextPath}