2

我正在使用 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>
4

2 回答 2

3

根据讨论,我认为你需要这样的东西:

<#-- main.ftl -->
<html>
<body>
    <#include formView.templateName>
</body>
</html>

formView.templateName必须评估为textForm.ftl,或您可能拥有的任何表单视图numberForm.ftlcomplexForm.ftl不需要在这些之间进行选择的中间文件。我认为您遇到了问题,因为FormView.getTemplateName()正在返回硬编码的formView.ftl. 我认为您需要的是此方法返回包含您要显示的表单类型的实际模板文件的名称。

于 2013-10-31T12:25:13.737 回答
-1

我已经想出了如何做到这一点。

您创建了一个TemplateView扩展类(见下文)View
然后,您的所有 View 类都需要扩展TemplateView

构造函数需要一个额外的参数,即“body”模板文件,即要进入模板的主体。

然后,在你的模板文件中,做这样的事情。

<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);
    }
}

希望这可以帮助某人。

于 2016-04-04T21:13:11.957 回答