4

我有一个程序,目前有大量我想设计掉的代码。这段代码需要一些文本文件,并通过一个有趣的解释器将其传递,以生成一个纯文本文件报告,该报告会继续发送到其他系统。从理论上讲,这允许非程序员能够修改报告,而无需了解 Java 和解释器的内部工作原理。在实践中,任何微小的更改都可能需要进入解释器并对其进行调整(并且特定领域的语言即使对其他程序员也不完全友好)。

我很想重新设计这段代码。作为一个主要的网络程序员,当想到“非程序员能够修改报告......”时,我首先想到的是用网页替换报告并对自己说“啊哈!Jsp”。这将给我一个很好的你看到的几乎是你得到的方法,以及标记库和 java scriptlet(尽管后者可能不受欢迎),而不是笨拙地编写 DSL 语句。

虽然可以使用jspc将 jsp 编译成 java(应用程序的另一部分在 jboss 服务器上运行 ejbs,所以jspc距离不太远),它使用的样板代码尝试将输出连接到来自servlet 上下文。这将涉及欺骗代码,使其认为它在 Web 容器中运行(这不是不可能的,而是 kluge),然后删除标头。

java是否有不同的模板方法(或库)可用于打印到文本文件?到目前为止,我所看到的每一个似乎都针对 Web 进行了优化,或者与特定的应用程序服务器紧密耦合(并且专为 Web 工作而设计)。

4

4 回答 4

3

试试Apache Velocity。它非常简单,并不假定它在 Web 应用程序的上下文中运行。

这完全是主观的,但我认为它的语法对于非程序员来说比 JSP 和标签库更容易理解。

于 2012-09-17T17:35:43.223 回答
3

所以你需要一个精简版的JSP。

看看这个(JSTP)是否适合你

http://jstp.sourceforge.net/manual.html

于 2012-09-17T17:53:41.273 回答
1

可能您想检查Rythm 模板引擎,它具有良好的性能(比速度快 2 到 3 倍)和优雅的语法(类似 .net Razor),并且专为 Java 程序员设计。

模板,从用户列表中生成一串用“,”分隔的用户名

@args List<User> users

@for (User user: users) {
   @user.getName() @user_sep
}

模板:if-else 演示

@args User user

@if (user.isAdmin()) {
   <div id="admin-panel">...</div>
} else {
   <div id="user-panel">...</div>
}

使用模板文件调用模板

// 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("@args User user;Hello @user.getName()", user);

使用字符串插值模式调用模板

User user = ...;
String s = Rythm.render("Hello @name", user.getName());

ToString 模式

public class Address {
   public String unitNo;
   public String streetNo;
   ...
   public String toString() {
      return Rythm.toString("@_.unitNo @_.streetNo @_.street, @_.suburb, @_.state, @_.postCode", this);
   }
}

Auto ToString 模式(遵循 apache commons lang 的 reflectToStringBuilder,但比它更快)

public class Address {
   public String unitNo;
   public String streetNo;
   ...
   public String toString() {
      return Rythm.toString(this);
   }
}

文档可以在http://www.playframework.org/modules/rythm找到。在 GAE 上运行的完整演示应用程序:http: //play-rythm-demo.appspot.com

注意,demo 和 doc 是为 Play!Framework 的 play-rythm 插件创建的,但大部分内容也适用于纯 rythm 模板引擎。

源代码:

于 2012-09-17T22:32:35.323 回答
1

如果您想成为公司中真正的踏面设计者,您可以创建一个 Grails 应用程序并使用 Groovy 模板(可能结合 Quartz 插件进行调度),如果有的话,这可能有点难卖很多现有的代码要替换,但我喜欢它......

http://groovy.codehaus.org/Groovy+Templates

如果您想要安全的赌注,那么(同样出色的)Velocity 必须是:

http://velocity.apache.org/

于 2012-09-17T19:01:00.337 回答