哪些Web框架,html模板语言,其他JSP提供编译时绑定?

时间:2013-10-20 00:30:01

标签: jsp web template-engine web-frameworks

我知道JSP符合这种描述,但我正在寻找更现代的替代品。

不幸的是,似乎大多数现代语言和框架都是动态类型的,甚至是基于Java的。

相关问题(JSP是这里唯一的答案):Are there any web frameworks for JVM with data binding checked at compilation time?

5 个答案:

答案 0 :(得分:3)

这是一个相当古老的问题,但我有一个答案,因为我已经实现了static-mustache library来提供基于胡子语法的类型安全模板引擎。

它在编译时检查语法错误和类型错误(如缺少属性)。它需要零构建配置,因为它是标准的注释处理器。

模板仍然是纯胡子模板,所有类型信息都是从用于渲染的普通Java类中提取的。

答案 1 :(得分:1)

首先,JSP在Java Enterprise Edition中的2.1版本上;换句话说,大多数语言都比较现代。

现在,如果想要获得高科技,那么如何使用java.lang.instrument在编译时自己检查所有bean的类型?扫描您的映射和(您选择的任何语言)模板,并逐个检查字段名称=等等类型。 http://docs.oracle.com/javase/7/docs/api/java/lang/instrument/package-summary.html

答案 2 :(得分:1)

我必须事先道歉,因为我不太明白这个问题,但是......我扔掉了2个模板引擎名称,我已经习惯了,也许他们会做你需要的。

Dust

Mustache

答案 3 :(得分:1)

这是一个有趣的问题。我假设对于从数据库存储和检索的数据需要静态类型检查,因为任何非数据都将在运行时而不是编译时生成。 SQL(以及大多数其他关系数据库)提供了哪些语言编写者调用静态类型检查,对存储的数据进行精细控制,因此似乎需要一个Web框架来确保存储的数据类型与检索方式之间的严格映射进入框架。

我有一些使用Hibernate和Spring的经验,Spring Web MVC用于渲染模板和将数据存储在MySQL数据库中。

hibernate的实体定义可能类似于以下内容:(有很多变体)

@Entity
@Inheritance(strategy=InheritanceType.JOINED)
@Table(name = "layoutItem", schema = "ivb")
public abstract class LayoutItem implements Serializable, DisplayItemInf {
  private static final long serialVersionUID = 1L;

  @Id
  @GeneratedValue(strategy = GenerationType.AUTO)
  @Column(name = "id")
  private long id;

  @OneToOne(cascade = CascadeType.ALL)
  @JoinColumn(name="LayoutSize")
  private LayoutSize size;

  @OneToOne(cascade = CascadeType.ALL)
  @JoinColumn(name="LayoutPosition")
  private LayoutPosition position;

  @Column(name = "display")
  private int display;

  @Column(name = "styleItem")
  private String styleItem;

  private String CSSclass = "";

  public void addClass(String CSSclass) {
    this.CSSclass = CSSclass+" ";
  }

  ...other getter and setter definitions...

}

所有字段都给出静态数据类型,然后hibernate将这些字段映射到MySql表中字段的相应类型。使用Spring的优点是它们提供了一个名为The Spring Tool Suite的Eclipse版本,每次保存文件时都会重新编译相关的类并将其重新部署到本地运行的服务器。如果在数据库的实体映射中发生任何问题,则会抛出Type错误。 Hibernate提供了许多控制类型的注释,并且与SQL提供的注释一样精细。

在框架内创建了几个不同的层,数据访问层位于堆栈的底部,业务逻辑和网站显示更高。这种更加分层的创建框架的方法意味着在执行Business逻辑之前将数据严格键入堆栈的底部,然后传递给更松散类型的MVC部分以呈现模板(例如JSP)并显示为一个网页。

我认为这种方法对你的情况是否正确需要仔细评估。与Django(也有实体,虽然没有严格映射)或Ruby On Rails(没有经验:)相比,恕我直言Spring是一个相当重量级的解决方案。可能还有其他方法可以将Hibernate用于静态类型和JSP用于模板,尽管使用STS的好处绝对是Spring的优势。 Lift使用严格类型的Scala语言并且也在JVM上运行,它没有Spring那么重,因此部署起来可能会更快。

答案 4 :(得分:0)

如果您想在JVM之外冒险,您可以使用带有Razor视图的Asp.Net MVC,您可以通过强类型视图查询所有编译时检查。作为奖励,你可以获得极好的智能感知和重构能力。