【发布时间】:2011-09-30 17:36:17
【问题描述】:
使用基于 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 查询)。
【问题讨论】:
-
我一生都无法理解为什么“但在加载页面时需要执行脚本” 是一个如此大的问题,以至于您宁愿回退到 DOM 摆弄/遍历。你能详细说明一下吗?另外,你到底需要什么上下文路径?也许还有其他方法让你根本不需要它。
-
加载页面时执行 JavaScript 会阻止并行下载。也许单线没关系。 DOM 遍历可能更具惩罚性,但至少您可以选择延迟惩罚,直到您绝对需要它(如果您需要它)。我不确定按 ID 查找是否会受到惩罚。
-
我自己不需要 contextPath。我只是提出了一个“如果”。这是一个可能的例子:我正在动态加载一个 JS 文件并且需要知道它的路径。如果我提前知道 contextPath,我可以使用绝对路径,但是如果 contextPath 发生变化,那么我的脚本就会中断。我可以使用相对路径,但这取决于父 HTML 文档的位置。如果我移动文件,我的分页符。了解 contextPath,我可以通过动态生成的绝对路径来保护自己免受这些类型的破坏。
-
分配一个全局变量在现代浏览器中基本上是无操作的。我一个人不会为此使用老式的 scriptlets,而只是使用 EL。
var ctx = '${pageContext.request.contextPath}'; -
@BalusC 你太棒了。感谢您总是发布您所知道的有关如何使用 JSP 的信息。另外,我无法让您的建议生效。当我将它放在脚本标签中时,无法识别 EL。当我不将它放在脚本标签中时,错误表示变量定义错误。我该怎么做您在上面发布的内容?
标签: javascript jsp servlets