我目前正在尝试在现有项目中实施 Dart ,该项目使用 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 将网址重写为http://localhost:8080/context/dart/...
,这是正确的。
如果您直接打开一个直接在其下方有packages
文件夹的HTML文件,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的包:
<script src="packages/browser/dart.js"></script>
答案 0 :(得分:1)
您需要单独处理/打包/请求,例如您的解决方法。但是,当您使用实际的.dart文件时,只需要开发这些黑客。
部署应用时,您将使用dart2js
,dart2dart
,或者最有可能使用两者。这些工具生成一个单片脚本文件,该文件不依赖于外部包目录。
由于您只需要/ packages /目录进行开发,因此可以通过Dartium中的标志设置包URL。但是,根据我的经验,这是一个尴尬的解决方案,因为该标志适用于所有Dart应用程序 - 所有Dart应用程序都需要通过相同的URL方案获取包。它还使您很难与其他Dartium安装共享您的应用程序。