Java 用于简单文本的类似JSP的模板
我有一个程序,目前有大量的代码,我想设计出来。这段代码获取大量文本文件,并将其通过一个有趣的书面解释器来生成一个纯文本文件报告,该报告将继续发送到其他系统。理论上,这允许非程序员能够修改报告,而不必了解Java和解释器的内部工作原理。在实践中,任何微小的更改都可能需要进入解释器并对其进行调整(而且特定于领域的语言甚至对其他程序员也不友好) 我想重新设计这个代码。作为一名主要的web程序员,当我想到“非程序员能够修改报告…”时,首先想到的是“非程序员能够修改报告…”,我用网页代替了报告,并对自己说:“啊哈!Jsp。”这将给我一个很好的方法,你看到的几乎是你所得到的方法,以及taglibs和java脚本(尽管后者可能不受欢迎)而不是笨拙地编写DSL语句 虽然可以使用Java 用于简单文本的类似JSP的模板,java,jsp,text-files,template-engine,Java,Jsp,Text Files,Template Engine,我有一个程序,目前有大量的代码,我想设计出来。这段代码获取大量文本文件,并将其通过一个有趣的书面解释器来生成一个纯文本文件报告,该报告将继续发送到其他系统。理论上,这允许非程序员能够修改报告,而不必了解Java和解释器的内部工作原理。在实践中,任何微小的更改都可能需要进入解释器并对其进行调整(而且特定于领域的语言甚至对其他程序员也不友好) 我想重新设计这个代码。作为一名主要的web程序员,当我想到“非程序员能够修改报告…”时,首先想到的是“非程序员能够修改报告…”,我用网页代替了报告,并对自己说
jspc
将jsp编译成java(应用程序的另一部分在jboss服务器上运行EJB,因此jspc
并不遥远),它使用的样板代码尝试将输出连接到servletcontext中的pagecontext。这将涉及诱使代码认为它在web容器中运行(不是不可能的,而是一个kluge),然后删除标题
是否有一种不同的java模板化方法(或库)可用于打印到文本文件?到目前为止,我所看到的每一种方法似乎都是针对web进行优化的,或者是紧密耦合到特定的应用程序服务器(并且是为web工作而设计的).试一试。它非常简单,并且不假设它是在web应用程序的上下文中运行的
这完全是主观的,但我认为对于非程序员来说,它的语法比JSP和标记库更容易理解。所以您需要一个精简版的JSP 看看这个(JSTP)是否适合您
如果你想在公司里成为一名真正的踏板设定者,你可以创建一个Grails应用程序来实现这一点,并使用Groovy模板(可能与Quartz插件一起用于调度),如果有很多现有代码需要替换,这可能有点难卖,但我喜欢它 如果你想安全下注,那么(同样出色的)速度必须是:
您可能想要检查,它具有良好的性能(比velocity快2到3倍)和优雅的语法(.net Razor-like),并且是专门为Java程序员设计的 模板,从用户列表中生成以“,”分隔的用户名字符串
@args List<User> users
@for (User user: users) {
@user.getName() @user_sep
}
使用字符串插值模式调用模板
// pass render args by name
Map<String, Object> renderArgs = ...
String s = Rythm.render("/path/to/my/template.txt", renderArgs);
// or pass render arguments by position
String s = Rythm.render("/path/to/my/template.txt", "arg1", 2, true, ...);
User user = ...;
String s = Rythm.render("Hello @name", user.getName());
public class Address {
public String unitNo;
public String streetNo;
...
public String toString() {
return Rythm.toString("@_.unitNo @_.streetNo @_.street, @_.suburb, @_.state, @_.postCode", this);
}
}
ToString模式
// pass render args by name
Map<String, Object> renderArgs = ...
String s = Rythm.render("/path/to/my/template.txt", renderArgs);
// or pass render arguments by position
String s = Rythm.render("/path/to/my/template.txt", "arg1", 2, true, ...);
User user = ...;
String s = Rythm.render("Hello @name", user.getName());
public class Address {
public String unitNo;
public String streetNo;
...
public String toString() {
return Rythm.toString("@_.unitNo @_.streetNo @_.street, @_.suburb, @_.state, @_.postCode", this);
}
}
自动ToString模式(遵循apache commons lang的ReflectionStringBuilder,但速度更快)
文档位于。在GAE上运行的完整演示应用程序:
请注意,演示和文档是为play!Framework的play Ryth插件创建的,但大部分内容也适用于纯Ryth模板引擎
源代码:
- Ryth模板引擎:
- 播放Rythm插件: