如何使用Spring MVC和Thymeleaf实现Dart?

Tom*_*lst 6 spring-mvc dart thymeleaf

我目前正在尝试在使用Spring MVC(4.0.0)和Thymeleaf(2.1.1)作为模板引擎的现有项目中实现Dart.

目前我正在部署我所有的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>
Run Code Online (Sandbox Code Playgroud)

Thymeleaf重写网址http://localhost:8080/context/dart/...,这是正确的.

如果直接打开一个packages直接在其下面有文件夹的HTML文件,Dart的效果非常好.但是,在我的项目中并非如此,该项目具有友好的URL,/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!");
    }
}
Run Code Online (Sandbox Code Playgroud)

在web.xml中:

<filter-mapping>
    <filter-name>DartPackagesFilter</filter-name>
    <url-pattern>*.dart</url-pattern>
    <url-pattern>*.js</url-pattern>
</filter-mapping>
Run Code Online (Sandbox Code Playgroud)

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

<script src="packages/browser/dart.js"></script>

Jam*_*oer 1

您将需要单独处理 /packages/ 请求,就像您的解决方法一样。然而,只有当您使用实际的 .dart 文件时,才需要这些技巧进行开发。

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

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