你如何以正确的方式从JavaScript获取contextPath?

时间:2011-07-07 18:56:10

标签: javascript jsp servlets

使用基于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查询)。

6 个答案:

答案 0 :(得分:59)

基于评论中的讨论(特别是来自BalusC),可能不值得做比这更复杂的事情:

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

答案 1 :(得分:42)

得到它:D

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

重要说明:仅适用于“根”上下文路径。不适用于“子文件夹”,或者上下文路径中包含斜杠(“/”)。

答案 2 :(得分:5)

我认为你可以通过将数字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}" />";
}

答案 3 :(得分:3)

我使用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字符串

答案 4 :(得分:3)

由此审核解决方案 检查此页面的解决方案,然后做出以下解决方案,希望它能起作用: 例:

Javascript:

var context = window.location.pathname.substring(0, window.location.pathname.indexOf("/",2)); 
var url =window.location.protocol+"//"+ window.location.host +context+"/bla/bla";

答案 5 :(得分:0)

带有Thymeleaf解决方案的Spring Boot看起来像:

可以说我的上下文路径是/app/

在Thymeleaf中,您可以通过以下方式获取它:

<script th:inline="javascript">
    /*<![CDATA[*/
        let contextPath    = /*[[@{/}]]*/
    /*]]>*/
</script>