我对 Spring MVC 并不陌生,但总是想知道如何在 JavaScript 中使用正确的 URL(上下文名称感知)。类似于 c:url
或 spring:url
,但对于 JS:
例如如果我有一个在 Tomcat 中部署为 context
的 webapp。它有一个页面:http://localhost:8080/context/some/directory/search
和位于 http://localhost:8080/context/api
的 API。如果页面调用 API,我会遇到问题:
// This works wrong:
$http.get('/api/users', function(data){}) // will call http://localhost:8080/api/users - the context is lost!
$http.get('api/users', function(data){}) // will call http://localhost:8080/context/some/directory/api/users - wrong URL!
我希望存在某种过滤方式:
$http.get('${url:api/users}', function(data){}) // will call http://localhost:8080/context/api/users
我在 C# 和 Ruby 以及 Python 中看到了类似的东西。是否有任何现成的 Java/Spring 解决方案?
最佳答案
正如@Vikdor 的评论所暗示的,您必须让您的服务器以某种方式处理 JS 文件。我过去曾使用过这些方法中的每一种:
使用解释页面来提供您的资源。 JSP 非常乐意提供 JS、JSON、CSS、HTML、PDF 或任何其他
Content-Type
,只要您使用适当的@page
指令来执行此操作。然后,您可以像编写 HTML 页面一样使用 JSTL 库。如果资源名称对您很重要,您将不得不编写一个 Controller 来解释由 Viewfoo.css.jsp
传递的对foo.css
的请求,或者类似的翻译。此外,IDE 会感到困惑,保佑他们,因此您可能必须覆盖语法着色和自动完成才能充分利用这些功能。编写一个静态内容过滤器来解析资源以获得有趣的标记(如
${url}
),并在交付前用适当的值替换它们。它为资源交付增加了一些开销,但对于我们的特定用例来说性能足够了。
在任何一种情况下,请务必牢记您的应用通过适当的缓存 header 交付这些资源的能力,这样您的服务器就不会执行额外的工作来交付重复的资源。
- 在将修改后的静态资源部署到最终位置之前,插入一个启动/部署步骤以转换 URL 路径,通常使用简单的搜索/替换,使用适合您的部署环境的值。这样做的好处是允许您按原样制作资源以在本地提供服务,而无需部署,然后仅当您将它们推送到非本地环境时才更改 URL。
关于java - 在 Spring MVC 中更正 JavaScript 文件中的 URL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23788987/