【问题标题】:How to implement Dart with Spring MVC and Thymeleaf?如何使用 Spring MVC 和 Thymeleaf 实现 Dart?
【发布时间】:2013-12-03 05:58:45
【问题描述】:

我目前正在尝试在使用 Spring MVC (4.0.0) 和 Thymeleaf (2.1. 1) 作为模板引擎。

目前我正在将我所有的 Dart 资源部署到/dart,如下所示。

<link rel="import" th:href="@{/dart/wb-control-text.html}" />
<script type="application/dart" th:src="@{/dart/packages/polymer/init.dart}"></script>
<script th:src="@{/dart/packages/browser/dart.js}"></script>

Thymeleaf 将 url 重写为 http://localhost:8080/context/dart/...,这是正确的。

如果您直接打开一个 HTML 文件,该文件的正下方有 packages 文件夹,Dart 的效果会非常好。但是,在我的项目中情况并非如此,它具有 友好的网址,例如 /action/users/browse,并且您无法直接访问 HTML 文件。

Dart 库尝试导入包时,我收到 404 错误,因为它在错误的位置(例如 /dart/packages/polymer/packages/polymer/polymer.dart)寻找它。

我是否需要提供 URL 请求处理程序或过滤器来处理所有 **/packages/** 请求(并且只使用相对于当前 url 的路径)?或者 Dart 中是否有一个选项可以设置它应该在哪里寻找包?

对此有什么解决方案(或变通方法)?

编辑

我目前有一个可行的临时解决方案,但它很脏,我仍在寻找更清洁的解决方案。

我将包添加到我的类路径中,并创建了一个 DartPackagesFilter 流式传输资源:

public class DartPackagesFilter extends OncePerRequestFilter

    @Override
    protected void doFilterInternal(final HttpServletRequest request, 
                    final HttpServletResponse response, 
                    final FilterChain filterChain) 
                    throws ServletException, IOException {
        final String uri = request.getRequestURI();

        final int index = uri.indexOf("/packages/");

        if ( index != -1 ){
             final String resourceName = uri.substring(index);
             writeResourceToResponse(response, resourceName);
             return;
        }

        filterChain.doFilter(request, response);
    }

    private void writeResourceToResponse(final HttpServletResponse response, final String  resourceName) throws IOException {
        final ClassPathResource resource = new ClassPathResource(resourceName);

        response.setContentType(resolveContentType(resourceName));

        ChannelUtils.stream(resource.getInputStream(), response.getOutputStream());
    }

    private String resolveContentType(final String resourceName){
        if ( resourceName.endsWith("dart") ){
            return "application/dart";

        } else if ( resourceName.endsWith("js")){
            return "text/javascript";
        }

        throw new IllegalArgumentException("Resource must be a Dart or Javascript file!");
    }
}

在 web.xml 中:

<filter-mapping>
    <filter-name>DartPackagesFilter</filter-name>
    <url-pattern>*.dart</url-pattern>
    <url-pattern>*.js</url-pattern>
</filter-mapping>

在我的 HTML 文件中,我指的是相对于当前 URL 的包:

&lt;script src="packages/browser/dart.js"&gt;&lt;/script&gt;

【问题讨论】:

    标签: spring-mvc dart thymeleaf


    【解决方案1】:

    您需要单独处理 /packages/ 请求,就像您的解决方法一样。但是,只有在使用实际的 .dart 文件时才需要这些技巧。

    部署应用时,您将使用dart2jsdart2dart,或者很可能同时使用两者。这些工具生成一个不依赖于外部包目录的单一脚本文件。

    由于您只需要 /packages/ 目录进行开发,因此可以通过 Dartium 中的标志设置包 URL。然而,根据我的经验,这是一个尴尬的解决方案,因为该标志适用于所有 Dart 应用程序——所有 Dart 应用程序都需要通过相同的 URL 方案获取包。这也使得与其他 Dartium 安装共享您的应用变得困难。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-05-26
      • 1970-01-01
      • 2020-12-03
      • 1970-01-01
      • 2016-12-25
      • 2015-11-25
      • 2016-01-22
      • 2023-03-07
      相关资源
      最近更新 更多