如何使用FreeMarker以编程方式创建JSF视图?

时间:2014-01-12 00:19:32

标签: java jsf freemarker

我正在尝试使用FreeMarker为JSF Web项目创建源代码生成器。该项目仍处于起步阶段。

生成器解析JSON字符串以创建不同的组件(pom.xml,web.xml,控制器和视图)。

到目前为止,我已经能够生成两种类型的JSF项目:

  • 一个简单的JSF项目,显示Hello,World!
  • 一个“Hello,[NAME]”JSF项目,其表单接收名称并将其重定向到另一个视图。

但我对这些观点有疑问。虽然当前的实现非常灵活(在ViewContent上使用某种类型的Decorator Pattern)并且有效,但json字符串必须包含整个页面。对于简单的页面,例如我生成的页面,没关系。但是,随着我试图生成的项目变得更加复杂,观点也将变得更加复杂。

例如,这是我对简单的“Hello World”应用程序的json字符串:

{
  "name":"simplehello",
  "pomFile": {"groupId":"br.com.revo", "artifactId":"simplehello", "description":"the simplest JSF Project", "javaVersion":"1.7"},
  "beans":[
    {"name":"Hello", "scope":"VIEW", "fields":[{"type":"String", "name":"hello", "value":"\"Hello World!\""}]}
  ],
  "views":[
    {"name":"hello", "welcomeFile":true, "content":
      {"name":"html","properties":{"xmlns":"http://www.w3.org/1999/xhtml","xmlns:h":"http://java.sun.com/jsf/html"},
       "contents":[
        {"name":"h:head","contents":[{"name":"title","value":"Simple Hello"}]},
        {"name":"h:body", "value":"#{helloBean.hello}"}
      ]}
    }
  ]
}

那么我该如何在我的json字符串上使用自定义DSL并让Generator处理视图创建呢?我一直在谷歌上搜索,这是我见过的可能性:

  1. 使用FreeMarker的<#include>插入我需要的JSF组件:

    <#if content.text>
        <#include text.ftl>
    <#elseif content.form>
        <#include form.ftl>
    // etc...
    </#if>
    
  2. 生成以编程方式设计页面的bean。

    请参阅Programmatic usage of Facelets

  3. 如何有效地使用FreeMarker创建视图?

    这是我项目的用例,类和活动图:

    Use Case Diagram Class Diagram Activity Diagram

1 个答案:

答案 0 :(得分:1)

我通过重构ViewFile来使用动作列表(ViewAction)而不是其内容来解决它。

由于我到目前为止尝试生成的项目都有标准操作(显示消息,为变量赋值,重定向到页面等),因此ViewAction有一个带有ActionType的枚举和一个带有值:

<强> ViewAction这一

public class ViewAction {
    private ActionType actionType;
    private String value;

    // getters and setters
}

<强>操作类型

public enum ActionType {
    DISPLAY,
    ASSIGN,
    BUTTON,
    LINK,
    CRUD
}

现在我可以使用FreeMarker&lt; #include&gt;指令根据ActionType。这不太灵活,但现在Parser不需要知道如何编写JSF视图,

此外,它还可以简化我的代码。我可以定义单个(或列表)Model类,而不是分离bean,视图和模型,JSFServiceFactory也相应地创建服务。现在,HelloWorld应用程序的json更简单:

{
  "name":"simplehello",
  "pomFile": {"groupId":"br.com.revo", "artifactId":"simplehello", "description":"the simplest JSF Project", "javaVersion":"1.7"},
  "models":[
    {"name":"Hello",
     "scope":"VIEW",
     "title":"Simple Hello",
     "mainPage":true,
     "fields":[{"type":"String", "name":"hello", "value":"\"Hello World!\""}],
     "actions":[{"actionType":"DISPLAY", "value":"#{helloBean.hello}"}]
    }
  ]
}