2014-01-12 52 views
0

我正在尝试为使用FreeMarker的JSF Web项目创建源代码生成器。该项目仍处于起步阶段,源代码可在https://github.com/TarekSaid/awesome/tree/master/Awesome处获得。在这个问题的最后,我也包含了一些UML图。如何使用FreeMarker以编程方式创建JSF视图?

生成器解析一个json字符串以创建不同的组件(pom.xml,web.xml,controllers和views)。

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

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

但我有意见问题。虽然当前的实现非常灵活(在ViewContent上使用某种装饰模式)并且可行,但json字符串必须包含整个页面。对于简单的页面,例如我生成的页面,没关系。但是,随着我试图产生的项目变得越来越复杂,观点也越来越复杂。

举例来说,这是JSON字符串我有一个简单的“Hello World”应用程序:

{ 
    "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并让发电机处理视图创作?我一直在使用Google周围,这是我见过的可能性:

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

    <#if content.text> 
        <#include text.ftl> 
    <#elseif content.form> 
        <#include form.ftl> 
    // etc... 
    </#if> 
    
  2. 生成一个bean是编程设计的网页。

    看到Programmatic usage of Facelets

我怎样才能有效地使用FreeMarker的创建视图?

这里的用例,为我的项目类别和活动图:

Use Case Diagram Class Diagram Activity Diagram

回答

1

我解决它通过重构的ViewFile使用的,而不是它的内容来进行操作(ViewAction这一)名单。因为到目前为止我想要生成的项目都有标准操作(显示消息,赋值给变量,重定向到页面等),ViewAction具有ActionType和String的枚举,值:

ViewAction这一

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

    // getters and setters 
} 

操作类型

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

现在我可以根据ActionType使用FreeMarker的< #include>指令。这是不太灵活,但现在解析器不需要知道如何编码JSF视图,

此外,它允许更简化我的代码。我可以定义一个(或一系列)Model类,JSFServiceFactory相应地创建服务,而不是分离bean,视图和模型。现在,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}"}] 
    } 
    ] 
}