【问题标题】:Correct URLs in JavaScript files in Spring MVCSpring MVC 中 JavaScript 文件中的正确 URL
【发布时间】:2014-07-10 10:30:42
【问题描述】:

我对 Spring MVC 并不陌生,但总是想知道如何在 JavaScript 中使用正确的 URL(上下文名称感知)。 c:urlspring:url 之类的东西,但对于 JS:

例如如果我有一个在 Tomcat 中部署为 context 的 web 应用程序。它有一个页面:http://localhost:8080/context/some/directory/searchhttp://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 有没有现成的解决方案?

【问题讨论】:

  • 您可能应该将上下文名称(使用ServletContext#getServletContextName())放入您的javascript命名空间。您可以通过在加载 javascript 的 html 文件中包含 <script> 来执行此操作。然后你可以用这个上下文形成 URL。顺便说一句,你是如何在 C#/Ruby/Python 中做到这一点的?
  • 我不确定,但我在 Ruby 中看到了类似 @url:url 的内容。我知道问题是默认 servlet 不过滤 JS,并且在 Ruby JS 中是动态服务的,但我希望存在一些美丽的方式。

标签: java javascript spring spring-mvc servlets


【解决方案1】:

正如@Vikdor 的评论所暗示的,您必须让您的服务器以某种方式处理 JS 文件。我过去曾使用过这些方法中的每一种:

  • 使用解释页面来交付您的资源。一个 JSP 非常乐意提供 JS、JSON、CSS、HTML、PDF 或任何其他 Content-Type,只要您使用适当的 @page 指令来执行此操作。然后,您可以像编写 HTML 页面一样使用 JSTL 库。如果资源名称对您很重要,您必须编写一个控制器来解释由视图 foo.css.jsp 传递的对 foo.css 的请求,或者进行一些类似的翻译。此外,IDE 会感到困惑,祝福他们,因此您可能必须覆盖语法着色和自动完成功能才能充分利用这些功能。

  • 编写一个静态内容过滤器来解析资源以获得有趣的令牌(如${url}),并在交付之前将它们替换为适当的值。它增加了资源交付的一些开销,但对于我们的特定用例来说已经足够了。

在任何一种情况下,请确保您牢记您的应用能够使用适当的缓存标头交付这些资源,这样您的服务器就不会在交付重复资源时做额外的工作。

  • 在将修改后的静态资源部署到其最终位置之前,插入启动/部署步骤以转换 URL 路径,通常使用适合您的部署环境的值进行简单的搜索/替换。这样做的好处是,您可以按原样制作要在本地提供的资源,而无需部署,然后仅在将 URL 推送到非本地环境时才更改它们。

【讨论】:

  • 实际上,我完全按照您的说法使用 JSP 方法。我将此 JSP 服务为application/javascript,它具有url 功能:function url(path){return '<spring:url value="/">' + path}。好吧,如果没有更好的发明,我很高兴!
【解决方案2】:

对于那些通过谷歌找到这个问题的人,我将添加gist

<%@ page
    language="java"
    contentType="application/javascript; charset=UTF-8"
    trimDirectiveWhitespaces="true"
    pageEncoding="UTF-8"%>

<%@ include file="/WEB-INF/fragments/taglibs.jsp" %>

/**
 * Returns servlet context aware URL, ready to use for AJAX calls and resource
 * loading from JS.
 * 
 * This script must be included before any other JS sources that want to use
 * `url()`.
 * 
 * @param {string}
 *            path a servlet context unaware path of URL, like `api/users`
 * @returns {string} servlet context aware URL
 * @author madhead
 */
function url(path){
    return '<spring:url value="/" />' + path;
}

用法:

<script src="<spring:url value='/js/hsps/url.jsp' />"></script>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-05
    • 1970-01-01
    • 2013-03-04
    • 2019-02-17
    • 2017-12-01
    • 1970-01-01
    相关资源
    最近更新 更多