我正在尝试使用FreeMarker为JSF Web项目创建源代码生成器。该项目仍处于起步阶段。
生成器解析JSON字符串以创建不同的组件(pom.xml,web.xml,控制器和视图)。
到目前为止,我已经能够生成两种类型的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处理视图创建呢?我一直在谷歌上搜索,这是我见过的可能性:
使用FreeMarker的<#include>
插入我需要的JSF组件:
<#if content.text>
<#include text.ftl>
<#elseif content.form>
<#include form.ftl>
// etc...
</#if>
生成以编程方式设计页面的bean。
如何有效地使用FreeMarker创建视图?
这是我项目的用例,类和活动图:
答案 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}"}]
}
]
}