【问题标题】:Which web frameworks, html template languages, OTHER THAN JSP offer compile-time binding?除了 JSP 之外,哪些 Web 框架、html 模板语言提供编译时绑定?
【发布时间】:2013-10-20 00:30:00
【问题描述】:

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

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

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

【问题讨论】:

  • python/php/groovy 怎么样,还是只需要 java?
  • 这 3 种语言都不会在编译时为您提供静态类型绑定,因为它们是动态解释语言。还是我错过了什么?
  • 抱歉,现在重新阅读“类型化绑定”...
  • 看到“模板语言”如何尝试从视图中解耦模型......这有点违反直觉。您只是想在 IDE 中出现红色错误还是有其他原因?
  • 就是这样,你一针见血。我有一个老化的 PHP 代码库,我想重构它。拥有一个可以捕获错误的 IDE 很好。作为重构的一部分,我不介意用不同的语言重写。

标签: jsp web template-engine web-frameworks


【解决方案1】:

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

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

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

【讨论】:

  • 太棒了,3年来第一个正确答案!谢谢
  • 自发布我的问题以来的 3 年中,PHP 代码已在 Spring MVC 中使用 Thymeleaf 进行了重写。 Thymeleaf 非常好(浏览器中的无服务器测试极大地提高了 UI 实现的生产力),但缺乏编译时绑定仍然困扰着我。现在,如果有人可以创建一个静态百里香叶......那就太棒了!
【解决方案2】:

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

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

【讨论】:

  • 我可以用 PHP 做到这一点,使用内置的标记器来扫描模板以查找对数据类中未定义符号的引用。但是,这是一次重写,我想让事情变得更简单,而不是比现在更糟。编写源代码扫描器肯定比它需要的复杂。你是对的,自从我上次使用 JSP 以来,它已经发展了一些,感谢您指出这一点。
【解决方案3】:

我必须提前道歉,因为我不太明白这个问题,但是......我会扔掉我使用和喜欢的 2 个模板引擎名称,也许他们会做你需要的。

Dust

Mustache

【讨论】:

    【解决方案4】:

    这是一个有趣的问题。我假设从数据库存储和检索的数据需要静态类型检查,因为任何不是的数据都将在运行时而不是编译时生成。 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 版本,每次保存文件时,都会重新编译相关类并重新部署到本地运行的服务器上。如果在到数据库的实体映射中出现任何问题,这将引发类型错误。 Hibernate 提供了许多控制类型的注释,并且与 SQL 提供的注释一样精细。

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

    我想,这种方法是否适合您的情况需要仔细评估。恕我直言,与 Django(它也有实体,虽然没有严格映射)或 Ruby On Rails(这里没有经验 :) 相比,Spring 是一个相当重的解决方案。可能还有其他方法可以将 Hibernate 用于静态类型,将 JSP 用于模板,尽管使用 STS 的好处肯定是 Spring 的一个优点。 Lift 使用严格类型的 Scala 语言,也运行在 JVM 上,它没有 Spring 重量级,所以部署起来可能会更快。

    【讨论】:

      【解决方案5】:

      如果您想在 JVM 之外冒险,您可以使用带有 Razor 视图的 Asp.Net MVC,您可以要求的所有编译时间检查,以及强类型视图。作为奖励,您将获得出色的智能感知和重构能力。

      【讨论】:

        猜你喜欢
        • 2011-04-04
        • 1970-01-01
        • 2011-01-06
        • 2010-12-14
        • 2011-02-21
        • 1970-01-01
        • 1970-01-01
        • 2012-03-25
        • 2014-09-19
        相关资源
        最近更新 更多