当前位置: 首页 > 知识库问答 >
问题:

如何将一个DropWizard(带有freemarker)视图嵌入到另一个视图中?

林星阑
2023-03-14

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

共有2个答案

阳文轩
2023-03-14

我知道该怎么做了。

您创建了一个TemplateView类(见下文),该类扩展了视图
那么所有视图类都需要扩展TemplateView

构造函数接受一个额外的参数,即“body”模板文件,它是模板内部的主体。

然后,在模板文件中,执行以下操作。

<html>
  <body>
      <h1>My template file</h1>
          <#include body>
      <footer>footer etc</footer>
  </body>
</html>

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

希望这能帮助某人。

谢清野
2023-03-14

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

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

表单视图.模板名称的计算结果必须为文本形式.ftl数字形式.ftl复杂表单.ftl 或您可能具有的任何表单视图。不需要在这些文件之间进行选择的中间文件。我认为你遇到了问题,因为表单视图.get模板名称()正在返回一个硬编码的表单View.ftl。我认为您需要的是此方法返回包含要显示的表单类型的实际模板文件的名称。

 类似资料:
  • 以下是活动2的代码:包helloworld.app; 以下是活动1的xml文件代码: 编辑:以下是来自logcat的错误消息 08-01 07:01:11.673:E/AndroidRuntime(1326):at Android.view.view$1.onclick(View.java:3578) 08-01 07:01:11.673:E/AndroidRuntime(1326):at And

  • 我使用带有Freemarker的视图来显示HTML信息页面。现在,我想为所有模板添加一个“页脚”,但我不想复制相同的代码到每个*。超光速文件。 可以创建一个页脚吗。ftl并将其添加到所有其他*。ftl文件?搜索web时,我找到了freemarker宏,但我不知道如何在DW中使用它。如何在DW中使用freemarker宏? 这没用-

  • 问题内容: 搜索后,我没有在网上或任何其他资源中找到任何东西,我想知道您是否可以通过联接另一个视图和一些其他表来形成一个视图?我猜类似的东西与Server_ref.part_notification_view是要加入的视图。 问题答案: 您当然可以在另一个视图的基础上建立一个视图: 但是您不能引用基础表中的任何内容,包括不属于视图的任何字段: 具有相同列的基础表不是问题,并且如果您在视图中包含的内

  • 问题内容: 我的一个视图需要添加一个项目以及其他功能,但是我已经有另一个视图专门添加了一个项目。 我可以做类似的事情吗? 问题答案: View函数应将呈现的HTML返回给浏览器(在中)。在视图中调用视图意味着(可能)要进行两次渲染。相反,只需将“添加”分解为不是视图的另一个函数,并让两个视图都调用它。

  • 问题内容: 我没有找到有关此问题的文章,但没有一个解决我的问题。 就像我说的那样。 ViewControllerA ViewControllerB 我试图将添加为的子视图,但是它 抛出类似“ ” 的错误。 下面是代码… ViewControllerA ViewControllerB只是一个带有标签的简单屏幕。 ViewControllerB EDIT 根据用户答案的​​建议解决方案,ViewCon

  • 我找到了一些关于这个问题的帖子,但是没有一个能解决我的问题。 说像我已经... ViewControlllerA ViewControlllerB 我试图将ViewControlllerB添加为ViewControlllerA中的子视图,但是,它抛出了一个错误,如""。 下面是代码。。。 视图控制器 ViewControllerB只是一个带有标签的简单屏幕。 视图控制器B 编辑