Java 获取项目'的参考;Spring MVC中静态资源文件中的基本url
我有一堆静态javascript文件,这些文件处理AJAX函数以查询我的应用程序的各个部分,我部署了我的应用程序的多个版本,因此我可能会有以下内容: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
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/';