Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/356.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 获取项目'的参考;Spring MVC中静态资源文件中的基本url_Java_Javascript_Spring Mvc - Fatal编程技术网

Java 获取项目'的参考;Spring MVC中静态资源文件中的基本url

Java 获取项目'的参考;Spring MVC中静态资源文件中的基本url,java,javascript,spring-mvc,Java,Javascript,Spring Mvc,我有一堆静态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

我有一堆静态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
因此,如果我有一个控制器“foo”,我想对其进行AJAX调用,我不能硬编码
/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>
它是功能性的,但却是一个丑陋的解决方案,如果可以避免的话,我宁愿不污染全局名称空间。有人对我如何实施更好的解决方案有什么建议吗

澄清一下:该解决方案应该适用于任何类型的请求,无论它是否基于AJAX——调用
窗口。打开
,设置
标记的
src
属性,以及对控制器进行AJAX调用都应该适用于该解决方案。无论基本URL是什么或它有多少层,它都应该适用,例如:

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

所有这些都应该被正确检测。

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

显而易见的解决方案是使用模块系统(例如)并将该值包装到模块中

类似于jsp的东西,带有:

define({
    baseUrl: '<c:url value="/" />'
});
定义({
基本URL:“”
});
然后,其他模块可能需要这些功能

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

一个更简单的选项是创建一个包含在每个页面中的以下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>

$(文档).ready(函数(){
$(文档).ajaxSend(函数(ev、jqXHR、ajaxOptions){
var context='${pageContext.request.contextPath}';
ajaxOptions.url=context+'/'+ajaxOptions.url;
});
});
它将上下文路径前置到使用jquery发出的每个ajax请求的url

只要在ajax请求中使用与上下文相关的URL(即:从
/
开始,没有上下文名称),就应该可以使用此功能。

可以使用()吗?我们通常将
@RequestMapping(value=“/foo”)
var url='
结合使用,并且它不区分上下文根。尽管如果需要重新设置脚本的基础,它确实需要JSP级别的参数来更改上下文根。

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

如果你在alpha版本中,p.e。

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

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

如果要使用baseUrl属性丰富location对象,则可以在页面中轻松访问它

window.location.baseUrl = window.location.pathname.split("/")[1];
您可以通过以下方式构建URL:

var url = window.location.baseUrl + '/foo/';

您在ajax中使用的js库是什么?同时拥有一个具有良好定义语义的全局变量并不是真正的“污染”。几乎可以肯定的是,任何其他的解决方案都会比这更难看。我正在使用jQuery来实现AJAX。你可能是对的,替代解决方案更丑陋;我只是想看看是否有人有一个巧妙的解决方法。从/projectName\u beta/,你不能只取“foo”而不是“/projectName\u beta/foo”吗?相对URL在脚本标记和ajax上工作很好…如果我获取“foo”,它引用当前控制器路径,例如“/projectName\u beta/controller/foo”,这不是我想要的。问题是你不能引用静态js文件中的那些。我喜欢require.js的想法,但它需要对我的项目进行大量的代码重组。AJAX建议是功能性的,但只适用于AJAX请求(显然);我忘了在问题中指定它应该适用于URL的任何使用(现在更正)+1,如果没有其他人给你更好的东西,我倾向于奖励你。@asgaliant在这种情况下,你不得不有一个全局var/use require,因为你的js代码的任何地方都可以有
window.location
赋值等等。此外,js模板呈现变得很棘手,因为您必须确保模板引擎能够访问url前缀,以便呈现正确的url。
window.location.baseUrl = window.location.pathname.split("/")[1];
var url = window.location.baseUrl + '/foo/';