我正在使用DropWizard和Freemarker构建一个视图,该视图根据Web服务的结果显示不同类型的表单。
我已经将表单创建为视图 - 每个都有自己的ftl。
所以,在我的资源中,我发现我需要哪种形式,然后加载main.ftl,将表单视图作为参数传递(见下文)。
这不起作用。谁能看到我们哪里出错了?或者使用DropWizard和freemarker将视图链接在一起有一种完全不同的方式吗?
@GET
public Form getForm() {
FormView view = new FormView(service.getForm());
return new MainView(view);
}
public class FormView extends View {
private final Form form;
public FormView(Form form) {
super("formView.ftl");
this.form = form;
}
public Form getForm() {
return form;
}
}
public class MainView extends View {
private final FormView formView;
public MainView(FormView formView) {
super("main.ftl");
this.formView = formView;
}
public FormView getFormView() {
return formView;
}
}
public class TextForm extends View implements Form {
private int maxLength;
private String text;
public TextForm(int maxLength, String text) {
super("textForm.ftl");
this.maxLength = maxLength;
this.text = text;
}
public int getMaxLength() {
return maxLength;
}
public String getText() {
return text;
}
}
main.ftl
<#-- @ftlvariable formView="" type="MainView" -->
<html>
<body>
<#include formView.templateName /> // This evaluates to formView.ftl, but it seems to create a new instance, and doesn't have the reference to textForm.ftl. How do we reference a dropwizard view here?
</body>
</html>
formView.ftl
<#-- @ftlvariable form type="FormView" -->
${form?html} // also tried #include form.templateName
textForm.ftl
<#-- @ftlvariable text type="TextForm" -->
<div>${text?html}</div>
答案 0 :(得分:3)
根据讨论,我认为你需要这样的东西:
<#-- main.ftl -->
<html>
<body>
<#include formView.templateName>
</body>
</html>
formView.templateName
必须评估为textForm.ftl
,numberForm.ftl
,complexForm.ftl
或您可能拥有的任何表单视图。不需要在这些之间选择的中间文件。我认为您遇到了问题,因为FormView.getTemplateName()
正在返回一个硬编码的formView.ftl
。我认为你需要的是这个方法返回包含你想要显示的表单类型的实际模板文件的名称。
答案 1 :(得分:-1)
我已经想出了如何做到这一点。
您制作TemplateView
课程(见下文),其中View
。{
然后,所有View类都需要扩展TemplateView
。
构造函数需要一个额外的参数,&#34; body&#34;模板文件,即进入模板内部的主体。
然后,在模板文件中,执行类似的操作。
<html>
<body>
<h1>My template file</h1>
<#include body>
<footer>footer etc</footer>
</body>
</html>
TemplateView
班。
public abstract class TemplateView extends View
{
private final String body;
protected TemplateView(String layout, String body)
{
super(layout);
this.body = resolveName(body);
}
public String getBody()
{
return body;
}
private String resolveName(String templateName)
{
if (templateName.startsWith("/"))
{
return templateName;
}
final String packagePath = getClass().getPackage().getName().replace('.', '/');
return String.format("/%s/%s", packagePath, templateName);
}
}
希望这有助于某人。