这是我的Dropwizard(0.8.5)应用程序的基本项目结构:
myapp/
src/main/groovy/
org/example/myapp/
MyApp.groovy
<lots of other packages/classes>
controllers/
site/
SiteController.groovy
dashboard/
DashboardController.groovy
org/example/myapp/views
site/
SiteView.groovy
dashboard/
DashboardView.groovy
src/main/resources/
assets/
images/
mylogo.png
org/example/myapp/views/
site/
header.ftl
index.ftl
dashboard/
dashboard.ftl
每个类别的要点是:
class MyApp extends Application<MyAppConfiguration> {
@Override
void initialize(Bootstrap<MyAppConfiguration> bootstrap) {
bootstrap.addBundle(new AssetsBundle('/assets/images', '/images', null, 'images'))
bootstrap.addBundle(new ViewBundle())
}
// etc...
}
@Path('/')
@Produces('text/html')
class SiteController {
@GET
SiteView homepage() {
new SiteView()
}
}
@Path('/app/dashboard')
@Produces('text/html')
class DashboardController {
@GET
DashboardView dashboard() {
new DashboardView()
}
}
header.ftl (dropwizard-views-freemarker)
=========================================
<!DOCTYPE html>
<html>
<head> <!-- lots of stuff omitted here for brevity --> </head>
<body>
<div class="well">
<img src="images/mylogo.png" />
<br/>This is the header!
</div>
index.ftl
=========
<#include "header.ftl">
<p>
Homepage!
</p>
</body>
</html>
dashboard.ftl
=============
<#include "../site/header.ftl">
<p>
Dashboard!
</p>
</body>
</html>
因此,您可以看到我使用DW作为实际的网络应用/用户界面,并且我正在使用Dropwizard Views(Freemarker绑定)以及Dropwizard Assets。
当我运行此应用程序时,应用程序启动就好了,我可以访问我的主页(从/
提供,映射到index.ftl
)以及我的信息中心页面(来自{ {1}}映射到/app/dashboard
)。
问题是这两个网页都使用dashboard.ftl
,这会引入我的header.ftl
,但只有我的主页实际上会显示徽标。在我的信息中心页面上,我< em> do 看到“这是标题!”消息,因此我知道标题正在解析并包含在我的仪表板模板中。 但是,我收到了一个无法加载图片的“X”图标,当我打开浏览器的开发工具时,我发现我的图像上有HTTP 404。
因此,DW似乎无法从未直接居住在根目录(assets/images/mylogo.png
)的视图/网址中找到我的图片资源。
在Dropwizard资产页面(上面提供的链接)上有一个特殊的警告:
您的应用程序或静态资产可以从根路径提供,但不能同时提供。当使用Dropwizard支持Javascript应用程序时,后者非常有用。要启用它,请将您的应用程序移动到子URL。
我不完全明白这意味着什么,但怀疑它是这里的罪魁祸首。无论哪种方式,任何人都会看到我出错的地方,以及我能做些什么(确切的步骤!)来解决这个问题?
答案 0 :(得分:1)
向上加载两个页面(有效页面和无效页面),并使用Firebug或Chrome开发工具检查徽标元素。它试图去哪条路?我怀疑在您的索引页面上它会转到http://some.thing/images/mylogo.png,而在您的信息中心上,它会尝试加载http://some.thing/app/dashboard/images/mylogo.png
尝试在模板中添加一个额外的/前面的路径,它应该可以从任何地方解析。
(原文在这里回答:Dropwizard-user Google Group)
答案 1 :(得分:1)
您需要在URI之前添加/:
<img src="/images/mylogo.png" />
这可以从RFC 3986 URI通用语法中的示例中解释,我提取了相关的示例。
5.4. Reference Resolution Examples
Within a representation with a well defined base URI of
http://a/b/c/d;p?q
a relative reference is transformed to its target URI as follows.
5.4.1. Normal Examples
"g" = "http://a/b/c/g"
"g/" = "http://a/b/c/g/"
"/g" = "http://a/g"
"../g" = "http://a/b/g"
"../../g" = "http://a/g"
放入前面的/使URI从域名开始,无论引用URI如何,这使您可以精确地执行所需的操作。