JSP就像模板化简单文本一样

时间:2012-09-17 17:31:53

标签: java jsp text-files template-engine

我有一个程序,目前有大量的代码,我想设计。此代码采用许多文本文件,并通过一个有趣的书面解释器传递它,以生成一个纯文本文件报告,该报告可以转发到其他系统。在 theory 中,这允许非程序员能够修改报告,而无需理解Java和解释器的内部工作原理。在实践中,任何微小的改变都可能需要进入解释器并进行调整(并且特定于域的语言对其他程序员来说也不是很友好)。

我很乐意重新设计此代码。作为一个主要的网络程序员,当想到“非程序员能够修改报告......”时,首先想到的是我用网页替换报告并对自己说“啊哈!Jsp。”对于人们以及taglib和java scriptlet(尽管可能是后者可能不合适)而不是笨拙编写的DSL语句,这将给我一个很好的所见即所得你的方法。

虽然可以使用jspc将jsp编译成java(应用程序的另一部分在jboss服务器上运行ejbs,因此jspc并不太远),但是样板代码是它使用try来将输出连接到来自servletcontext的pagecontext。这将涉及欺骗代码,使其认为它在Web容器内运行(不是不可能,而是一个kluge),然后删除标题。

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

4 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:3)

所以你需要一个瘦下来的JSP版本。

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

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

答案 2 :(得分:1)

如果你想成为公司真正的踩踏器,你可以创建一个Grails应用程序来实现它并使用Groovy模板(可能与Quartz插件一起用于调度),它可能有点难以出售如果有很多现有的代码要替换,但我喜欢它......

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

如果你想要安全投注,那么(也是优秀的)Velocity必须是它:

http://velocity.apache.org/

答案 3 :(得分:1)

可能你想检查Rythm template engine,具有良好的性能(比速度快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);
   }
}

自动ToString模式(遵循apache commons lang的reflectionToStringBuilder,但速度比它快)

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模板引擎。

源代码: