4

我有一堆静态 javascript 文件来处理 AJAX 函数来查询我的应用程序的各个部分,并且我部署了我的应用程序的多个版本,所以我可能有一些类似的东西:

https://www.myurl.com/projectName/ - production release
https://www.myurl.com/projectName_alpha/ - current alpha release
https://www.myurl.com/projectName_beta/ - current beta release
https://www.myurl.com/projectName_unstable/ - current development build

因此,如果我有一个想要进行 AJAX 调用的控制器“foo”,我不能硬编码/projectName/foo为 URL(因为它总是指向生产版本)。目前,我将一个脚本注入到我的每个视图中,该脚本将项目的基本 URL 作为全局变量:

<script type="text/javascript">
    // declare a global variable to hold the project's base URL
    var baseUrl = '<spring:url value="/" />';
</script>

然后在 javascript 文件中引用它:

var url = baseUrl + 'foo/';

它是功能性的,但是一个丑陋的解决方案,如果可以避免的话,我宁愿不污染全局命名空间。有没有人对我如何实施更好的解决方法有任何建议?

澄清一下:该解决方案应该适用于任何类型的请求,无论它是否基于 AJAX - 调用window.open、设置标签的src属性<img>以及对控制器进行 AJAX 调用都应该适用于该解决方案。无论基本 URL 是什么或它有多少层,它也应该适用,例如:

https://www.myurl.com/
https://www.myurl.com/projectName/
https://www.myurl.com/projectName_alpha/1.2.3/

都应该被正确检测到。

4

3 回答 3

2

我假设将所有 js 文件转换为 jsps 不是您想要的。

明显的解决方案是使用模块系统(例如require.js)并将该值包装在模块中,

类似于jsp的东西:

define({
    baseUrl: '<c:url value="/" />'
});

然后其他模块可能需要它。

然而,这可能需要对您的代码代码进行相当大的重组。

一个更简单的选择是创建一个包含在每个页面中的以下 jsp:

<script type="text/javascript">
    $(document).ready(function () {
        $(document).ajaxSend(function (ev, jqXHR, ajaxOptions) {
            var context = '${pageContext.request.contextPath}';
            ajaxOptions.url = context + '/' +  ajaxOptions.url;
        });
    });
</script>

它将上下文路径添加到使用 jquery 生成的每个 ajax 请求的 url。

只要您/在 ajax 请求中使用相对于上下文的 url(即:以 开头,没有上下文名称),这应该可以工作。

于 2013-09-06T19:14:48.500 回答
1

您可以使用全局位置对象和正则表达式

如果您处于 alpha 版本中, 请访问https://www.myurl.com/projectName_alpha/resource.html

您将从window.location对象中检索信息

window.location.protocol = "https"
window.location.host = "www.myurl.com"
window.location.pathname = "/projectName_alpha/resource.html"

如果您将通过拆分或通过正则表达式从路径名中提取上下文根,则可以使用该值来构建您需要的不同 URL。

如果您将使用 baseUrl 属性丰富位置对象,您可以在页面中轻松访问它

window.location.baseUrl = window.location.pathname.split("/")[1];

您可以通过以下方式构建您的网址:

var url = window.location.baseUrl + '/foo/';
于 2013-09-08T17:33:57.893 回答
1

你可以使用(JSTL核心网址标签)吗?我们通常使用@RequestMapping(value="/foo")组合 withvar url = '<c:url value="/foo">'并且它不是上下文根敏感的。尽管如果您需要重新设置脚本的基础,它确实需要在 JSP 级别更改上下文根的参数。

于 2013-09-06T20:21:38.487 回答